选择表'X'中不存在记录的DB名称

时间:2013-12-06 16:11:35

标签: sql-server tsql sql-server-2012

我想在服务器上查询没有3条具有特定ID的记录的所有数据库名称。并非服务器上的所有数据库都具有相同的结构,但大多数数据库都会。

我需要这些名称来了解运行更新脚本的数据库。

谢谢。

修改

ACTIONS中应该有3条记录,其中“ID”等于9,10和11.如果所有3都不存在,我需要名称来运行更新脚本。

我尝试使用sys.databasessys.tables,但我不确定如何加入表并检查三条记录。

2 个答案:

答案 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;