2014-02-19 107 views
1

我有一個SourceTarget表,其中包含超過150列,實際上問題是我需要比較,並在我的MERGE聲明中插入這150列,是否有任何其他方式來做這個?合併聲明數百列

MERGE targettable AS [Target] 
USING ( 
     ---Source Query* 
    ) AS [Source] ON [Target].Key = [Source].Key 

WHEN MATCHED --Matching records with change //Update 
    AND [Target].[StartDt] <> [Source].[StartDt] 
     OR [Target].[ADStatusDesc] <> [Source].[ADStatusDesc] 
     ..... --more than 150 columns 
    OR [Target].[StatusInd] <> [Source].[StatusInd] 
    THEN 
     UPDATE 
      SET [Target].[StartDt] = [Source].[StartDt]  
      .... ----more than 150 columns 
      ,[Target].[StatusInd]= [Source].[StatusInd] 
+1

你正在使用哪個數據庫? –

+0

im使用相同的數據庫來源和目標 – Rommel20

回答

1

是的,你需要明確地拼出它們。但您可以生成該代碼:

SELECT 
    col.name 
    , N' OR NOT(a.' + QUOTENAME(col.name) + N' = b.' + QUOTENAME(col.name) + N' OR (a.' + QUOTENAME(col.name) + N' IS NULL AND b.' + QUOTENAME(col.name) + N' IS NULL))' 
FROM sys.columns col 
JOIN sys.objects obj ON col.object_id = obj.object_id 
JOIN sys.types tp ON col.user_type_id = tp.user_type_id 
WHERE obj.name = 'TableNameHere' AND col.is_computed = 0 
ORDER BY col.column_id 

這也正確地處理了NULL的值。對於字符串,您應該添加排序規則子句以使用二進制排序規則。

+0

兩個表中的所有屬性被設置爲' NOT NULL',所以我不期望NULL值,是'NOT'語句比'<>'更好? 「EXCEPT」怎麼樣,我可以使用它嗎? '從Target' 'EXCEPT' 'SELECT * FROM Source'' – Rommel20

+0

如果NULL是不可能的,你可以使用簡單的'<>'的想法,是選擇*。我不明白你如何使用'EXCEPT',因爲MERGE'需要一個連接條件。 – usr

0
  • 你確定你需要的所有列在比較合併?你能不能簡單地用[Source]數據更新[Target]的所有列,只要[Target].Key = [Source].Key,因爲[Source]包含好/新值?
  • 聰明地使用文本編輯器功能,特別是通常稱爲列模式編輯的功能,應該可以幫助您圍繞列名稱列表構建SQL語句,每行一個列表(通常可以從現有的SQL語句中提取更多巧妙的文本編輯)。
+0

實際上我需要的結果是相同的第三方工具稱爲表差異其中輸出是插入,刪除和更新,通過比較每個屬性更新 – Rommel20