2016-03-02 38 views
0

我想「如果不存在其他INSERT,UPDATE」爲現有值的語句在一個表具有以下模式創建:生成腳本與更新,如果存在其他INSERT(MSSQL)

if exists (select 1 from TABLE_NAME where Ident_Column=Identifier) 
    update TABLE_NAME set 
     Column1=Value1, 
     Column2=Value2, 
     Column3=Value3, 
     ... 
     where Ident_Column=Identifier 
    else 
     insert into TABLE_NAME (Column1, Column2, Column3, ...) 
     select Value1, Value2, Value3, ... 
    go 

我嘗試使用MSSQL Mangement Studio(2014)腳本生成器,但沒有按照需要得到輸出。

編輯:期望的輸出是SQL語句,@Rusland K. & Nick.McDermaid。我想使用腳本生成器爲表TABLE的每個(或選定)行生成此SQL代碼。 標識符不是一個變量,它是一個值。 如果列Ident_Column中的標識符存在,則相應地設置該行(值1-n)。如果沒有在任何行中找到該標識符,請相應地創建一個現在的行。 @bmsqldev:這是整個代碼(只是取代了實際的列/表名稱和具體的值)

其實我不明白是什麼導致了這裏的誤解。如果你能說出來,我很樂意學習。編輯2:我編寫了一個小腳本,根據這種模式轉換MSSQL管理工作室的腳本輸出,這花了我約2個小時。

+1

使用合併來做你的要求 – bmsqldev

+2

不需要。你可以用'MERGE'來做到這一點。或者乾脆刪除'IF'並在'UPDATE'和'INSERT'子句中使用正確的'WHERE'語句。速度將與MERGE相同。您也可以通過源查詢或TVP將目標表加入到所有行的MERGE/UPSERT中 –

+1

需要什麼輸出? p.s.合併太車... –

回答

1
MERGE TABLE_NAME AS TARGET 
    USING(
    SELECT 
     * 
    FROM 
     DBO.TABLE_NAME 
    WHERE 
     IDENT_COLUMN=IDENTIFIER 

) AS SOURCE 
    ON(
    TARGET.COLUMN1 = SOURCE.COLUMN1 
    AND TARGET.COLUMN2 = SOURCE.COLUMN2 
    AND TARGET.COLUMN3 = SOURCE.COLUMN3 

) 
WHEN MATCHED THEN UPDATE 
SET 
     TARGET.COLUMN1=SOURCE.VALUE1, 
     TARGET.COLUMN2=SOURCE.VALUE2, 
     TARGET.COLUMN3=SOURCE.VALUE3, 
    WHEN NOT MATCHED THEN INSERT 
     (
      COLUMN1, COLUMN1, COLUMN1, ...) 

    VALUES(
     (VALUE1, VALUE2, VALUE3, ... 
     ), 
     SOURCE.VALUE1, 
     SOURCE.VALUE2, 
     SOURCE.VALUE3,... 
    );;