如果列不存在,则向数据库中的所有表添加列

Tra*_*mer 8 sql-server audit

我必须在具有许多(50 多个)表的数据库中实施审计。我希望将用户名和用户将记录更改为所有表的列的时间。但是,有些表已经有了这些列,所以我不需要将这些列添加到所有表中。假设列名是DateTime_Tableand UserName_Table,如果列不存在,我如何向数据库中的所有表添加DateTime_Table columnUserName_Table列?

我看到了 Postgres 的这个循环,但我需要 SQL Server 的帮助。

Joe*_*ish 15

如果您只有大约 50 个表,我个人不会打扰使用游标的解决方案。您可以编写一个查看 SQL Server 对象目录视图的 SQL 查询,以生成您需要运行以添加列的 SQL 代码。一个不错的好处是您可以在运行之前轻松查看代码。我认为以下查询将接近您对该DateTime_Table列的需求:

SELECT 'ALTER TABLE ' + QUOTENAME(ss.name) + '.' + QUOTENAME(st.name) + ' ADD [DateTime_Table] DATETIME NULL;'
FROM sys.tables st
INNER JOIN sys.schemas ss on st.[schema_id] = ss.[schema_id]
WHERE st.is_ms_shipped = 0
AND NOT EXISTS (
    SELECT 1
    FROM sys.columns sc
    WHERE sc.[object_id] = st.[object_id]
    AND sc.name = 'DateTime_Table'
);
Run Code Online (Sandbox Code Playgroud)

我曾经QUOTENAME避免在表或模式名称中出现特殊字符的问题。一旦您测试了生成的代码并确信它是正确的,您就可以简单地将 SSMS 查询结果复制并粘贴到另一个查询窗口中并运行它们。

如果您需要更自动化的方法或需要处理更多对象,您可以使用游标查找并循环遍历每个缺少列的表,并使用EXEC执行动态 SQL 以添加列。