【问题标题】:how to store multi row query result in a variable in SSIS如何将多行查询结果存储在 SSIS 中的变量中
【发布时间】:2017-08-09 16:45:20
【问题描述】:

我的查询:

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 表。并尝试将列存储在一个变量中,以便我可以在 SSIS(执行 sql 任务)中使用我的更新语句,并且员工表有 30 多个列。

提前致谢

Edit-1:

插入: (1) oldedb source > (2)lookup task(参考表是DB中的空Employee表) > (3)向Oledb目标插入行。

关于更新: 从(2)查找匹配输出>查找任务(参考表是数据库中的员工表检查所有记录id = id)>暂存表>执行sql任务(!! 这里我要使用更新语句以将记录从暂存表更新到数据库中的实际表,我基本上试图在更新语句中使用变量将字段 = 值(查询结果)保存在变量中,以便在表架构更改时字段 = 值自动更新*** *!!

Edit-2:

我使用了 John 的解决方案,只要表的 PK 被命名为 ID,它就可以工作,例如我修改了 John 的代码以用于 所有表,例如 @table=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  '+@Table+'
    Using '+@stage_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 在这种情况下我如何修改你的代码吗?

【问题讨论】:

  • 您似乎已经知道列名。为什么你需要 SSIS 而不仅仅是存储过程?我还建议只处理更改。另外,您是否缺少插入内容?
  • 顺便说一句,回答你的问题。将结果集存储到 ADO 对象中并在 foreach 中循环,然后将项目附加到变量中,然后将该变量插入到 sql 语句中(确保删除最后一个逗号),然后在执行 SQL 中运行 SQL 变量.
  • 请检查我的编辑。

标签: sql-server tsql ssis business-intelligence


【解决方案1】:

你考虑过合并

编辑 - 动态

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]
;

【讨论】:

  • John 我想在 SSIS 包中实现这一点,而 Update SET A.Name = B.Name 不是我想要的。我想从我想保持包动态的变量中设置 column=value,这样如果基础表发生变化,我就不必更改更新语句中的列。
  • @shaadi 如您所知,SQL 不支持宏替换,但是,您可以使用 DYNAMIC。我建议不要进行 30 次更新(每个字段 1 个),而是建议动态合并
  • 约翰你的代码太棒了!但它有一个问题,检查我的 Edit-2。
  • @shaadi 在我的回答中,我假设 PK 是 A.ID 和 B.ID。查看您的增强功能,我认为您还必须提供密钥(A 和 B)。
  • @shaadi 仅供参考,使用 MERGE,您还可以添加一个 WHEN NOT MATCHED 来处理 INSERTS。
猜你喜欢
  • 1970-01-01
  • 2014-04-24
  • 1970-01-01
  • 2019-12-29
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多