如何移除Redgate工具生成的createdby、updatedat等自动列?
批量移除SQL Server中所有表的指定冗余列
如果你需要批量删除所有用户表中的createdby、updatedby以及另外两个新增列,可以用动态SQL脚本一次性处理,不用手动逐个操作。
前置注意
- 务必先备份数据:删除列是不可逆操作,执行前一定要做好数据库备份,或者先在测试环境验证脚本逻辑。
- 处理关联约束:如果这些列带有默认值、外键或其他约束,必须先删除约束才能删除列,下面的脚本已经包含了自动检测并删除约束的逻辑。
批量删除列的脚本
DECLARE @columnsToDrop NVARCHAR(MAX) = N'createdby,updatedby,createddate,updateddate'; -- 替换成你实际要删除的四个列名 DECLARE @sql NVARCHAR(MAX) = N''; -- 生成删除默认约束的语句 SELECT @sql += N' IF EXISTS (SELECT 1 FROM sys.default_constraints dc JOIN sys.columns c ON dc.parent_object_id = c.object_id AND dc.parent_column_id = c.column_id JOIN sys.tables t ON c.object_id = t.object_id WHERE t.is_ms_shipped = 0 AND c.name IN (' + REPLACE(@columnsToDrop, ',', ''',''') + N')) BEGIN ' + STUFF((SELECT N' ALTER TABLE ' + QUOTENAME(SCHEMA_NAME(t.schema_id)) + N'.' + QUOTENAME(t.name) + N' DROP CONSTRAINT ' + QUOTENAME(dc.name) + N';' FROM sys.default_constraints dc JOIN sys.columns c ON dc.parent_object_id = c.object_id AND dc.parent_column_id = c.column_id JOIN sys.tables t ON c.object_id = t.object_id WHERE t.is_ms_shipped = 0 AND c.name IN (SELECT value FROM STRING_SPLIT(@columnsToDrop, ',')) FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, N'') + N' END; '; -- 生成删除列的语句 SELECT @sql += N' IF EXISTS (SELECT 1 FROM sys.columns c JOIN sys.tables t ON c.object_id = t.object_id WHERE t.is_ms_shipped = 0 AND c.name IN (' + REPLACE(@columnsToDrop, ',', ''',''') + N')) BEGIN ' + STUFF((SELECT N' ALTER TABLE ' + QUOTENAME(SCHEMA_NAME(t.schema_id)) + N'.' + QUOTENAME(t.name) + N' DROP COLUMN ' + QUOTENAME(c.name) + N';' FROM sys.columns c JOIN sys.tables t ON c.object_id = t.object_id WHERE t.is_ms_shipped = 0 AND c.name IN (SELECT value FROM STRING_SPLIT(@columnsToDrop, ',')) FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, N'') + N' END; '; -- 先打印生成的SQL(建议先检查语句是否符合预期) PRINT @sql; -- 确认无误后,取消注释下面的语句执行删除 -- EXEC sp_executesql @sql;
使用说明
- 替换
@columnsToDrop变量中的列名,确保和你要删除的四个列的实际名称完全一致。 - 先执行
PRINT @sql查看生成的语句,确认没有误操作风险后,再取消注释EXEC sp_executesql @sql执行删除。 - 如果你的SQL Server版本低于2016(无
STRING_SPLIT函数),可以把SELECT value FROM STRING_SPLIT(...)替换成手动列出的列名,比如N'createdby',N'updatedby',N'createddate',N'updateddate'。
内容的提问来源于stack exchange,提问作者Tom McDonald
相关产品推荐
相关产品推荐

