【发布时间】: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   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
-- 检查并比较每一行
-- 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