【问题标题】:Stored Procedure as Parameter in MERGE [INSERT] Statement存储过程作为 MERGE [INSERT] 语句中的参数
【发布时间】:2013-01-15 12:21:27
【问题描述】:

我需要通过以下方式合并两个表:

  • 目标有一个额外的列 ID。此 ID 来自另一个单列主表。
  • 在 Merge 语句中插入记录时,我需要在 mater 表中插入一个新行并使用其id 插入到 TARGET 表中。

我创建了一个存储过程,它插入并返回新插入的 ID。现在问题出在 SQL Merge 内部,我们不能调用存储的 Proc。

有什么办法可以解决这个问题?不能使用标量函数,因为 INSERT 不能在函数中执行。

DECLARE @temp INT
MERGE dbo.mytabletarget T
USING dbo.mytableSource S
ON T.refId=S.RefId
WHEN MATCHED  THEN
UPDATE 
SET T.col1=S.col1,
    T.Col2=S.Col2
WHEN NOT MATCHED BY TARGET THEN
INSERT (Id,col1,col2)
VALUES({Here i need value from SP. SP simply Inserts a new Id into master table and Returns it},S.col1,S.col2);
GO

【问题讨论】:

  • 您可以尝试使用INSERT ... EXEC ... 语法将您的SP 执行到临时表或表变量中,然后与之合并?

标签: sql sql-server sql-merge


【解决方案1】:

有什么办法可以解决这个问题?

不要使用存储过程。很明显,不是吗?

对于合并语句,您几乎只能在语句中执行命令。 Merge 专注于 ETL 负载,既有优点也有局限性。

基本上,把逻辑放到merge语句中。

在 Merge 语句中插入记录时,我需要在 mater 表中插入一个新行 并使用它的 id 插入到 TARGET 表中。

嗯,查找表维护?

通常的方法是确保首先填写查找表(在单独的语句中)。由于特定原因,ETL(这就是合并的来源)通常按阶段工作。

对不起,我也没有更好的解决方案;(

【讨论】:

  • 如何填写合并语句中的查找表
  • 不在里面,在单独的一个。 “分阶段工作”。首先填写查找表,然后填写事实数据。这是标准的。或者,您可以尝试合并到一个视图中,该视图具有处理查找的而不是插入触发器。
  • 我需要 INSERT INTO 为 MERGE 中的每个 INSERT 查找表。您可以编辑原始帖子中的代码来详细说明这一点。谢谢
  • @user1711287 你需要开始像程序员一样思考。您不能在一次合并中执行此操作,因此请运行两次合并。如果你想让我写你的代码,我有一个每日费率。这是一个问答网站,而不是“免费为我工作”的位置。
  • 您能否详细说明使用两个合并的概念?特别适合我的场景。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多