【发布时间】: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