2013-08-05 36 views
1

確定,所以根據Microsoft docs在SSIS的OLE DB命令轉換做到這一點SSIS OLEDB目的地,SQL命令(insert,如果不存在的話)

的OLE DB命令轉換運行的每一行SQL語句在數據流。例如,您可以運行插入,更新或刪除數據庫表中的行的SQL語句。

所以我想寫一些SQL在我的表只有在記錄不存在

所以,我想這一個插入行,但控制不好保存的sintaxys抱怨

IF NOT EXISTS 
(SELECT * FROM M_Employee_Login WHERE 
      Column1=? 
      AND Column2=? 
      AND Column3=?) 

INSERT INTO [M_Employee_Login] 
      ([Column1] 
      ,[Column2] 
      ,[Column3]) 
    VALUES 
      (?,?,?) 

但是,如果我刪除IF NOT EXISTS部分(只留下插入),控件說可能代碼是好的,我做錯了什麼。

有沒有更簡單的解決方案?

更新: BTW我的源是平面文件(CSV文件),因爲答案

更新:只是爲了讓人們知道。我結束了使用OLE DB Command Transformation像我計劃的原因比這個操作的OLE DB Destination好。不同之處在於我使用Lookup Component來過濾所有已經存在的記錄(如提供的答案)。然後在問題中使用OLE DB Command TransformationInsert SQL,它按預期工作。希望它可以幫助

回答

1

OLEDB Command對象是不一樣的OLE DB Destionation

,而不是做它作爲你的描述,而不是使用Lookup Component。您的數據流將變爲平面文件源 - >查找組件 - > OLE DB目標

在查找中,您將編寫查詢SELECT Column1, Column2, Column3 FROM M_Employee_Login並對其進行配置,使其不會將匹配實體重定向到流而不是失敗(具體取決於你的版本2005年和不2005年)這將是默認的。

查找後,不匹配的輸出將包含未在目標表中找到相應匹配的值。

最後,配置您的OLEDB目標以執行快速加載選項。

+0

Thx很多我知道應該有一個簡單的方法做到這一點 – Termiux

2

雖然你可以利用SSIS中的查找組件來避免重複這是最好的方法,但是如果你正在尋找一些查詢以避免重複,那麼你可以簡單地將所有的數據插入一些臨時/登臺在您的數據庫中的表,並運行以下查詢。

INSERT INTO M_Employee_Login(Column1, Column2, Column3) 
SELECT vAL1,vAL2,vAL3 from Staging_Table 
EXCEPT 
SELECT Column1, Column2, Column3 FROM M_Employee_Login