2016-05-31 1 views
0

他のデータベースの複数のテーブルから多数の結果を選択し、すべてを1つの一時テーブルに格納するためにこのプロシージャを実行しようとしています。スカラー変数を宣言する必要があり、私は」SQL Server:他のすべてのデータベースに対して1つのデータベースにあるストアドプロシージャの一部を実行します。

を私はここにこれを使用してみましたが、それはうまくいきませんでしたし、私にエラーを与えただけで、この1つのストアドプロシージャを使用することができますし、別のデータベース

にそれを置くことができません"@ lcsqlcmd" '。 @lcsqlcmd

私は既に助けを宣言しましたか?

EXEC master..sp_MSforeachdb 

IF DB_ID(''?'') > 4 
BEGIN 
    INSERT INTO #TempTable 
     EXECUTE (@lcsqlcmd) 
END 
+0

ストアドプロシージャを使用して、それが各データベースで実行するように期待しますか唯一のデータベースに存在する場合?ストアドプロシージャ自体が 'Database Name'のパラメータを取る場合を除きます。 –

答えて

0

最も簡単な方法は、各データベースで実行する実際のT-SQL文字列を作成して実行することです。他のデータベースには、実行しようとしているストアドプロシージャの知識がありません。

0

適切な構文は、次のようなものになります。

CREATE TABLE #TempTable([DBID] INT, DBName SYSNAME) 
DECLARE @ForEachCommand VARCHAR(MAX), @lcsqlcmd VARCHAR(MAX) 
SET @lcsqlcmd = 'USE [?]; SELECT DB_ID() AS [DBID], DB_NAME(DB_ID()) AS DBName' 
SET @ForEachCommand = 
'IF DB_ID(''?'') > 4 
BEGIN 

      insert into #TempTable 
      EXEC sp_executesql N''' + @lcsqlcmd + ''' 
end' 
print @ForEachCommand 
EXECUTE master.sys.sp_MSforeachdb @ForEachCommand 
SELECT * FROM #TempTable 

参照:http://weblogs.sqlteam.com/joew/archive/2008/08/27/60700.aspx

注:は、一般的には文書化されていない手順の周りにあなたのコードをビルドするのは良い考えではありません。

文書化されていない手順を使用していないコードは以下の通りです:

SELECT database_id, name AS DBName 
INTO #Databases 
FROM sys.databases WHERE database_id > 4 

CREATE TABLE #TempTable([DBID] INT, DBName SYSNAME) 

DECLARE @lcsqlcmd NVARCHAR(MAX), @Command NVARCHAR(MAX) 
SET @lcsqlcmd = 'USE [?]; SELECT DB_ID() AS [DBID], DB_NAME(DB_ID()) AS DBName' 

DECLARE @DBName SYSNAME 
SET @DBName = (SELECT TOP 1 DBName FROM #Databases ORDER BY DBName) 

WHILE NOT @DBName IS NULL 
BEGIN 
    SET @Command = REPLACE(@lcsqlcmd, '?', @DBName) 

    insert into #TempTable 
    EXEC sp_executesql @Command 

    SET @DBName = (SELECT TOP 1 DBName FROM #Databases WHERE DBName > @DBName ORDER BY DBName) 
END 

SELECT * FROM #TempTable 
DROP TABLE #Databases 
関連する問題