【问题标题】:How to use merge to insert value from a stored procedure如何使用合并从存储过程中插入值
【发布时间】:2013-05-17 14:23:53
【问题描述】:

我正在尝试做这样的事情:

merge MembershipTEST as T
using (select OrganisationID, Name From MembershipPending) as S
on  T.OrganisationID = S.OrganisationID
and T.Name = S.Name
when not matched then
insert (MembershipID,OrganisationID, Name) 
values(
(EXEC [dbo].[spGetNextIntKeyByTableName] 
@PKColName = 'MembershipID',@TableName = 'FWBMembership'),
S.OrganisationID, 
S.Name );

基本上identitykey来自一个sp

有可能吗?

更新 1:答案是否定的

阅读在线文档http://msdn.microsoft.com/en-us/library/bb510625%28v=sql.105%29.aspx

VALUES (values_list) 是以逗号分隔的常量列表, 变量,或返回值以插入目标的表达式 桌子。表达式不能包含 EXECUTE 语句。

【问题讨论】:

  • According to the publicly and freely available online documentationwhen not matched 子句中唯一有效的内容是:INSERT [ ( column_list ) ] { VALUES ( values_list ) | DEFAULT VALUES } - 所以,你不能调用存储的代替插入数据值的过程
  • 呃,为什么不只是INSERT table EXEC dbo.procedure?你为什么要通过硬塞MERGE 来使事情复杂化?
  • @AaronBertrand 这是一个夜间运行的工作,显然我不想插入重复的数据
  • 好的,所以INSERT #tmp EXEC procedure; INSERT table SELECT FROM #tmp WHERE NOT EXISTS
  • @Aaron Bertrand proc 将返回表中的最大 ID,因此它不是我可以存储在 #tmp 表中的结果列表。

标签: stored-procedures merge sql-server-2008-r2


【解决方案1】:

构建一个 SSIS 包。只需创建一个新的数据流任务。使用两个 OLEDB 源,其中一个执行存储过程,另一个从您要查找的表中选择 MERGE 。确保它们都是由同一事物订购的。进入每个 OLEDB 源的高级设置,设置排序为 true,然后为您排序的项目设置排序值。然后将两个数据流移动到MERGE JOIN。然后将数据流发送到条件拆分并设置为INSULL(OrganisationID)。使用生成的数据流转到 OLEDB 目标。

抱歉缺少视觉效果,我稍后会在午餐时间添加它们,现在忙于添加它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2019-05-04
    • 2014-01-04
    • 1970-01-01
    相关资源
    最近更新 更多