我试图在插入语句后得到一个键值。 例子: 我有一个表的属性名称和id。Id是一个生成的值。

    INSERT INTO table (name) VALUES('bob');

现在我想在同一步骤中取回id。这是怎么做到的?

我们使用的是Microsoft SQL Server 2008。


当前回答

建议使用SCOPE_IDENTITY()来获取新的ID值,而不是使用“OUTPUT Inserted”。ID”

如果插入语句抛出异常,我将直接抛出它。而是“输出插入”。ID”将返回0,这可能与预期不同。

其他回答

@@IDENTITY是一个系统函数,返回最后插入的标识值。

使用SCOPE_IDENTITY()获取新的ID值

INSERT INTO table (name) VALUES('bob');

SELECT SCOPE_IDENTITY()

http://msdn.microsoft.com/en-us/library/ms190315.aspx

在插入一个带有identity列的表之后,你可以引用@@IDENTITY来获取值: http://msdn.microsoft.com/en-us/library/aa933167%28v=sql.80%29.aspx

有很多方法可以在插入后退出

在向表中插入数据时,可以使用OUTPUT子句 返回已插入到表中的数据的副本。的 OUTPUT子句有两种基本形式:OUTPUT和OUTPUT INTO。使用 如果希望将数据返回给调用应用程序,则使用OUTPUT表单。 如果希望将数据返回到表或表中,则使用OUTPUT INTO表单 表变量。

DECLARE @MyTableVar TABLE (id INT,NAME NVARCHAR(50));

INSERT INTO tableName
(
  NAME,....
)OUTPUT INSERTED.id,INSERTED.Name INTO @MyTableVar
VALUES
(
   'test',...
)

IDENT_CURRENT:它返回在任何会话中为特定表或视图创建的最后一个标识。

SELECT IDENT_CURRENT('tableName') AS [IDENT_CURRENT]

SCOPE_IDENTITY:它返回同一个会话和同一个作用域的最后一个标识。作用域是存储过程/触发器等。

SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY];  

@@IDENTITY:返回同一会话的最后一个标识。

SELECT @@IDENTITY AS [@@IDENTITY];

*参数在连接字符串中的顺序有时很重要。* Provider参数的位置可以在添加一行后中断记录集游标。我们在SQLOLEDB提供程序中看到了这种行为。

添加行之后,行字段不可用,除非Provider被指定为连接字符串中的第一个参数。当提供程序位于连接字符串中的任何位置(除了第一个参数之外)时,新插入的行字段将不可用。当我们将提供者移动到第一个参数时,行字段神奇地出现了。