繁体   English   中英

使用游标更新单个表中的行

[英]Using a Cursor to Update Rows in Single Table

我正在根据以下条件使用MS SQL光标或SQL while循环使用单个表合并(添加,更新和设置非活动)行,以寻求最终数据集,以寻求指导:


表格检视(SELECT * FROM TABLE WHERE ENTITY = 123(@ID)

ENTITY ENTITY_TYPE VALUE STATUS_TYPE

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


表格视图(SELECT * FROM TABLE WHERE ENTITY = 456(@OverrideID)

ENTITY ENTITY_TYPE VALUE STATUS_TYPE
456 1 1 1
456 1 5 1

最终数据集如下:

ENTITY TYPE VALUE 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

-检查并比较每一行
-如果@OverrideID = @ID(MATCH)
-----将@ID设置为非活动的保留副本
-如果@OverrideID!= @ID(不匹配)
-----用@OverrideID(COPY)插入@ID数据
-----将@ID设置为无效。

我开始写以下内容,需要帮助。 供参考,@ 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 

最终结果集看起来像

    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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM