Sql server SQL Server:为新添加的行选择主键号

Sql server SQL Server:为新添加的行选择主键号,sql-server,select,identity,Sql Server,Select,Identity,我目前正在使用 SELECT MAX(CustomerID)... 要选择表的主键CustomerID,请选择新添加行的编号,因为我需要将此编号用于另一个将其用作外键的表。通过INSERT添加一行,然后依次执行一个SELECT查询 在SQLServerManagementStudio的column属性下,我看到标识增量设置为1。使用MAX(CustomerID)获取所需信息是否有不安全的原因?此过程的代码始终为“一行插入和一个选择查询”。如果有更好的方法,那会是什么?也许,在某种程度上,“给我

我目前正在使用

SELECT MAX(CustomerID)...
要选择表的主键
CustomerID
,请选择新添加行的编号,因为我需要将此编号用于另一个将其用作外键的表。通过
INSERT
添加一行,然后依次执行一个
SELECT
查询


在SQLServerManagementStudio的column属性下,我看到
标识增量
设置为
1
。使用
MAX(CustomerID)
获取所需信息是否有不安全的原因?此过程的代码始终为“一行插入和一个选择查询”。如果有更好的方法,那会是什么?也许,在某种程度上,“给我新添加行的
CustomerID

您建议的
MAX(CustomerID)
方法在并发条件下(以及当表为空时)会失败

使用
SELECT SCOPE\u IDENTITY()
OUTPUT
子句。下面是两个例子

CREATE TABLE #Customers
(
CustomerID INT IDENTITY(1,1) PRIMARY KEY,
Name VARCHAR(50)
)

INSERT INTO #Customers
(Name) 
VALUES ('Customer 1')

SELECT SCOPE_IDENTITY()

INSERT INTO #Customers
(Name) 
OUTPUT inserted.CustomerID
VALUES ('Customer 1')


DROP TABLE #Customers

你很了解这一点,也非常感谢你的例子!我测试了SECOPE_身份,效果很好。关于什么时候失败,在我描述的过程查询中,我会遇到“空表”问题吗?此外,您提到的“并发条件”指的是并发数据库连接?@user796837-
MAX(CustomerID)
在表中没有行时将为
NULL
。显然,仅当您在插入之前进行检查时才适用,而且使用
ISNULL
很容易绕过这一点。主要问题是并发数据库连接。因为无法保证在执行
插入
和检查
最大值
之间的另一个连接不会插入另一行,在这种情况下,您将返回错误行的
id