2016-06-17 11 views
0

エキスパート、こんにちは。マージステートメントを実行する、または実行しない、caseステートメントを使用できますか?私はマージ機能が新しくなっています。次のように私の状況では、私は、ストアドプロシージャの中に、これらのパラメータに値を渡しています:マージステートメントを実行する前にcaseステートメントを使用できますか?

@1ID int = NULL 
,@1Value float = NULL 
,@2ID int = NULL 
,@2Value float = NULL 
,@3ID int = NULL 
,@3Value float = NULL 
,@4ID int = NULL 
,@4Value float = NULL 

AS 
--1 
MERGE FACT_CookReading AS T 
    USING 
    (
     SELECT 
      @1ID 
      ,@1Value 

    ) AS S (
      CookSampleId 
      ,ReadingValue 

    ) ON (
     T.CookSampleID = S.CookSampleID 

    ) 
    WHEN MATCHED THEN 
     UPDATE SET 

      ReadingValue = S.ReadingValue 

    WHEN NOT MATCHED THEN 
     INSERT (
      CookSampleID 
      ,ReadingValue 

     ) VALUES (
      @1ID 
      ,@1Value 

     ) 
; 
--2 
MERGE FACT_CookReading AS T 
    USING 
    (
     SELECT 
      @2ID 
      ,@2Value 

    ) AS S (
      CookSampleId 
      ,ReadingValue 

    ) ON (
     T.CookSampleID = S.CookSampleID 

    ) 
    WHEN MATCHED THEN 
     UPDATE SET 

      ReadingValue = S.ReadingValue 

    WHEN NOT MATCHED THEN 
     INSERT (
      CookSampleID 
      ,ReadingValue 

     ) VALUES (
      @2ID 
      ,@2Value 

     ) 
; 

--3 
MERGE FACT_CookReading AS T 
    USING 
    (
     SELECT 
      @3ID 
      ,@3Value 

    ) AS S (
      CookSampleId 
      ,ReadingValue 

    ) ON (
     T.CookSampleID = S.CookSampleID 


    ) 
    WHEN MATCHED THEN 
     UPDATE SET 

      ReadingValue = S.ReadingValue 

    WHEN NOT MATCHED THEN 
     INSERT (
      CookSampleID 
      ,ReadingValue 

     ) VALUES (
      @3ID 
      ,@3Value 

     ) 
; 

--4 
MERGE FACT_CookReading AS T 
    USING 
    (
     SELECT 
      @4ID 
      ,@4Value 

    ) AS S (
      CookSampleId 
      ,ReadingValue 

    ) ON (
     T.CookSampleID = S.CookSampleID 

    ) 
    WHEN MATCHED THEN 
     UPDATE SET 

      ReadingValue = S.ReadingValue 

    WHEN NOT MATCHED THEN 
     INSERT (
      CookSampleID 
      ,ReadingValue 

     ) VALUES (
      @4ID 
      ,@4Value 

     ) 
; 

私はに実行している問題はで供給されているパラメータのいくつかのためにnull値があるかもしれないことである。この原因。ストアドプロシージャが失敗する( "NULLを列に挿入できません...")。この例を使用すると、@ 1ID/@ 1Value、@ 2ID/@ 2Value、@ 3ID/@ 3Valueの値を持つことができますが、@ 4ID/@ 4Valueはできません。ですから、@ 4IDがNULLの場合、@ 4IDを処理するマージステートメントを実行しないでください。

--4 
CASE IF @4ID <> NULL THEN 
MERGE FACT_CookReading AS T 
    USING 
    (
     SELECT 
      @4ID 
      ,@4Value 

    ) AS S (
      CookSampleId 
      ,ReadingValue 

    ) ON (
     T.CookSampleID = S.CookSampleID 


    ) 
    WHEN MATCHED THEN 
     UPDATE SET 

      ReadingValue = S.ReadingValue 

    WHEN NOT MATCHED THEN 
     INSERT (
      CookSampleID 
      ,ReadingValue 

     ) VALUES (
      @4ID 
      ,@4Value 

     ) 
; 

しかし、それはできないようです。おそらくこれを処理するより良い方法があります。私は熱心にあなたの提案を待っています。そして、あなたの時間をありがとう!

+0

「IF @ 4ID IS NOT NULL MERGE」を意味しますか? 'CASE'は式の一部であり、文ではありません。 –

+0

申し訳ありませんが、私はその点について明確ではありませんでした。私は基本的に、@ 4IDがnullの場合は無視します。パラメータがnullでない場合にのみ、これらのマージ文を実行します。 –

答えて

0

条件付きの更新/挿入を使用して、全体を1つのMERGEに圧縮します。

Jeroenが指摘しているように、IDは一意である必要があります。そうしないと、望ましくない効果が生じる可能性があります。

MERGE FACT_CookReading AS T 
    USING (SELECT @1ID AS CookSampleId, @1Value AS ReadingValue UNION 
      SELECT @2ID, @2Value UNION 
      SELECT @3ID, @3Value UNION 
      SELECT @4ID, @4Value) AS S 
    ON T.CookSampleID = S.CookSampleID 

    WHEN MATCHED AND S.CookSampleID IS NOT NULL THEN 
     UPDATE SET 
      ReadingValue = S.ReadingValue 

    WHEN NOT MATCHED AND S.CookSampleID IS NOT NULL THEN 
     INSERT (CookSampleID,ReadingValue) 
     VALUES (S.CookSampleID,S.ReadingValue); 
+0

これは、1)「ID」値が一意ではない(しかし、おそらく、それらであるか、またはそうでなければならない)場合および/または2)「NULL」値を更新または挿入する場合(ID ) 許可されるべきです。 –

+0

まあ、私は#1を考慮していない...#2のために修正する、それは見落としだった。 – JiggsJedi

+0

投稿していただきありがとうございます!私はこの提案を見渡し、試してみて、来週の結果を掲載します。私は上記のJeroenによる投稿に関して、実際にIDは一意であり、値がNULLの場合は値を挿入したくないということを言及する必要があります。 –

関連する問題