2016-05-31 44 views
0

我想运行此过程,以便从另一个数据库中的多个表中选择一堆结果,并将所有内容放入一个临时表中。我只能用这一个存储过程,不能把它变成另一个数据库SQL Server:执行存储过程的一部分在一个数据库对所有其他数据库

我在这里用这个尝试,但它没有工作,给我的错误

“必须声明标量变量“@lcsqlcmd””。 @lcsqlcmd

我已经声明,但有任何帮助?

EXEC master..sp_MSforeachdb 

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

如果存储过程只存在于一个数据库你怎么能指望它在每个数据库上运行?除非存储过程本身为“数据库名称”使用参数? –

回答

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 
相关问题