2017-08-21 10 views
1

多くのデータベースで以下のクエリを実行する必要があります.100以上のデータベースがありますが、各データベースをプルアップしてクエリを1つずつ実行したくありません。SQLすべてのデータベースを照会

UserテーブルはDatabase#_Accountにのみリストされています。

Database#_AdminUserテーブルがないため、クエリが実行されるとエラーが発生します。

(例データベースのリスト)

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

だけ動のクエリ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

問題は、選択したデータベースでのみクエリを実行していることです。私はディナミクスのクエリを見てきましたが、Select Databaseの検索については何も言いません。 –

答えて

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

メッセージ:コマンドは正常に完了しましたが、どのデータベースでその結果が得られなかったか、そのデータベースのJohnが表示されていませんでした。 –

+0

@ JohnWilliams 1つのデータベースのデータを返すべきであることがわかっているクエリを実行していますか?そのデータベースに対してそのクエリを実行してみてください。あなたのUserテーブルはdboスキーマにありますか、それとも何か他のものを使用していますか? –

関連する問題