2016-05-31 1 views
0

Ich versuche, diese Prozedur auszuführen, um eine Reihe von Ergebnissen aus mehreren Tabellen in anderen Datenbanken auszuwählen und alles in eine temporäre Tabelle zu setzen. Ich kann nur diese eine gespeicherte Prozedur verwenden und kann nicht in eine andere Datenbank setzenSQL Server: Ausführen von Teil einer gespeicherten Prozedur, die in einer Datenbank für alle anderen Datenbanken ist

ich dies hier versucht, mit, aber es funktionierte nicht und gab mir den Fehler

‚Muss die skalare Variable deklarieren "@lcsqlcmd" '. @lcsqlcmd

Ich erklärte bereits, obwohl jede Hilfe?

+0

Wenn die gespeicherte Prozedur nur in einer Datenbank vorhanden ist, wie wollen Sie es in jeder Datenbank laufen? es sei denn, die gespeicherte Prozedur selbst nimmt einen Parameter für den 'Datenbanknamen' an? –

Antwort

0

Der einfachste Weg ist, die tatsächliche T-SQL-Zeichenfolge, die Sie auf jeder Datenbank ausführen möchten, zu erstellen und auszuführen. Die anderen Datenbanken haben keine Kenntnis von der gespeicherten Prozedur, die Sie ausführen möchten.

0

Die richtige Syntax in Ihrem Fall wäre etwa so.

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 

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

Hinweis: im Allgemeinen ist es keine gute Idee, Ihren Code um undokumentierte Verfahren zu bauen.

Der Code, der nicht ohne Papiere Verfahren nicht verwendet unter:

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 
Verwandte Themen