用删除更新

时间:2015-04-21 12:43:55

标签: sql sql-server tsql sql-server-2012

我是SQL编程的新手 我需要做的是更新,其中可能存在表中重复的记录。 该表由Key-PAYOFF + PRODCT + PROLIN + PROGRO中的4个字段组成 我所知道的就是我需要将PAYOFF从1234567改为7777777 如果我使用以下更新命令,如果新记录存在,我可能会收到错误2627。     Update ICEP set PAYOFF = '7777777' where PAYOFF = '1234567'

现在遇到困难的部分:如果记录777777(加上所有其他关键字段存在),我需要删除OLD 1234567记录(加上所有其他关键字段)。只需这一条记录,然后继续更新。

表格如下:

CREATE TABLE [dbo].[ICEP](
[PAYOFF] [char](7) NOT NULL,
[PRODCT] [char](21) NOT NULL,
[PROLIN] [char](2) NOT NULL,
[PROGRO] [char](2) NOT NULL,
[TERRTRY] [char](3) NULL,
[STADAT] [date] NULL,
[ENDDAT] [date] NULL,
[company] [char](2) NOT NULL,
 CONSTRAINT [pkICEP] PRIMARY KEY CLUSTERED 
(
[company] ASC,
[PAYOFF] ASC,
[PRODCT] ASC,
[PROLIN] ASC,
[PROGRO] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
       IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
       ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

这是可行的,但我需要更多Generic我必须替换成数百个表。

 WITH ICEP_SRC (PAYOFF, PRODCT, PROLIN, PROGRO, TERRTRY, STADAT, ENDDAT, COMPANY) AS
    ( SELECT '02WEST', PRODCT, PROLIN, PROGRO, TERRTRY, STADAT, ENDDAT, COMPANY FROM ICEP WHERE PAYOFF='COPY210' AND COMPANY='10')
   MERGE INTO ICEP
       USING ICEP_SRC 
       ON ICEP_SRC.PAYOFF=ICEP.PAYOFF
       AND ICEP_SRC.PRODCT=ICEP.PRODCT
       AND ICEP_SRC.PROLIN=ICEP.PROLIN
       AND ICEP_SRC.PROGRO=ICEP.PROGRO
       AND ICEP_SRC.COMPANY=ICEP.COMPANY
WHEN NOT MATCHED BY TARGET THEN
       INSERT (PAYOFF,PRODCT, PROLIN, PROGRO, TERRTRY, STADAT, ENDDAT, COMPANY)
       VALUES (ICEP_SRC.PAYOFF,ICEP_SRC.PRODCT,ICEP_SRC.PROLIN,ICEP_SRC.PROGRO,
       ICEP_SRC.TERRTRY, ICEP_SRC.STADAT, ICEP_SRC.ENDDAT,ICEP_SRC.COMPANY);

DELETE FROM ICEP
       WHERE PAYOFF='COPY210' AND COMPANY='10';

2 个答案:

答案 0 :(得分:2)

执行此操作的简便方法是使用事务,首先删除并稍后更新。当然,您可能希望使用变量而不是硬编码字符串 像这样的东西:

DECLARE @CorrectPayOff char(7),
        @WrongPayOff char(7)

SELECT @CorrectPayOff = '7777777',
       @WrongPayOff = '1234567'

BEGIN TRANSACTION

BEGIN TRY
    -- Assuming you want to replace values only of both records exists
    IF EXISTS(
        SELECT 1
        FROM ICEP
        WHERE PAYOFF = @CorrectPayOff
    ) AND EXISTS (
        SELECT 1
        FROM ICEP
        WHERE PAYOFF = @WrongPayOff
    )
    BEGIN
        DELETE 
        FROM ICEP
        WHERE PAYOFF = @CorrectPayOff

        UPDATE ICEP
        SET PAYOFF = @CorrectPayOff
        WHERE PAYOFF = @WrongPayOff
    END
END TRY

BEGIN CATCH
    ROLLBACK TRANSACTION
END CATCH

IF @@TRANCOUNT > 0 COMMIT TRANSACTION

答案 1 :(得分:0)

MERGE INTO [dbo].[ICEP] AS TARGET 
USING (SELECT * FROM [dbo].[ICEP] WHERE [PAYOFF] = 123456) AS SOURCE 
on(Source.[pkICEP] = Target.[pkICEP])
WHEN MATCHED THEN 
  UPDATE SET [PAYOFF] = 7777777
WHEN NOT MATCHED BY TARGET
  THEN [DO SOMETHING ELSE]