2016-09-05 18 views
1

私の投稿はこのフォーラムの他のものと非常によく似ていますが、私は本当に必要な答えを見つけることができませんでした。複数のデータベースでSQLクエリを実行する

私の問題は、SQL ServerがWindows Server上で動作していることです。私のSQL Serverの中には、約30のデータベースがあります。それらのすべてには同じテーブルと同じストアドプロシージャがあります。

ここで問題は、私はこれらのすべてのデータベースで実行する必要があるこの巨大なスクリプトを持っています。私はすべてのデータベースに対してこれを一度だけやりたいと思っています。

「ビュー」>>登録サーバー>>ローカルサーバーグループ>>新しいサーバー登録のようないくつか試しました。しかし、このソリューションは、多くのデータベースではなく、多くのサーバー用です。

私はデータベース名を入力することでそれを行うことができますが、クエリは本当に巨大であるため、すべてのデータベースで実行するには時間がかかります。

これが可能なら誰でも考えられますか?

+1

異なるデータベースに対してクエリを実行するのに必要な時間を短縮することはできません。これは[DBAに投稿された質問の複製](http://dba.stackexchange.com/questions/907/how-to-execute-sql-against-all-dbs-on-a-server)と思われます。助けてください:-) –

+0

なぜデータベース名の入力はすべてのデータベースで実行するのに時間がかかりますか? – GuidoG

+0

EXEC sp_MSforeachdb @stored_procedureを使用できます。 、 –

答えて

4

ApexSQL Propagateはこの状況で役立つツールです。これは、複数のデータベース、さらには複数のサーバー上の単一または複数のスクリプトを実行するために使用されます。

select databases

は、スクリプトおよびデータベースをロードすると、あなただけの「実行」ボタンをクリックして、待つ必要があります:あなたがすべきことは、あなたがそのスクリプトを実行したいそれに対してすべてのデータベースを選択し、そのスクリプトを選択するだけです結果:

click the execute button

1

これは、これを行うための通常の方法である:

はそれがであるよりは、データベース・DBOther上の選択をしたいとしますテーブルまたはビューがオンになっている場合

select * from DBOther..TableName 

もチェックdboスキーマでは、あなたはまた、スキーマを追加する必要がない場合:私は今、データベース名

select * from DBOther.dbo.ViewName 

もし後1ドットのみを使用して注意してくださいデータベースがLinked Serverに存在することを確認するよりも、別のマシンの別のサーバー上にあることを確認してください。
そして、あなたが使ってそのデータベース上のテーブルやビューにアクセスすることができます。これはのみ動作すること

use DB1 
go 

select * from table1 
go 

use DB2 
go 

select * from table1 
go 

注:ここでは

SELECT * FROM [AnotherServerName].[DB].[dbo].[Table] 

は、データベース名を入力する必要がない別の方法であります各データベースでテーブルとフィールドが完全に同じ場合

2

このスクリプトは次のように記述できます

DECLARE CURSOR_ALLDB_NAMES CURSOR FOR 
SELECT name 
FROM Sys.Databases 
WHERE name NOT IN('master', 'tempdb') 

OPEN CURSOR_ALLDB_NAMES 

FETCH CURSOR_ALLDB_NAMES INTO @DB_NAME 

WHILE @@Fetch_Status = 0 
BEGIN 
    EXEC('UPDATE '+ @DB_NAME + '..SameTableNameAllDb SET Status=1') 
    FETCH CURSOR_ALLDB_NAMESINTO INTO @DB_NAME 
END 

CLOSE CURSOR_ALLDB_NAMES 
3

SSMS(クエリ - SQLCMDモード)からSQLCMD Modeでスクリプトを実行することを検討してください。こうすることで、スクリプトをファイルに保存して、それぞれの目的のデータベースのコンテキストで簡単に実行できます。

USE DB1; 
:r C:\SqlScript\YourLargeScript.sql 
GO 
USE DB2; 
:r C:\SqlScript\YourLargeScript.sql 
GO 
USE DB3; 
:r C:\SqlScript\YourLargeScript.sql 
GO 
+0

Dan Guzman、私のファイルは約45000行のコードを持っているので、あなたの提案はそれを行うための最良の方法だと思います。私はそれを試してみると私は皆に知らせる!ありがとうございました –

0

Danの回答が私の問題を解決しました! SQL Server Managementの[クエリ]タブでSQLCMDモードを有効にする必要がありました。また、ファイルのパスにスペースを含めることはできません。 私はあなたの助けに感謝します!

+0

あなたのコメントをコメントしています。これは単なる答えではありません。 – Oliver

+0

ちょっと@Oliver、申し訳ありませんが、私はあなたがしたいことを理解していませんでした。あなたは私の答えを削除して誰かの答えのコメントとして投稿したいのですが、そうですか? –

+0

はい、@Arthur、それは私が示唆しているものです:-) – Oliver

関連する問題