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
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? –