2

基本的に、更新が必要な特定のテーブル名をリストする一時テーブルをループしようとしています.各テーブル名を使用して、更新するすべての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

繰り返しますが、どんな助けでも大歓迎です..

ありがとう..

ジェリー

4

1 に答える 1

0

動的SQL内でテーブル変数を使用しようとしているという事実からエラーが発生していると思います。テーブル変数が動的 SQL の範囲外であるため、これはサポートされていません。create table コマンドを使用して、@temptable を一時テーブルにする必要があります。

一方的なアドバイスのカテゴリでは、カーソルは SQL Server の基盤であるセット ベースの処理の概念に反するため、可能な限りカーソルを使用せずにこれを再作成することをお勧めします。

于 2013-10-28T15:16:24.783 に答える