在 INSERT INTO ... OUTPUT ... INTO temp table 上获取 ID 到 temp table 变量

Getting ID into temp table variable on INSERT INTO ... OUTPUT ... INTO temp table

这是我正在使用的示例程序。

create procedure PRO_ProcName
    @description varchar(max), 
    @txn_no varchar
as
begin
    declare @txn table (
        id bigint,
        description varchar(max),
        txn_no varchar
    );

    declare @txn_id bigint;

    insert into transactions    
    (
        description,
        txn_no
    )
    output
        inserted.description,
        inserted.txn_no
    into @txn
    values
    (
        @description,
        @txn_no
    )

    select @txn_id = id from @txn;
end

我收到如下错误:

Column name or number of supplied values does not match table definition.

我知道这是因为我的临时 table 中有 id 字段,但它没有插入到 insert into 语句中。我无法为 id 赋值,因为它是自动递增主键。

如何解决这种情况并将 id 条插入的记录放入变量中?

I cannot give value for id because it is the auto increment primary key.

不,不是。你还没有宣布它是那种东西。所以我们需要先解决这个问题:

declare @txn table (
    id bigint IDENTITY PRIMARY KEY,
    description varchar(max),
    txn_no varchar
);

然后我们通过在您的 INTO 子句中指定列列表来修复它:

output
    inserted.description,
    inserted.txn_no
into @txn (description, txn_no)

无论如何指定列列表总是一个好习惯。

或者如果我误解了你的问题,id 应该来自 transactions,那么你只需在 OUTPUT 子句中添加 inserted.id 作为另一列。 inserted表示插入后table的那个状态。因此,即使您没有在 INSERT.

中指定它们,您也可以在 OUTPUT 子句中包含其中的列

inserted table 表示插入后目标 table 中存在的数据 - 因此它还包括自动生成的值,无论它们是由默认生成的值定义或列上的标识定义 - 因此您需要将 inserted.id 添加到 output 子句。

但是,您的程序中还有两处错误。
第一个也是最重要的一点是您没有为 @txn_no varchar 参数指定长度。 SQL 在这种情况下,服务器将隐式指定 1 个字符的长度。
第二个是您没有在 output 子句中指定 @txn 的列列表。

这是您的代码的改进版本,已修复所有这些问题:

create procedure PRO_ProcName
    @description varchar(max), 
    @txn_no varchar(255) -- Note: I don't know the actual length you need
as
begin
    declare @txn table (
        id bigint,
        description varchar(max),
        txn_no varchar
    );

    declare @txn_id bigint;

    insert into transactions    
    (
        description,
        txn_no
    )
    output
        inserted.id,
        inserted.description,
        inserted.txn_no
    into @txn(id, description, txn_no)
    values
    (
        @description,
        @txn_no
    )

    select @txn_id = id from @txn;
end