2017-08-21 87 views
1

我需要在许多数据库上运行以下查询,我有超过100多个数据库,但我不想拉起每个数据库并一次运行一个查询。SQL查询所有数据库

用户表仅在Database#_Account中列出。

如果查询运行错误,因为Database#_Admin没有User表。

(示例数据库列表)

Database: 
--------------------- 
MASTER 
Model 
msdb 
tempdb 
Database1_Account 
Database1_Admin 
Database2_Account 
Database2_Admin 
Database3_Account 
Database3_Admin 

查询:

EXEC sp_MsForEachDb @command1 = SELECT "?" as DatabaseName, * 
           FROM ?.User 
           WHERE Name = "John" AND "?" LIKE "%_Account" 
+0

只是建立一个DINAMIC查询https://www.mssqltips.com/sqlservertip/1160/execute-dynamic-sql-commands-in-sql -server/ –

+0

另外你首先需要检查表是否存在。 https://stackoverflow.com/questions/167576/check-if-table-exists-in-sql-server –

+0

我遇到的问题是只在选定的数据库上运行查询。我查看了动态查询,但没有提到有关搜索选择数据库的任何信息。 –

回答

2

ms_foreachDb仍是一个未公开的函数,它受到随时更改。我会用一个光标来做这样的事情。

这里是一个工作模板,让你开始:

DECLARE @tsql nvarchar(max) 
DECLARE @dbname varchar(500) 

DECLARE MyCur CURSOR STATIC FORWARD_ONLY FOR 
    SELECT [name] 
    FROM sys.databases 
    WHERE [name] NOT IN ('tempdb') 

OPEN MyCur 

WHILE (1=1) 
BEGIN 
    FETCH NEXT FROM MyCur INTO @dbname 

    IF @@FETCH_STATUS <> 0 
     BREAK 

    SET @tsql = 'use ' + @dbname + ' SELECT * FROM sys.tables' 
    EXEC sp_executesql @tsql 
END 

CLOSE MyCur; 
DEALLOCATE MyCur;  
+0

这工作就像我想要的。 –

0
  1. 你需要通过命令作为一个nvarchar的文字,而不是作为一个查询。
  2. 您需要使用正确的术语。您已经遗漏了模式名称。它是Database.Schema.Table,而不是Database.Table。我假设所有的表都使用默认的dbo模式。
  3. 编写查询以测试执行前表是否存在。最简单的方法是使用IF OBJECT_ID(N'TableName') IS NOT NULL
  4. 避免双引号。它们通常是像方括号这样的字段标识符,所以它们在用于varchar文字时可能不明确。

尝试:

EXEC sp_MsForEachDb @command1 = N'IF OBJECT_ID(N''?.dbo.User'') IS NOT NULL SELECT ''?'' as DatabaseName, * FROM ?.dbo.User WHERE Name = ''John'' AND ''?'' LIKE ''%_Account''' 
+0

消息:命令(s)成功完成,但没有给我什么数据库的结果或显示我约翰在该数据库被发现。 –

+0

@JohnWilliams您是否正在运行一个查询,您知道应该为一个数据库返回数据?尝试针对该数据库运行该查询。您的用户表是在dbo架构中,还是使用其他的? –