在两个游标循环内动态执行更新时出错"Declare Scalar"



>基本上,我希望遍历一个临时表,其中列出了某些需要更新的表名,我使用每个表名来填充所有要更新的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 服务器的基础。

相关内容

  • 没有找到相关文章

最新更新