Sql “错误”;声明标量“;当动态Exec在两个游标循环内更新时

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

基本上,我希望循环遍历一个临时表,其中列出了需要更新的某些表名,我使用每个表名来填充另一个临时表,其中包含要更新的所有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
再次感谢您的帮助

谢谢


Gerry

我认为错误是因为您试图在动态sql中使用表变量。这是不受支持的,因为表变量超出了动态sql的作用域。您应该使用CREATETABLE命令将@TENTRABLE设置为临时表


在未经请求的建议类别中,我建议在不可能使用游标的情况下重新创建这一点,因为游标违背了基于SQL Server的基础的基于集合的处理的概念。

您得到了什么错误?我记不清了,但是如果我遇到它,我会把代码贴在下面