在你的情况下适当的语法会是这样的。
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
如果存储过程只存在于一个数据库你怎么能指望它在每个数据库上运行?除非存储过程本身为“数据库名称”使用参数? –