如何为insert / select中的每一行增加变量

时间:2012-11-16 21:28:20

标签: sql-server-2008 variables insert

我有一张主键event_id的表格。我需要将PlantIM17更改为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';

1 个答案:

答案 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添加到之前的最大值,而现在没有其他任何内容将数据插入该目标表时 - 那么您将有机会获得成功!