2016-06-17 4 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 в столбец ...»). В этом примере у меня могут быть значения для @ 1ID/@ 1Value, @ 2ID/@ 2Value и @ 3ID/@ 3Value, но не @ 4ID/@ 4Value. Поэтому я хочу, чтобы оператор слияния обрабатывал @ 4ID, чтобы он не выполнялся, если @ 4ID = NULL. Я надеялся, что смогу сделать что-то вроде этого:

--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 NOT NULL MERGE'? 'CASE' является частью выражений, а не выражением. –

+0

Извините, я не был чист в этом вопросе. Я в основном имею в виду, что если @ 4ID равно null, то игнорируйте его. Выполняйте только те операторы слияния, где параметр не равен NULL. –

ответ

0

Я бы сжимал всю вещь в один MERGE с условными обновлениями/вставками.

Как указывает Джерейн - идентификатор должен быть уникальным, или это может иметь нежелательные последствия.

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» (не идентификатор)) должно быть разрешено. –

+0

Совершенно верно, я не считал №1 ... Исправим за # 2, это был надзор. – JiggsJedi

+0

Спасибо, что нашли время для публикации! Я рассмотрю это предложение, попробую его и опубликую результаты на следующей неделе. Я должен упомянуть, что в отношении поста Jeroen выше, действительно, идентификатор уникален, и мы не хотим вставлять значение, если значение NULL. –

Смежные вопросы