0

MS SQL カーソルまたは SQL while ループを使用して、以下の基準に基づいて単一のテーブルを使用して行をマージ (追加、更新、および非アクティブに設定) し、最終的なデータセットを求めることになるガイダンスを求めています。


テーブル ビュー (SELECT * FROM テーブル WHERE エンティティ = 123 (@ID)

ENTITY     ENTITY_TYPE    STATUS_TYPE    

123 1 1 1
123 1 4 1
123 1 9 1


TABLE VIEW (SELECT * FROM TABLE WHERE ENTITY = 456 (@OverrideID)

ENTITY     ENTITY_TYPE 値    STATUS_TYPE 456    1 1 1 456 1 5 1



以下の最終データセット:

   エンティティタイプ        STATUS_TYPE

123 1 1 3
123 1 4 3
123 1 9 3
456 1 1 1
456 1 4 1
456 1 9 1
456 1 1 1
456 1 5 1

-- 各行をチェックして比較
-- IF @OverrideID = @ID (MATCH)
----- @ID を inactive に設定してコピーを保持
-- If @OverrideID != @ID (NOT MATCH)
----- @OverrideID で @ID データを挿入 (COPY)
----- @ID を inactive に設定.

私は次のことを書き始めましたが、助けが必要です。参考までに、@ID = 123 および @OverrideID = 456


DECLARE @ENTITY BIGINT, @ENTITY_TYPE BIGINT, @VALUE BIGINT, @E1 BIGINT, @T1 BIGINT, @V1 BIGINT
DECLARE type_cursor CURSOR LOCAL FAST_FORWARD FOR
SELECT * FROM TypeValue WHERE ENTITY = @ID

SET NOCOUNT OFF
OPEN type_cursor

FETCH NEXT FROM type_cursor INTO @OverrideID, @ID, @ENTITY, @ENTITY_TYPE, @VALUE

WHILE (@@FETCH_STATUS = 0)
    BEGIN

        SELECT @ENTITY, @ENTITY_TYPE, @VALUE

     IF @VALUE IS NOT NULL
        BEGIN
        SELECT @T1 = @ENTITY_TYPE, @V1 = @VALUE
        END
    ELSE
    BEGIN
    UPDATE TypeValue
    SET ENTITY = @OverrideID, ENTITY_TYPE = @T1, VALUE = @V1 WHERE ENTITY = @ID
    END

FETCH NEXT FROM type_cursor INTO @OverrideID, @ID, @ENTITY, @ENTITY_TYPE, @VALUE

END

CLOSE type_cursor 
DEALLOCATE type_cursor 
SET NOCOUNT OFF 
4

1 に答える 1

1

その最終結果セットは次のようになります

    select entity,entity_type,value,3 status_type
      from [table]
     where entity = @id
 union all
    select @override,entity_type,value,status_type
      from [table]
     where entity = @id
 union all
    select entity,entity_type,value,status_type
      from [table]
     where entity = @override
于 2012-10-11T23:09:25.933 に答える