我想在服务器上查询没有3条具有特定ID的记录的所有数据库名称。并非服务器上的所有数据库都具有相同的结构,但大多数数据库都会。
我需要这些名称来了解运行更新脚本的数据库。
谢谢。
修改
表ACTIONS
中应该有3条记录,其中“ID”等于9,10和11.如果所有3都不存在,我需要名称来运行更新脚本。
我尝试使用sys.databases
和sys.tables
,但我不确定如何加入表并检查三条记录。
答案 0 :(得分:1)
你需要动态SQL。
以下脚本将在所有具有ID
表的 online 用户数据库中找到没有ACTIONS
值的表,并为任何{{执行插入操作1}}尚不存在的值。
(我在这里假设它在ID
模式中,并且除了dbo
之外的任何模式中都不存在名为ACTIONS
的表。)
dbo
这只是打印命令,由于Management Studio中的限制,它只会打印8K,所以如果你有很多数据库并且命令被截断,请不要惊慌。如果您满意,它会按照您的意愿行事,对DECLARE @sql NVARCHAR(MAX) = N'';
SELECT @sql += N'
IF EXISTS (SELECT 1 FROM ' + QUOTENAME(name)
+ '.sys.tables WHERE name = N''ACTIONS'')
EXEC sp_executesql N''IF NOT EXISTS (SELECT 1 FROM ' + QUOTENAME(name)
+ '.dbo.ACTIONS WHERE ID = 9) INSERT ' + QUOTENAME(name)
+ '.dbo.ACTIONS(ID /* ..., other cols ... */)
SELECT 9 /* ..., other cols ... */;'';
IF EXISTS (SELECT 1 FROM ' + QUOTENAME(name)
+ '.sys.tables WHERE name = N''ACTIONS'')
EXEC sp_executesql N''IF NOT EXISTS (SELECT 1 FROM ' + QUOTENAME(name)
+ '.dbo.ACTIONS WHERE ID = 10) INSERT ' + QUOTENAME(name)
+ '.dbo.ACTIONS(ID /* ..., other cols ... */)
SELECT 10 /* ..., other cols ... */;'';
IF EXISTS (SELECT 1 FROM ' + QUOTENAME(name)
+ '.sys.tables WHERE name = N''ACTIONS'')
EXEC sp_executesql N''IF NOT EXISTS (SELECT 1 FROM ' + QUOTENAME(name)
+ '.dbo.ACTIONS WHERE ID = 11) INSERT ' + QUOTENAME(name)
+ '.dbo.ACTIONS(ID /* ..., other cols ... */)
SELECT 11 /* ..., other cols ... */;'';'
FROM sys.databases WHERE state = 0 AND database_id > 4;
PRINT @sql
-- EXEC sp_executesql @sql;
发表评论并取消注释最后的PRINT
。
您必须填写其他部分(例如,我认为EXEC
不是唯一的列 - 因此请将ID
替换为/* ..., other cols ... */
所需的任何常量值。你需要在任何字符串文字上使用双倍分隔符,因此其中一个命令可能最终看起来像这样:
ID = 9, 10, 11
答案 1 :(得分:0)
感谢Aaron Bertrand的帮助。我不得不修改SQL以仅选择数据库名称并查找具有特定preifx的数据库。
SELECT @sql += N'
IF EXISTS (SELECT 1 FROM ' + QUOTENAME(name) + '.sys.tables WHERE name = N''Action'')
BEGIN
EXEC sp_executesql N''IF NOT EXISTS (SELECT 1 FROM ' + QUOTENAME(name) + '.dbo.Action WHERE Id = 9 OR ID = 10 OR ID = 11)
PRINT ''''' + QUOTENAME(name) + ''''' ''
END'
FROM sys.databases WHERE state = 0 AND database_id > 4 and name LIKE 'AAA%';
--PRINT @sql
EXEC sp_executesql @sql;