SQL查询所有数据库

时间:2017-08-21 18:37:07

标签: sql

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

用户表仅列在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"

3 个答案:

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

答案 1 :(得分:0)

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

    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'''
    

答案 2 :(得分:0)

Here's the query我用来做一个while循环来迭代数据库。

只需将您的代码放在“PUT CODE HERE”的位置。

SET NOCOUNT ON

DECLARE @Database TABLE (DbName SYSNAME)
DECLARE @DbName AS SYSNAME

SET @DbName = ''

INSERT INTO @Database (DbName)
SELECT NAME
FROM master.dbo.sysdatabases
WHERE NAME <> 'tempdb'
ORDER BY NAME ASC

WHILE @DbName IS NOT NULL
BEGIN
    SET @DbName = (
            SELECT MIN(DbName)
            FROM @Database
            WHERE DbName > @DbName
            )

    /*
    PUT CODE HERE
    EXAMPLE PRINT Database Name
    */
    PRINT @DbName
END

要创建符合特定条件的用户列表,您可以修改this script