【发布时间】:2008-09-10 19:56:54
【问题描述】:
在 SQL Server 2005 中,我在表中有一个“id”字段,该字段的“Is Identity”属性设置为“Yes”。因此,当在该表上执行插入时,“id”会自动设置为下一个递增整数。执行插入时是否有一种简单的方法来获取“id”设置的内容,而无需在插入后立即执行 Select 语句?
【问题讨论】:
标签: sql-server identity
在 SQL Server 2005 中,我在表中有一个“id”字段,该字段的“Is Identity”属性设置为“Yes”。因此,当在该表上执行插入时,“id”会自动设置为下一个递增整数。执行插入时是否有一种简单的方法来获取“id”设置的内容,而无需在插入后立即执行 Select 语句?
【问题讨论】:
标签: sql-server identity
至少在 .Net 中,您可以一次性向服务器发送多个查询。我在我的应用程序中执行此操作:
command.CommandText = "INSERT INTO [Employee] (Name) VALUES (@Name); SELECT SCOPE_IDENTITY()";
int id = (int)command.ExecuteScalar();
像魅力一样工作。
【讨论】:
如果要插入多行,在insert 语句中使用OUTPUT 和INSERTED.columnname 子句是将所有ID 放入临时表的简单方法。
DECLARE @MyTableVar table( ID int,
Name varchar(50),
ModifiedDate datetime);
INSERT MyTable
OUTPUT INSERTED.ID, INSERTED.Name, INSERTED.ModifiedDate INTO @MyTableVar
SELECT someName, GetDate() from SomeTable
【讨论】:
Scope_identity() 是首选方式,请参阅:6 Different Ways To Get The Current Identity Value
【讨论】:
SCOPE_IDENTITY();是你最好的选择。如果您使用的是 .NET,只需传递一个 our 参数并在程序运行后检查该值。
CREATE PROCEDURE [dbo].[InsertProducts]
@id INT = NULL OUT,
@name VARCHAR(150) = NULL,
@desc VARCHAR(250) = NULL
AS
INSERT INTO dbo.Products
(Name,
Description)
VALUES
(@name,
@desc)
SET @id = SCOPE_IDENTITY();
【讨论】:
您必须选择 scope_identity() 函数。
要从应用程序代码中执行此操作,我通常将此过程封装在一个存储过程中,因此它看起来仍然像对我的应用程序的一个查询。
【讨论】:
我倾向于使用企业管理器将触发器附加到表。这样您就不必担心在代码中写出额外的 sql 语句。我的看起来像这样:
创建触发器 tblName 在 dbo.tblName 上 对于插入 作为 选择 new_id = @@IDENTITY
然后,在您的代码中,将您的插入语句视为选择语句 - 只需执行并评估结果。 “newID”列将包含您刚刚创建的行的标识。
【讨论】:
这可能是我为 SQL Server 找到的最佳工作解决方案。 Sql Server return the value of identity column after insert statement
【讨论】: