2008-09-10 25 views

回答

32

在.NET中至少,你可以在一个去发送多个查询服务器。我在我的应用程序中这样做:

command.CommandText = "INSERT INTO [Employee] (Name) VALUES (@Name); SELECT SCOPE_IDENTITY()"; 
int id = (int)command.ExecuteScalar(); 

工程就像一个魅力。

+3

这个解决方案有当只处理单行更新。对于一个好的批量更新解决方案,请参阅kamajo的答案。 – CodeWarrior 2010-01-07 18:57:51

+1

对于那些正在寻找如何使用MySQL的人:只需将SCOPE_IDENTITY替换为LAST_INSERT_ID即可。 或者简单地在MySqlCommand上使用LastInsertedId参数; – 2011-10-04 14:14:43

1

你必须选择SCOPE_IDENTITY()函数。

要从应用程序代码执行此操作,我通常将此进程封装在存储过程中,因此它对于我的应用程序看起来仍然是一个查询。

2

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(); 
14

如果要插入多行,使用上insert声明OUTPUTINSERTED.columnname条款的是让所有的IDS到一个临时表的简单方法。

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 
1

我倾向于使用企业管理器来附加触发器到表。这样你就不用担心在代码中写出额外的sql语句。煤矿是这个样子:

创建触发器tblName 在dbo.tblName 对于插入 作为 选择NEW_ID = @@ IDENTITY

然后,从你的代码中,对待你的INSERT语句像选择报表─只是执行和评估结果。 “newID”列将包含您刚刚创建的行的标识。

相关问题