【问题标题】:Output field from another table on insert SQL Server插入 SQL Server 时另一个表的输出字段
【发布时间】:2018-05-24 06:17:13
【问题描述】:

我有一个表@p2作为参数发送到一个ID名为IdObjectSubTypeTemp的存储过程,我需要插入一个表ObjectSubType并输出带有参数表ID的身份,如下所示:

INSERT INTO [dbo].[ObjectSubType]
    ([IdObject]
    ,[IdSubType])
OUTPUT inserted.[IdObjectSubType] ,OS.[IdObjectSubTypeTemp]
INTO @IdObjectSubTypeTbl
SELECT OS.[IdObject] 
    ,OS.[IdSubType]
FROM @p2 OS

但我一直在理解:

无法绑定多部分标识符“OS.IdObjectSubTypeTemp”。

虽然我在更新时做了同样的事情并且它正在工作但在插入时它不起作用

【问题讨论】:

  • OS.IdObjectSubTypeTemp 不在您的选择列表中
  • @Squirrel 是的,因为我不想将它插入表 ObjectSubType 我只想输出它
  • 没有必要将所有列都列在 select 中,但所有列都应该出现在 from 表中,这样您就可以与退出该列的其他表连接,只需添加 insert 而不是 select在此此列将仅保存在输出表中。
  • @Susang 该列不存在于任何物理表中......它只存在于临时表@p2 中,我只想将临时表中的列与创建的标识映射但是我无法在物理表中添加它
  • @User7291 您是否使用区分大小写的排序规则?

标签: sql sql-server tsql stored-procedures


【解决方案1】:

您可以使用MERGE 代替INSERT INTO。即使不使用,它也允许引用 @p2 列:

DECLARE @p2 AS TABLE (IdObject INT,IDSubType INT,IdObjectSubTypeTemp CHAR(10));
DECLARE @IdObjectSubTypeTbl AS TABLE (col1 INT, col2 CHAR(10));

INSERT INTO @p2(IdObject, IDSubType, IdObjectSubTypeTemp) VALUES(1,1,'a');

MERGE INTO [dbo].[ObjectSubType] tgt
USING @p2 src ON tgt.IdObject = src.IdObject
WHEN NOT MATCHED BY TARGET THEN
INSERT  (IdObject, IdSubType)
VALUES (src.IdObject, src.IdSubType)
OUTPUT inserted.[IdSubType] ,src.[IdObjectSubTypeTemp]   
                             -- refering to column not used in INSERT
INTO @IdObjectSubTypeTbl(col1, col2);

DBFiddle Demo

【讨论】:

  • merge 的性能是否与Insert 相同,因为据我所知Insert 的性能更好..
  • @User7291 在做出任何预测之前,您应该始终比较执行计划。我认为它是可比较的(请不要在这里我首先检查目标表中是否存在值,而使用您的插入方法直接插入行)
【解决方案2】:

OUTPUT clause 在 INSERT 语句中使用时不支持引用 from_table_name - 请仔细阅读文档,不是很清楚,请参阅 cmets。

您可以使用 OUTPUT 子句捕获插入的新标识值。[IdObjectSubType] 然后单独查询 INSERT [IdObjectSubType] 和 [IdObjectSubTypeTemp] INTO @IdObjectSubTypeTbl。

【讨论】:

  • 摘自文档:from_table_name 是列前缀,用于指定包含在用于指定行的 DELETE、UPDATE 或 MERGE 语句的 FROM 子句中的表更新或删除。 注意这如何排除 INSERT。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-24
相关资源
最近更新 更多