【问题标题】:Using a Cursor to Update Rows in Single Table使用游标更新单个表中的行
【发布时间】:2012-10-02 17:26:51
【问题描述】:

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


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

ENTITY    ENTITY_TYPE    VALUE     STATUS_TYPE

123    1                                                                                                                                                                                                                                                              
123    1    4    1
123    1    9    1


表视图(从表中选择 * 实体 = 456 (@OverrideID)

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

最终数据集如下:

ENTITY&nbsp&nbsp&nbspTYPE    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

-- 检查并比较每一行
-- IF @OverrideID = @ID (匹配)
----- 将@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 

【问题讨论】:

  • 在 MS SQL 中,我会认真地开始尝试考虑结果集而不是使用游标。
  • 如果您不进行 INSERT,您的表格如何从 3+2 条记录膨胀到 8 条?

标签: sql sql-server stored-procedures merge cursor


【解决方案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

【讨论】:

    猜你喜欢
    • 2011-06-18
    • 2020-09-14
    • 1970-01-01
    • 2019-07-09
    • 1970-01-01
    • 2016-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多