2015-10-28 107 views
1

我試圖從臨時表(源)導入到SQL Server中的目標表(dest)。某些目標表值是根據條件語句從源表值中派生的。其中的邏輯是有點像這個使用IF ELSE語句從源表值中插入值到目標表dervived列

IF source.col1=0 
    BEGIN 
      IF source.col2=0 
       BEGIN 
        dest.colA = 1 
        dest.colB = source.col3 
       END 
      ELSE 
       BEGIN 
         dest.colC= 1 
         dest.colD= source.col3 
       END 
    ELSE IF source.col4>0 
      BEGIN 
      dest.colD=1 
      dest.colE=source.col3 
      END 
    ELSE 
      BEGIN 
      dest.colF=1 
      dest.colG=source.col1 
      END 
    END 

我目前做的從源表到目標表中的合併在存儲過程中,並有其他列除此之外地圖完美以上。我如何編寫這個邏輯,以便根據上面的邏輯從源表列中設置目標表派生列?到目前爲止,我所嘗試過的所有東西都不適合我。預先感謝您的幫助

謝謝M. Ali先生和phiosophicles。我在合併聲明中使用這個,但現在我得到錯誤無效的對象名稱'來源'

我沒有收到我的任何其他合併報表上的這個錯誤。來源如下。我曾經匿名在一定程度上所以請讓我知道,如果它是不明確

MERGE dbo.Destination WITH (HOLDLOCK) AS Target 
    USING 
    (
    SELECT DISTINCT id, col3, 
CAST(LEFT(DATEADD(m,months,CONVERT(date,CONCAT(origination,'/01'))),7) as varchar(20)) as CalendarMonth, 
col1, col2,col4 FROM dbo.Staging 
) AS Source 
    ON (Target.ID=Source.id 
    AND Target.Month=Source.col3) 
     WHEN MATCHED THEN 
      UPDATE SET 
      Target.CalendarMonth=Source.CalendarMonth, 
      Target.colF= (SELECT CASE WHEN col1>0 THEN 1 END AS colF FROM Source), 
      Target.colD=(SELECT CASE WHEN col4>0 THEN 1 END AS colD 
             FROM Source), 
      Target.colC=(SELECT CASE WHEN col1=0 AND col2=0 
             THEN 1 END AS colC FROM Source), 
      Target.colB(SELECT CASE WHEN col1>0 AND col2 
             THEN 1 END AS colB FROM Source), 
      Target.colG=(SELECT CASE WHEN col1>0 THEN col1 END AS colG FROM Source), 
      Target.colE=(SELECT CASE WHEN col4>0 THEN col3 END 
             AS colE FROM Source), 
      Target.PaidMonth=(SELECT CASE WHEN col1=0 AND col2=0 
             THEN col3 END AS PaidMonth 
             FROM Source), 
      WHEN NOT MATCHED BY TARGET THEN 
      INSERT 
      (Destination Table columns 
      ) 
      VALUES 
      ( Source values including derived values from above); 

    END 

GO

UPDATE

我代替select語句中派生列有CASE WHEN col4> 0 THEN col3 END等等,這樣擺脫了錯誤。謝謝大家的幫助!

回答

0
INSERT INTO Destination (ColA, ColB, ColC, ColD, ColF, ColG) 
Select CASE WHEN Col1 = 0 AND Col2 = 0 THEN 1 END AS ColA 
     ,CASE WHEN Col1 = 0 AND Col2 = 0 THEN Col3 END AS ColB 
     ,CASE WHEN Col1 = 0 AND Col2 <> 0 THEN 1 END AS ColC 
     ,CASE WHEN Col1 = 0 AND Col2 <> 0 THEN Col3 
      WHEN Col1 <> 0 AND Col4 > 0 THEN 1 END AS ColD 
     ,CASE WHEN Col1 <> 0 AND Col4 !> 0 THEN 1 END AS ColF 
     ,CASE WHEN Col1 <> 0 AND Col4 !> 0 THEN Col1 END AS ColG 
FROM SourceTable 
+0

謝謝@ M.Ali。我將這添加到了我的合併中,但是我現在在源Alias上收到了無效的對象錯誤。我不會在我用來填充其他表的其他合併語句中出現此錯誤。我在原始帖子中添加了詳細信息。 –

1

T-SQL有兩個非常不同的語言結構,無論涉及到「如果有一件事是真實的,做到這一點,否則那」。

在問題中演示的IF/BEGIN/END構造專門用於在T-SQL中的流量控制;也就是說,它應該用來包裝整個代碼塊來控制它們是否被執行。你可以在IF構造的BEGIN/END中放置任何SELECT,INSERT,UPDATE或DELETE查詢;您還可以將數據定義代碼(例如CREATE TABLE),變量賦值和許多其他類型的語句。

另一方面,您要做的是控制哪個列表達式應該呈現。這必須在內執行查詢(SELECT,INSERT或UPDATE),因此使用不同的T-SQL結構CASE..END。 M.Ali提供了一個很好的例子,說明如何在他的回答中使用CASE..END,所以我不會重複。只要注意每個CASE..END塊代替SQL查詢中的列。

+0

謝謝@philosophicles。我在我的合併語句中添加了Ali的條件來爲我的目標表分配值,但是我現在在源Alias上收到了一個無效的對象錯誤。我不會在我用來填充其他表的其他合併語句中出現此錯誤。我在原始帖子中添加了詳細信息。 –