游标中的多个值,用于执行存储过程

时间:2014-02-25 16:43:41

标签: sql sql-server cursor

我有一个执行存储过程的游标。我在游标中引入了一个新的变量dbname,并在dbname附近出现异常错误。引入了此更改,以便存储过程storedProc_getOutputsByRuncan在不同的数据库上执行。

exec( '
DECLARE @dbName nvarchar(100)
DECLARE @runID INT
DECLARE @getRunDetails CURSOR
DECLARE @delayLoad bigint
SET @delayLoad = 1
SET @getRunDetails = CURSOR FOR
SELECT DBName, RunID from ' + @temp_table_runID + '
OPEN @getRunDetails
FETCH NEXT
FROM @getRunDetails INTO @dbName, @runID
WHILE @@FETCH_STATUS = 0
BEGIN
-- I have tried at this point printing @runid and @dbname and it prints fine.Error in line below
INSERT INTO ' + @temp_table_outputs + ' Execute ''@dbname''.dbo.storedProc_getOutputsByRun        
@runID, @delayLoad
FETCH NEXT
FROM @getRunDetails INTO @dbName, @runID
END
CLOSE @getRunDetails
DEALLOCATE @getRunDetails')

1 个答案:

答案 0 :(得分:0)

如果您要将所有这些包装在自己的变量中并打印出来,那么这一行

'INSERT INTO ' + @temp_table_outputs + ' Execute ''@dbname''.dbo.storedProc_getOutputsByRun'

会产生这样的结果:

INSERT INTO myTable Execute '@dbname'.dbo.storedProc_getOutputsByRun

问题是你没有正确地转义字符串以用实际值替换@dbname。

修复方法是在主字符串中嵌套另一个字符串,并执行该字符串。

这样的内容主要字符串:

declare @sql nvarchar(max)
set @sql = ''INSERT INTO ' + @temp_table_outputs + ' Execute ''+@dbname+''.dbo.storedProc_getOutputsByRun ''+cast(@runID as varchar)+'', ''+cast(@delayLoad as varchar)+''''
print @sql
exec(@sql)

哪会产生类似于此的最终产品......

exec( '
DECLARE @dbName nvarchar(100)
DECLARE @runID INT
DECLARE @getRunDetails CURSOR
DECLARE @delayLoad bigint
SET @delayLoad = 1
SET @getRunDetails = CURSOR FOR
SELECT DBName, RunID from ' + @temp_table_runID + '
OPEN @getRunDetails
FETCH NEXT
FROM @getRunDetails INTO @dbName, @runID
WHILE @@FETCH_STATUS = 0
BEGIN
    declare @sql nvarchar(max)
    set @sql = ''INSERT INTO ' + @temp_table_outputs + ' Execute ''+@dbname+''.dbo.storedProc_getOutputsByRun ''+cast(@runID as varchar)+'', ''+cast(@delayLoad as varchar)+''''
    print @sql
    --exec(@sql)  


    FETCH NEXT
    FROM @getRunDetails INTO @dbName, @runID
END
CLOSE @getRunDetails
DEALLOCATE @getRunDetails')

您可能需要稍微调整一下,但现在这很简单,只需在新代码中注释掉EXEC(@SQL),然后将其打印到屏幕上。将消息复制到新的SSMS窗口,并检查语法。