在两个Cursor循环内的Dynamic Exec Update时出现“Declare Scalar”错误

时间:2013-10-23 17:00:05

标签: sql tsql cursor exec sp-executesql

基本上我想循环遍历一个临时表,列出某些需要更新的表名,我拿每个表名用它来填充所有要更新的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

再次,非常感谢任何帮助..

谢谢..

格里

1 个答案:

答案 0 :(得分:0)

我认为错误来自于您尝试在动态sql中使用表变量的事实。这不是支持的,因为表变量超出了动态sql的范围。您应该使用create table命令将@temptable放入临时表中。

在未经请求的建议类别中,我建议尝试在不使用游标的情况下重新创建它,因为游标违背了基于集合的处理的概念,这是sql server的基础。