Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 实际插入的行ID_Sql Server_Insert - Fatal编程技术网

Sql server 实际插入的行ID

Sql server 实际插入的行ID,sql-server,insert,Sql Server,Insert,在此语句中,我已在数据库中创建了表 CREATE TABLE tPerson ( id INT NOT NULL PRIMARY KEY identity(1,1) , name NVARCHAR(100) not null , email NVARCHAR(30) not null ) GO 现在我用insert插入新值。我的问题是如何获取当前添加行的id?任何想法???它看起来像SQL Server,如果是这样,只需使用: I

在此语句中,我已在数据库中创建了表

CREATE TABLE tPerson
    (
        id INT NOT NULL PRIMARY KEY identity(1,1)
        , name NVARCHAR(100) not null
        , email NVARCHAR(30) not null
    )
GO

现在我用insert插入新值。我的问题是如何获取当前添加行的id?任何想法???

它看起来像SQL Server,如果是这样,只需使用:

INSERT INTO dbo.tPerson(....) VALUES(.....)

DECLARE @NewID INT
SELECT @NewID = SCOPE_IDENTITY()
返回当前作用域中最后插入的标识值

旁注:“电子邮件”只有30个字符!?!?我通常会将该列设为表中最长的列—200个字符甚至更多:-)

试试看

SELECT @@IDENTITY AS LastID

插入后

对MS SQL Server使用
@@IDENTITY
SCOPE\u IDENTITY

假设使用SQL Server,您应该签出以更好地理解检索标识

下面是一个片段:

选择@@IDENTITY

它返回上一次生成的标识值 连接,而不考虑生成值的表,以及 无论生成值的语句的范围如何。 @@IDENTITY将返回在中输入到表中的最后一个IDENTITY值 您当前的会话。而@@IDENTITY仅限于当前 会话,它不限于当前范围。如果你有扳机 在导致在另一个表中创建标识的表上 将获取上次创建的标识,即使它是 触发了它

选择范围\标识()

它返回上一次生成的标识值 由同一范围内的语句创建的连接和,而不考虑 生成值的表。作用域_IDENTITY(),如@@IDENTITY,将 返回在当前会话中创建的最后一个标识值,但它 也会将其限制在您当前的范围内。换句话说,它 将返回您显式创建的最后一个标识值, 而不是由触发器或用户创建的任何标识 定义的函数

选择当前标识('tablename')

它返回最后一个标识值 在表中生成,而不考虑创建 值,而不考虑生成 价值当前标识不受范围和会话的限制;它是 仅限于指定的表。IDENT_CURRENT返回标识值 为任何会话和任何范围中的特定表生成


您还可以通过JDBC直接执行此操作,以避免选择,因为通常insert语句将返回您可能要验证的插入行数。Spring通过其JdbcTemplate支持这一点,请参见

哪个数据库?SQL Server?MySQL?神谕它们有不同的功能来实现这一点。对于SQL Server,请参阅MS SQL Server 2008 R2 ExpressI,我将在电子邮件栏中使用70个字符来确保这一点。我当前的工作电子邮件有34个字符-
@@IDENTITY
可能会意外返回错误的结果…我建议始终使用
SCOPE\u IDENTITY()
-其他选项通常会产生意外的副作用和结果…不要忘记OUTPUT子句。这是可靠的!