我是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';
答案 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]