Sql 执行存储过程的游标中的多个值
我有一个执行存储过程的游标。我在游标中引入了一个新变量dbname,在dbname附近出现了一个异常错误。引入此更改是为了在不同的数据库上执行存储过程storedProc_getoutputsbyruncSql 执行存储过程的游标中的多个值,sql,sql-server,cursor,Sql,Sql Server,Cursor,我有一个执行存储过程的游标。我在游标中引入了一个新变量dbname,在dbname附近出现了一个异常错误。引入此更改是为了在不同的数据库上执行存储过程storedProc_getoutputsbyrunc 如果你将所有这些都封装在它自己的变量中,然后打印它,这一行 'INSERT INTO ' + @temp_table_outputs + ' Execute ''@dbname''.dbo.storedProc_getOutputsByRun' 将产生如下结果: INSERT INTO my
如果你将所有这些都封装在它自己的变量中,然后打印它,这一行
'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窗口,并检查语法。您正在使用或其他dbms吗?对不起,我应该说清楚。我正在使用SQL Server。
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')