SQL返回插入的数据

时间:2015-12-08 19:49:23

标签: sql-server

我想选择刚刚插入数据库的数据。我知道可以使用OUTPUT,我们可以调用INSERTED。[ColumnName]来获取插入的值。这些值可以设置为某种变量还是给定别名?我不想使用TEMP表,因为我希望尽可能使用变量。

当PK是或不是标识列时,解决方案可以使用。

修改: Contacts.PhoneNumberID是PhoneNumber.ID的外键 我想要两个插入语句背靠背,我需要PhoneNumber中的ID用于Contacts.PhoneNumberID

修改: [PhoneNumber]。[ID]在数据库中指定了默认值,即ID的设置方式

以下是我要找的内容:

INSERT INTO [PhoneNumber] (Number) 
OUTPUT INSERTED.ID, INSERTED.Number 
VALUES ('555-555-5555') 

INSERT INTO [Contacts] (Name,PhoneNumberID) 
VALUES ('SomeName', {ID From previous insert})

我们可以说一下插入语句的别名如何说:

INSERT INTO [PhoneNumber] (Number) 
OUTPUT INSERTED.ID, INSERTED.Number 
VALUES ('555-555-5555') as A

我知道我们实际上不能像上面所做的那样对一个插入语句进行别名,我正在寻找正确的方法来实现这一点。

然后你可以这样做:

INSERT INTO [Contacts] (Name,PhoneNumberID) 
VALUES ('SomeName', A.ID)

我要找到与此相似的最终结果:

INSERT INTO [PhoneNumber] (Number) 
OUTPUT INSERTED.ID, INSERTED.Number 
VALUES ('555-555-5555') as A

INSERT INTO [Contacts] (Name,PhoneNumberID) 
VALUES ('SomeName', A.ID)

我尝试这样做的原因:

我希望将两个insert语句放在一个事务块中,如果其中一个失败,那么我就可以回滚而不提交任何内容。

3 个答案:

答案 0 :(得分:1)

为此,您需要使用IDENT_CURRENT(' your_table)功能。它返回表中生成的最后一个IDENTITY值,无论创建该值的连接如何,也不管生成该值的语句的范围如何。 IDENT_CURRENT不受范围和会话的限制;它仅限于指定的表格。 IDENT_CURRENT返回在任何会话和任何范围内为特定表生成的标识值。 所以你的代码看起来像这样:

Declare @last_ident numeric(38,0)
INSERT INTO [PhoneNumber] (Number) 
VALUES ('555-555-5555') 

SELECT @last_ident = IDENT_CURRENT('PhoneNumber')

INSERT INTO [Contacts] (Name,PhoneNumberID) 
VALUES ('SomeName', @last_ident)

您可以找到更多信息here

编辑:

如果您需要获取非身份字段,则应使用OUTPUT

Declare @tbl table(ID int)
INSERT INTO [PhoneNumber] (Number) 
OUTPUT INSERTED.ID INTO @tbl
VALUES ('555-555-5555') 

Declare @id int
select @id = ID from @tbl

INSERT INTO [Contacts] (Name,PhoneNumberID) 
VALUES ('SomeName',@id)

答案 1 :(得分:0)

您可以从SCOPE_IDENTITY()插入最新内容。 所以你的代码看起来像这样:

DECLARE @id AS INT;
INSERT INTO [PhoneNumber] (Number) 
VALUES ('555-555-5555')

SELECT @id = SCOPE_IDENTITY();

INSERT INTO [Contacts] (Name,PhoneNumberID)
VALUES ('SomeName', @id)

对于DECLARE @id AS INT;,您需要更改变量的类型以适合数据类型PhoneNumberID列

答案 2 :(得分:0)

您也可以使用Sequence

Declare @newId int = NEXT VALUE FOR [PhoneNumber_Seq];
Insert into [PhoneNumber] (ID, Number)
values(@newId, '555-555-55555')

INSERT INTO [Contacts] (Name,PhoneNumberID)
VALUES ('SomeName', @newId)