2016-08-30 4 views
0

現在、私はカーソルを使用して大きなストアドプロシージャを持っており、内部は2つのマージステートメントです。まもなく言った、私は1つの大きなテーブルから2つのテーブルを設定したい。サブクエリーが2つ以上の値を返しました。 mergeとtsqlの使用

今、私はSQLにはかなり新しく、知識を広げるために公正なビットを読んでいます。この研究の中で、私は多くのトピックに出くわしました。そこで、カーソルとパフォーマンスの問題について説明しました。

現在のSP(カーソル付き)は正常に動作しますが、カーソル(他のPOV)なしで自分のコードを使用しようとしています。

だから今私はこの小さなゴミコードに悩まされています。私はそれが私がそれを望むようにそれをすることは不可能だと思うが、ちょっと、私は正しいことを試すことができます。

エラー:サブクエリが1より大きい値を返しました。サブクエリは、次の時にこれが許可されていない=、=、<、...

コード:!

MERGE CONTACTS as target 
USING STAGING_CONTACTS as source 
ON (target.ID = source.ID) 
WHEN MATCHED THEN 
    UPDATE SET 
     MAIL = (SELECT MAIL FROM STAGING_CONTACTS), 
     NAME = (SELECT NAME FROM STAGING_CONTACTS), 
     BRAND = (SELECT BRAND FROM STAGING_CONTACTS), 
     ID = (SELECT ID FROM STAGING_CONTACTS) 
WHEN NOT MATCHED THEN 
    INSERT (MAIL, NAME, BRAND, CORESOLEIL_ID) 
    VALUES ((SELECT MAIL FROM STAGING_CONTACTS), 
     (SELECT NAME FROM STAGING_CONTACTS), 
     (SELECT BRAND FROM STAGING_CONTACTS), 
     (SELECT ID FROM STAGING_CONTACTS)); 

これは私が持っている2つのマージ文の一つであり、これは小さいものです。

フィードバックは歓迎です!事前に

感謝:)

+1

マージには欠陥が実装され、後に潜在的なデータ問題がある場合、デバッグには非常に困難です。私は決して誰もが私たちの生産データベースでそれを使用することを許可しません。更新ステートメントの後に挿入(注文は重要) – HLGEM

+1

https://www.mssqltips.com/sqlservertip/3074/use-caution-with-sql-servers-merge-statement/ –

答えて

2

選択statements..Below文を削除したテーブル...

MERGE CONTACTS as target 
USING STAGING_CONTACTS as source 

を使用して更新するテーブルの世話をするので、あなたのクエリは次のよう

UPDATE SET 
     MAIL = MAIL , 
     and so on... 
WHEN NOT MATCHED THEN 
    INSERT (MAIL, NAME, BRAND, CORESOLEIL_ID) 
    VALUES (mail,name,brand,id) 
下回ることができ

以下のような別名も可能です

MERGE CONTACTS as target 
USING STAGING_CONTACTS as source 
ON (target.ID = source.ID) 
WHEN MATCHED THEN 
    UPDATE SET 
     target.MAIL = source.MAIL, 
     and so on.. 
WHEN NOT MATCHED THEN 
    INSERT (MAIL, NAME, BRAND, CORESOLEIL_ID) 
    VALUES (source.all columns....) 
+0

これは完璧に機能しました私、ありがとう! –

0

以下のスクリプトを使用してください。..

MERGE CONTACTS as target 
USING STAGING_CONTACTS as source 
ON (target.ID = source.ID) 
WHEN MATCHED THEN 
    UPDATE SET 
     target.MAIL = source.MAIL , 
     target.NAME = source.Name, 
     target.BRAND = source.BRAND , 
     target.ID = source.ID 
WHEN NOT MATCHED THEN 
    INSERT (MAIL, NAME, BRAND, CORESOLEIL_ID) 
    VALUES (source.MAIL , source.Name, source.BRAND ,source.ID); 
関連する問題