MSSQL脚本:对齐Angebotpos_test与produktion_test的同名列nvarchar长度
MSSQL 跨表同名字段nvarchar长度自动对齐脚本
核心处理规则
- 以
produktion_test表的nvarchar字段长度为统一基准 - 自动遍历系统元数据匹配两张表的同名字段,无需手动枚举字段清单
- 仅筛选数据类型为nvarchar的匹配字段,排除其他数据类型的干扰
- 只处理
Angebotpos_test中长度小于基准表对应列的字段,长度相等或更长的字段不做改动 - 自动保留目标列原有的NULL/NOT NULL属性,避免修改长度时打乱原有字段约束
可直接执行的自动调整脚本
-- 定义基准表和待调整表的名称 DECLARE @BaselineTable SYSNAME = 'produktion_test' DECLARE @TargetTable SYSNAME = 'Angebotpos_test' DECLARE @GeneratedSQL NVARCHAR(MAX) = N''; -- 拼接所有需要执行的字段调整语句 SELECT @GeneratedSQL = @GeneratedSQL + N' ALTER TABLE [' + @TargetTable + N'] ALTER COLUMN [' + c_target.name + N'] NVARCHAR(' + -- 把系统存储的字节长度转换为实际字符长度,兼容nvarchar(max)场景 CASE WHEN c_source.max_length = -1 THEN N'MAX' ELSE CAST(c_source.max_length / 2 AS NVARCHAR(10)) END + N') ' + -- 继承目标列原有的空值约束 CASE WHEN c_target.is_nullable = 1 THEN N'NULL' ELSE N'NOT NULL' END + N'; ' FROM sys.columns c_source INNER JOIN sys.tables t_source ON c_source.object_id = t_source.object_id AND t_source.name = @BaselineTable INNER JOIN sys.types st_source ON c_source.system_type_id = st_source.system_type_id AND st_source.name = 'nvarchar' -- 仅匹配基准表的nvarchar类型列 INNER JOIN sys.columns c_target ON c_source.name = c_target.name -- 匹配同名列 INNER JOIN sys.tables t_target ON c_target.object_id = t_target.object_id AND t_target.name = @TargetTable INNER JOIN sys.types st_target ON c_target.system_type_id = st_target.system_type_id AND st_target.name = 'nvarchar' -- 仅匹配目标表的nvarchar类型列 -- 核心筛选条件:目标列长度 < 基准列长度 WHERE c_target.max_length < c_source.max_length; -- 正式执行前先开启打印检查生成的SQL,避免误操作 PRINT @GeneratedSQL; -- 核对无误后取消下方语句的注释即可执行调整 -- EXEC sp_executesql @GeneratedSQL;
操作注意事项
- 首次运行务必先通过
PRINT语句查看所有生成的调整SQL,确认匹配的字段、长度完全符合预期后,再注释掉PRINT行、打开EXEC语句执行修改 - 如果两张表分属不同schema,需要在表关联条件中补充对
sys.schemas的匹配,避免不同schema下的同名表被错误关联 - 执行字段长度调整前建议备份目标表的元数据信息,出现异常可快速回滚配置
内容的提问来源于stack exchange,提问作者maxfido
相关产品推荐
相关产品推荐

