如何将多行查询结果存储在SSIS中的变量中
how to store multi row query result in a variable in 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
知道如何实现吗?
补充信息:
基本上我试图在 database.And 中从 Staging_Employee table 更新 Employee table 试图将列存储在变量中,以便我可以在 SSIS 中使用我的更新语句(执行 sql 任务)和员工 table 有 30 多列。
提前致谢
编辑-1:
对于插入:
(1) oldedb 源 > (2) 查找任务(引用 table 在数据库中为空员工 table)> (3) 将行插入到 Oledb 目标。
更新:
从 (2) 查找匹配输出 > 查找任务(参考 table 是员工 table 在数据库中检查所有记录 id=id) > 暂存 table > 执行 sql 任务(!! 这里我想使用更新语句将记录从暂存 table 更新为数据库中的实际 table 我基本上是在尝试使用变量在更新语句中将字段 = 值(查询结果)保存在变量中,以便当 table 模式更改时字段=值自动更新****!!
编辑-2:
我使用了 John 的解决方案,只要 table 的 PK 被命名为 ID,它就可以工作,例如我修改了 John 的代码以用于 all tables 例如@table=anytable 和@stage_Table=staging_anytable:
例如尝试使用代码进行销售 table:
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 在这种情况下我该如何修改您的代码吗?
你考虑过MERGE
EDIT - Dynamic
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]
;
我的查询:
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
知道如何实现吗?
补充信息: 基本上我试图在 database.And 中从 Staging_Employee table 更新 Employee table 试图将列存储在变量中,以便我可以在 SSIS 中使用我的更新语句(执行 sql 任务)和员工 table 有 30 多列。
提前致谢
编辑-1:
对于插入: (1) oldedb 源 > (2) 查找任务(引用 table 在数据库中为空员工 table)> (3) 将行插入到 Oledb 目标。
更新: 从 (2) 查找匹配输出 > 查找任务(参考 table 是员工 table 在数据库中检查所有记录 id=id) > 暂存 table > 执行 sql 任务(!! 这里我想使用更新语句将记录从暂存 table 更新为数据库中的实际 table 我基本上是在尝试使用变量在更新语句中将字段 = 值(查询结果)保存在变量中,以便当 table 模式更改时字段=值自动更新****!!
编辑-2:
我使用了 John 的解决方案,只要 table 的 PK 被命名为 ID,它就可以工作,例如我修改了 John 的代码以用于 all tables 例如@table=anytable 和@stage_Table=staging_anytable:
例如尝试使用代码进行销售 table:
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 在这种情况下我该如何修改您的代码吗?
你考虑过MERGE
EDIT - Dynamic
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]
;