2017-08-09 45 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

相关问题