You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何移除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;

使用说明

  1. 替换@columnsToDrop变量中的列名,确保和你要删除的四个列的实际名称完全一致。
  2. 先执行PRINT @sql查看生成的语句,确认没有误操作风险后,再取消注释EXEC sp_executesql @sql执行删除。
  3. 如果你的SQL Server版本低于2016(无STRING_SPLIT函数),可以把SELECT value FROM STRING_SPLIT(...)替换成手动列出的列名,比如N'createdby',N'updatedby',N'createddate',N'updateddate'。

内容的提问来源于stack exchange,提问作者Tom McDonald

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 10:55:23