我有一个执行存储过程的游标。我在游标中引入了一个新的变量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')
答案 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窗口,并检查语法。