我想选择刚刚插入数据库的数据。我知道可以使用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语句放在一个事务块中,如果其中一个失败,那么我就可以回滚而不提交任何内容。
答案 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)