我有一张主键event_id
的表格。我需要将Plant
从IM17
更改为SG18
。
我不想删除行(由于历史原因而保留)。执行以下SQL时出现PK违规。
DECLARE @plant CHAR(4)
DECLARE @l_event_id INT
SELECT @plant = 'SG18'
SET @l_event_id = (SELECT MAX(cast(event_id as int)) FROM dbo.event_header)
INSERT INTO dbo.event_header (
event_id, scenario_name, actor_code, method_code,
SAP_plant_code, object_id,serial_no
)
SELECT @l_event_id + 1 , eh.scenario_name, eh.actor_code,
eh.method_code, @plant, eh.object_id, eh.serial_no
FROM dbo.event_header eh
WHERE eh.SAP_plant_code = 'IM17';
答案 0 :(得分:4)
您的方法不起作用,因为您只评估MAX(cast(event_id as int))
一次 - 然后尝试插入event_id
的所有n个具有相同值的新行....
你需要使用这样的东西来完成你的工作:
DECLARE @plant CHAR(4) = 'SG18'
DECLARE @l_event_id INT
SELECT @l_event_id = MAX(CAST(event_id AS INT)) FROM dbo.event_header)
;WITH CTE AS
(
SELECT
eh.scenario_name,
eh.actor_code,
eh.method_code,
eh.object_id,
eh.serial_no,
RowNum = ROW_NUMBER() OVER (ORDER BY eh.serial_no)
FROM dbo.event_header eh
WHERE eh.SAP_plant_code = 'IM17';
)
INSERT INTO
dbo.event_header (event_id, scenario_name, actor_code, method_code, SAP_plant_code, object_id,serial_no)
SELECT
@l_event_id + RowNum,
scenario_name, actor_code, method_code,
@plant,
object_id, serial_no
FROM
CTE
基本上,此CTE(公用表表达式)获取您需要的所有值,并使用ROW_NUMBER()
生成序列号(从1到为@plant = 'IM17'
选择的行数)。
当您将RowNum
添加到之前的最大值,而现在没有其他任何内容将数据插入该目标表时 - 那么您将有机会获得成功!