如何在SQL中根据查询返回的列表批量更新字段数据类型
操作前提
执行所有操作前请先完整备份数据库,避免误操作导致数据损失。你已经确认目标字段无有效数据,仅存在NULL值,以下方案基于该前提实现。
批量生成可空字段修改语句
你之前的写法错误点在于无法直接通过查询结果批量执行ALTER COLUMN,需要先拼接出对应每个表、每个字段的修改语句,核对后再执行。
执行以下SQL可以生成所有符合条件的可空字段的修改语句:
USE MyDatabase GO SELECT 'ALTER TABLE ' + QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) + ' ALTER COLUMN ' + QUOTENAME(COLUMN_NAME) + ' DATETIME NULL;' AS 待执行SQL FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME LIKE '%date%' AND IS_NULLABLE = 'YES' AND DATA_TYPE = 'nvarchar' AND CHARACTER_MAXIMUM_LENGTH = 255
执行后会返回所有需要执行的ALTER语句,你可以逐一核对表名、字段名是否符合预期,确认无误后,把所有生成的SQL语句复制出来单独执行即可完成批量修改。
可选:提前清空字段值
如果担心字段中存在不符合datetime格式的字符串导致转换失败,可以先批量生成清空字段的语句,执行清空后再修改类型:
USE MyDatabase GO SELECT 'UPDATE ' + QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) + ' SET ' + QUOTENAME(COLUMN_NAME) + ' = NULL;' AS 清空SQL FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME LIKE '%date%' AND IS_NULLABLE = 'YES' AND DATA_TYPE = 'nvarchar' AND CHARACTER_MAXIMUM_LENGTH = 255
非空字段处理
你提到仅存在3个非空属性的目标字段,可手动处理:
- 先将字段改为可空属性
- 执行类型修改为DATETIME
- 按需重新设置为非空属性即可
内容的提问来源于stack exchange,提问作者Erol
相关产品推荐
相关产品推荐

