在SQL Server中,执行插入操作时是否可以获得记录的" id"?
时间:2020-03-05 18:51:02 来源:igfitidea点击:
在SQL Server 2005中,表中具有"标识"属性设置为"是"的" id"字段。因此,在该表上执行插入操作时," id"会自动设置为下一个递增整数。当执行插入操作以获取" id"所设置的内容而不必在插入之后立即执行Select语句时,是否有一种简便的方法?
duplicate of: Best way to get identity of inserted row?
解决方案
回答
我们必须选择scope_identity()函数。
为了从应用程序代码中做到这一点,我通常将此过程封装在一个存储过程中,因此它看起来仍然像对我的应用程序的一个查询。
回答
Scope_identity()是首选方法,请参见:6种获取当前身份值的不同方法
回答
至少在.Net中,我们可以一次将多个查询发送到服务器。我在我的应用程序中执行此操作:
command.CommandText = "INSERT INTO [Employee] (Name) VALUES (@Name); SELECT SCOPE_IDENTITY()"; int id = (int)command.ExecuteScalar();
奇迹般有效。
回答
SCOPE_IDENTITY();是我们最好的选择。如果我们使用的是.NET,则只需传递一个我们的参数,然后在执行该过程后检查该值。
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();
回答
如果要插入多行,则在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
回答
我倾向于使用企业管理器将触发器添加到表上。这样,我们不必担心在代码中写出多余的sql语句。我的看起来像这样:
创建触发器tblName
在dbo.tblName上
对于插入
作为
选择new_id = @@ IDENTITY
然后,从代码中,像选择语句一样对待插入语句。只需执行并评估结果即可。 " newID"列将包含我们刚刚创建的行的标识。