>基本上,我希望遍历一个临时表,其中列出了某些需要更新的表名,我使用每个表名来填充所有要更新的ID的另一个临时表。
我可以使用此结构选择每个表中需要更新的数据,但似乎无法让内部光标运行,因为它没有拾取临时表。
任何帮助将不胜感激,因为这在过去的几个小时里一直在做我的坚果。
干杯
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
再次,任何帮助将不胜感激。
谢谢。。
盖瑞
我认为错误来自您尝试在动态 sql 中使用表变量的事实。 不支持此功能,因为表变量超出了动态 sql 的范围。 您应该使用创建表命令将@temptable变成临时表。
在未经请求的建议类别中,我建议尽可能尝试在不使用游标的情况下重新创建它,因为游标违背了基于集合的处理的概念,这是 sql 服务器的基础。