【问题标题】:Using SQL OUTPUT for INSERT into a table with Identity (or default values)使用 SQL OUTPUT 插入具有标识(或默认值)的表
【发布时间】:2014-10-17 15:48:32
【问题描述】:

我将记录插入到需要序列号的表(付款)中。我使用带有 OUTPUT 子句的 UPDATE 语句从另一个表 (SequenceNumbers) 获取并增加此序列号。

UPDATE [SequenceNumbers] SET SequenceNo = SequenceNo + 1 
    OUTPUT INSERTED.SequenceNo 
    WHERE EstateId = @EstateId

我希望能够将上述 UPDATE 语句与使用 OUTPUT INTO 的 Payments INSERT 语句结合起来,如下所示

UPDATE [SequenceNumbers] SET Sequence = Sequence + 1 
    OUTPUT @EstateId AS EstateId, 
       INSERTED.SequenceNo AS SequenceNo
    INTO Payments
    WHERE EstateId = @EstateId

但在测试时,您必须提供目标表中的所有字段。我想要做的是使用 Payments 表中 Id 字段的自动标识值以及任何缺失字段的默认值。

然后我需要将 Payments 表中的 Id(身份)值返回给调用者。

我想知道这是否可能或是否有其他选择?

我在下面放置了 Payments 和 SequenceNumbers 表的简化示例以供参考。

CREATE TABLE [Payments](
    [EstateId]   INT NOT NULL,
    [Id]         INT NOT NULL IDENTITY , 
    [SequenceNo] INT NOT NULL DEFAULT 0,
    .... other fields 
    PRIMARY KEY ([EstateId], [Id])
)

CREATE TABLE [SequenceNumbers] (
    [EstateId]   INT NOT NULL,
    [SequenceNo] INT DEFAULT ((0)) NOT NULL,
    PRIMARY KEY CLUSTERED ([EstateId] ASC)
)

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    您只需指定要插入Payments 中的哪些列:

    UPDATE [SequenceNumbers] 
    SET Sequence = Sequence + 1 
      OUTPUT Inserted.EstateId, Inserted.SequenceNo
      INTO Payments(EstateId, SequenceNo)     -- define what columns to insert into!
    WHERE EstateId = @EstateId
    

    【讨论】:

    • 谢谢马克不知道我怎么没有尝试过!。您是否知道从付款表中返回身份字段的任何方法,或者我应该将其作为一个单独的问题提出。
    • @JamesWhittred - Scope_identity 可能工作 but there is some quirkiness in this area 所以你需要测试。
    • @MartinSmith - 我已经尝试将@@IDENTITY 和SCOPE_IDENTITY 作为附加的OUTPUT 子句和SELECT。它总是返回 NULL。这与您共享的链接中的第三种情况一致。我目前将 SequenceNo 作为附加的 OUTPUT 子句返回,然后执行新的 SELECT 以查找插入的 Payment 表记录。在一个语句中获得所有内容会很好,但至少序列号增量和支付插入发生在一个事务中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 2012-02-05
    • 2018-03-21
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多