Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 执行存储过程的游标中的多个值_Sql_Sql Server_Cursor - Fatal编程技术网

Sql 执行存储过程的游标中的多个值

Sql 执行存储过程的游标中的多个值,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

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


如果你将所有这些都封装在它自己的变量中,然后打印它,这一行

'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')