適切な構文は、次のようなものになります。
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
ストアドプロシージャを使用して、それが各データベースで実行するように期待しますか唯一のデータベースに存在する場合?ストアドプロシージャ自体が 'Database Name'のパラメータを取る場合を除きます。 –