当前位置: 首页 > news >正文

【sqlserver】修改nvarchar类型为varchar脚本

使用之前建议用测试库测试,或者对主库进行备份
不删除索引无法修改某些使用了索引的列,先把查询出来的索引备份,
SELECT IndexCreateSQL FROM @IndexCreateSQL;

USE xxx_database;
GO-- 声明变量
DECLARE @sql NVARCHAR(MAX) = N'';
DECLARE @alter_sql NVARCHAR(MAX);
DECLARE @IndexDropSQL TABLE (IndexDropSQL NVARCHAR(MAX));
DECLARE @IndexCreateSQL TABLE (IndexCreateSQL NVARCHAR(MAX));
DECLARE @AlterSQL TABLE (AlterSQL NVARCHAR(MAX));-- 查找所有表的 nvarchar 类型字段,排除主键字段、唯一约束字段和系统表
INSERT INTO @AlterSQL (AlterSQL)
SELECT 'ALTER TABLE ' + QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) + ' ALTER COLUMN ' + QUOTENAME(COLUMN_NAME) + CASE WHEN CHARACTER_MAXIMUM_LENGTH = -1 THEN ' TEXT'ELSE ' VARCHAR(' + CAST(CHARACTER_MAXIMUM_LENGTH * 2 AS NVARCHAR(10)) + ')'END + ';'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE DATA_TYPE = 'nvarchar' AND CHARACTER_MAXIMUM_LENGTH IS NOT NULLAND COLUMN_NAME NOT IN (-- 排除主键字段SELECT c.name FROM sys.tables tINNER JOIN sys.indexes i ON t.object_id = i.object_idINNER JOIN sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_idINNER JOIN sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_idWHERE i.is_primary_key = 1)AND COLUMN_NAME NOT IN (-- 排除唯一约束字段SELECT c.name FROM sys.tables tINNER JOIN sys.indexes i ON t.object_id = i.object_idINNER JOIN sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_idINNER JOIN sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_idWHERE i.is_unique = 1 OR i.is_unique_constraint = 1)AND TABLE_SCHEMA != 'sys' -- 排除系统表AND COLUMN_NAME not in('PatientId','Founder','PatientNo','Modifier','GroupId');-- 查找每个表的所有非主键、非唯一约束索引并生成删除和重新创建的SQL语句
INSERT INTO @IndexDropSQL (IndexDropSQL)
SELECT'DROP INDEX ' + QUOTENAME(i.name) + ' ON ' + QUOTENAME(OBJECT_SCHEMA_NAME(i.object_id)) + '.' + QUOTENAME(OBJECT_NAME(i.object_id)) + ';'
FROM sys.indexes i
INNER JOIN sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id
INNER JOIN sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id
WHERE i.is_primary_key = 0 -- 排除主键索引AND i.is_unique = 0 -- 排除唯一索引AND i.is_unique_constraint = 0 -- 排除唯一约束AND OBJECT_SCHEMA_NAME(i.object_id) != 'sys'; -- 排除系统表INSERT INTO @IndexCreateSQL (IndexCreateSQL)
SELECT'CREATE INDEX ' + QUOTENAME(i.name) + ' ON ' + QUOTENAME(OBJECT_SCHEMA_NAME(i.object_id)) + '.' + QUOTENAME(OBJECT_NAME(i.object_id)) + '(' + STUFF((SELECT ', ' + QUOTENAME(c.name)FROM sys.index_columns ic2INNER JOIN sys.columns c2 ON ic2.object_id = c2.object_id AND ic2.column_id = c2.column_idWHERE ic2.object_id = i.object_id AND ic2.index_id = i.index_idORDER BY ic2.index_column_idFOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, '') + ');'
FROM sys.indexes i
INNER JOIN sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id
INNER JOIN sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id
WHERE i.is_primary_key = 0 -- 排除主键索引AND i.is_unique = 0 -- 排除唯一索引AND i.is_unique_constraint = 0 -- 排除唯一约束AND OBJECT_SCHEMA_NAME(i.object_id) != 'sys'; -- 排除系统表-- 输出删除索引的SQL语句
SELECT  IndexDropSQL FROM @IndexDropSQL;-- 输出创建索引的SQL语句
SELECT  IndexCreateSQL FROM @IndexCreateSQL;--输出修改列的SQL语句
SELECT AlterSQL  FROM @AlterSQL;-- 执行修改列的SQL语句
WHILE EXISTS (SELECT 1 FROM @AlterSQL)
BEGINSELECT TOP 1 @alter_sql = AlterSQL FROM @AlterSQL;PRINT '执行修改列的SQL语句:' + @alter_sql;EXEC(@alter_sql);DELETE TOP (1) FROM @AlterSQL;
END

相关文章:

  • 神经光子渲染:物理级真实感图像生成——从麦克斯韦方程到深度学习
  • C# 西门子通信
  • 敦普水性低温烤漆的进击
  • NO.94十六届蓝桥杯备战|图论基础-单源最短路|常规dijkstra|堆优化dijkstra|bellman-ford|spfa(C++)
  • JavaSE学习(前端初体验)
  • 界面控件DevExpress WPF v25.1新功能预览 - 文档处理类功能升级
  • Linux 软件管理
  • 简单实现单点登录
  • rust编程学习(二):复合数据类型
  • 【正点原子STM32MP257连载】第四章 ATK-DLMP257B功能测试——板载蓝牙测试 #RTL8733BU
  • 计算方法在单细胞数据分析中的应用及AI拓展
  • Flutter项目之设置页
  • 基于PyTorch实现的Diffusion模型:从MNIST图像中学习生成能力
  • MyBatis 如何使用
  • Navicat导入JSON数据到MySQL表
  • 安卓环境搭建开发工具下载Gradle下载
  • git在分支上会退到某个指定的commit
  • 在边缘端进行tensorflow模型的部署(小白初探)
  • 今日算法题
  • 安装 MySQL8.0.17
  • 上市公司网站建设要求/百度关键词搜索技巧
  • wordpress搭建网站有什么好外/云优化seo软件
  • 高端网站建设收费为何比较贵/外贸公司一般怎么找客户
  • 贵阳网站建设公司排行/网店运营工作内容
  • 郑州建站系统在线咨询/代做seo排名
  • 卖域名的网站要怎么做/百度投诉中心24人工客服