4

主キーを持つテーブルがありますevent_idPlantをから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';
4

1 に答える 1

5

評価は1回だけなので、このアプローチは機能しません。次に、 ...MAX(cast(event_id as int))に同じ値を持つn個の新しい行をすべて挿入しようとします。event_id

あなたはあなたの仕事を成し遂げるためにこのようなものを使う必要があるでしょう:

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、現在そのターゲットテーブルにデータが挿入されていない場合、成功の可能性があります。

于 2012-11-16T21:34:09.773 に答える