Sql “错误”;声明标量“;当动态Exec在两个游标循环内更新时
基本上,我希望循环遍历一个临时表,其中列出了需要更新的某些表名,我使用每个表名来填充另一个临时表,其中包含要更新的所有ID 我可以使用此结构选择每个需要更新的表中的数据,但似乎无法让内部游标运行,因为它没有拾取临时表 任何帮助都将不胜感激,因为在过去的几个小时里,这件事一直困扰着我 干杯Sql “错误”;声明标量“;当动态Exec在两个游标循环内更新时,sql,tsql,cursor,exec,sp-executesql,Sql,Tsql,Cursor,Exec,Sp Executesql,基本上,我希望循环遍历一个临时表,其中列出了需要更新的某些表名,我使用每个表名来填充另一个临时表,其中包含要更新的所有ID 我可以使用此结构选择每个需要更新的表中的数据,但似乎无法让内部游标运行,因为它没有拾取临时表 任何帮助都将不胜感激,因为在过去的几个小时里,这件事一直困扰着我 干杯 DECLARE @table INT DECLARE @prefix nvarchar(3) DECLARE @TableName nvarchar(50) DECLARE @T
DECLARE @table INT
DECLARE @prefix nvarchar(3)
DECLARE @TableName nvarchar(50)
DECLARE @TableIdName nvarchar(50)
DECLARE @getTable CURSOR
SET @getTable = CURSOR FOR
SELECT DISTINCT(id)
FROM @t
OPEN @getTable
FETCH NEXT
FROM @getTable INTO @table
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @TableName = name FROM @t WHERE id = @table
SET @TableIdName = @TableName + 'Id'
SELECT @prefix = prefix FROM @t WHERE name = @TableName
--PRINT @table
PRINT @TableName
--PRINT @TableIdName
--PRINT @prefix
DECLARE @temptable table(rid int, rTableName nvarchar(50), rprefix nvarchar(3), rpk nvarchar(50))
EXEC ('INSERT INTO ' + @temptable + ' SELECT ' + @TableIdName + ', ' + @TableName + ', ' + @prefix + @TableIdName + ' FROM ' + @TableName)
DECLARE @rTableName nvarchar(50)
DECLARE @rpk nvarchar(50)
DECLARE @rprefix nvarchar(3)
DECLARE @row INT
DECLARE @getRow CURSOR
SET @getRow = CURSOR FOR
SELECT DISTINCT(rid)
FROM @temptable
OPEN @getRow
FETCH NEXT
FROM @getRow INTO @row
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @row
SELECT @rTableName = rTableName FROM @temptable WHERE rid = @row
SELECT @rpk = rpk FROM @temptable WHERE rid = @row
SELECT @rprefix = rprefix FROM @temptable WHERE rid = @row
EXEC ('UPDATE ' + @rTableName + ' SET CoiRef = ' + @rprefix + '_' + @row + ' WHERE ' + @rpk + ' = ' + @row)
FETCH NEXT
FROM @getRow INTO @row
END
CLOSE @getRow
DEALLOCATE @getRow
FETCH NEXT
FROM @getTable INTO @table
END
CLOSE @getTable
DEALLOCATE @getTable
我还尝试了另一种使用sp_executesql
的解决方案,但也出现了类似的错误,这是在第一个EXEC上使用了下面的代码
DECLARE @sqlCommand nvarchar(500)
SET @sqlCommand = 'INSERT INTO @temptable SELECT TableIdName, TableName, prefix, TableIdName FROM' + @TableName
EXECUTE sp_executesql @sqlCommand, N'@temptable nvarchar(50) output', @temptable OUTPUT
再次感谢您的帮助
谢谢
Gerry我认为错误是因为您试图在动态sql中使用表变量。这是不受支持的,因为表变量超出了动态sql的作用域。您应该使用CREATETABLE命令将@TENTRABLE设置为临时表
在未经请求的建议类别中,我建议在不可能使用游标的情况下重新创建这一点,因为游标违背了基于SQL Server的基础的基于集合的处理的概念。
您得到了什么错误?我记不清了,但是如果我遇到它,我会把代码贴在下面