在 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
这是我正在使用的示例程序。
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