2017-08-09 91 views
1

我的查詢:如何多行查詢結果的變量存儲在SSIS

SELECT CONCAT('E.',+COLUMN_NAME +'='+'SE.'+COLUMN_NAME,',') 
FROM Company2.INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = N'employee' 

查詢結果:

E.Id=SE.Id, 
E.Name=SE.Name, 
E.Salary=SE.Salary, 

我要存儲查詢結果的變量一樣

@variable=E.Id=SE.Id,E.Name=SE.Name,E.Salary=SE.Salary, 

這樣我就可以在這樣的更新聲明中使用:

Update E 
set @variable 
from Employee as E 
join Staging_Employee as SE 
on E.Id = SE.Id 

任何想法,我如何能夠實現這一目標?

的額外信息: 基本上我想從Staging_Employee表更新Employee表中database.And試圖存儲在變量列,這樣我可以在SSIS使用我的更新statment(EXCUTE SQL任務)和員工表格有30多列。

預先感謝

編輯-1:

對於插入: (1)oldedb源>(2)查找任務(參考表是在DB空Employee表)>( 3)將行插入Oledb目的地。

更新: 由式(2)查找匹配的輸出>查找任務(參考表是數據庫EMPLOYEE表檢查所有記錄ID = ID)>的臨時表>執行SQL任務(這裏我想要使用更新統計更新登記表中的記錄到DB中的實際表,我基本上試圖在更新統計中使用變量來將field = value(Query Result)保存在變量中,以便當表架構更改fields = value時自動獲取更新**** !!

編輯2:

我用約翰的解決方案,只要表的PK被命名爲實例ID我修改了約翰的代碼,用來例如@表中的所有表它的工作原理= anytable和@ stage_Table = staging_anytable:

對於例如嘗試使用代碼表銷售:

Declare @Table varchar(100) 
Declare @stage_Table varchar(100) 
Set @Table = 'Sales' 
Set @stage_Table ='Stage_Sales' 



    Declare @SQL varchar(max) =' 
    Merge '[email protected]+' 
    Using '[email protected]_Table+' B on A.ID = B.ID 
    When Matched Then 
    Update SET '+Stuff((Select ',A.'+quotename(Column_Name)+'=B.'+quotename(Column_Name) 

        From INFORMATION_SCHEMA.COLUMNS 

        Where Table_Name= 'sales' and Column_Name<>'ID' 

        For XML Path ('')),1,1,'') +' 

    ; 

    ' 
    --Print @SQL 
    Exec(@SQL) 

但我得到這個錯誤,因爲ID是SalesID: 消息4104,級別16,狀態1,第3行 多部分標識符「A.ID」可能不受約束。 消息207,級別16,狀態1,行3 無效的列名稱'ID'。

任何想法@John如何在這種情況下修改你的代碼?

+0

IT方面eems就像你知道列名已經。爲什麼你需要SSIS而不僅僅是一個存儲過程?我還建議只處理更改。另外,你是否缺少插入? – KeithL

+0

順便說一句,回答你的問題。將結果集存儲到一個ADO對象中並循環到foreach中,然後將這些項添加到一個變量中,然後將該變量插入到sql語句中(確保刪除最後一個逗號),然後在執行SQL中運行SQL變量。 – KeithL

+0

請檢查我的編輯。 – shaadi

回答

1

你有沒有考慮MERGE

編輯 - 動態

Declare @SQL varchar(max) =' 
Merge Employee A 
Using Staging_Employee B on A.ID = B.ID 
When Matched Then 
    Update SET '+Stuff((Select ',A.'+quotename(Column_Name)+'=B.'+quotename(Column_Name) 
       From INFORMATION_SCHEMA.COLUMNS 
       Where Table_Name= 'employee' and Column_Name<>'ID' 
       For XML Path ('')),1,1,'') +' 
; 
' 
Print @SQL 
--Exec(@SQL) 

生成的SQL是

Merge Employee A 
Using Staging_Employee B on A.ID = B.ID 
When Matched Then 
    Update SET A.[Name]=B.[Name],A.[Salary]=B.[Salary] 
; 
+0

約翰我想在SSIS包和更新SET A.Name = B.Name不是我想要的。我想從變量中設置column = value,我想保持包的動態性,這樣如果基礎表發生變化,我就不必在更新語句中更改列。 – shaadi

+0

@shaadi然而,你知道SQL不支持宏替換,你可以去動態。而不是做30''s更新(每場1個),我會建議動態合併 –

+0

約翰你的代碼岩石!但它有一個問題檢查我的Edit-2。 – shaadi

相關問題