Sql server 如何在SQL server查询中将变量(@id)作为自动增量插入表中?

Sql server 如何在SQL server查询中将变量(@id)作为自动增量插入表中?,sql-server,tsql,sql-insert,Sql Server,Tsql,Sql Insert,我想将@id值作为自动增量插入Items表中 表名=项目 Columns=代码、名称 列代码不允许空值,并且是唯一的,但没有自动递增, 我试图编写一个查询,它将代码列中的值(1,2,3,4,…)填充为自动增量,但它不起作用 这是我的问题 DECLARE @id INT SET @id = (select MAX(Code) from Items) SET @id =@id+1 insert into Items (Code,Name) values(@id,'m') 这就是错误所在 Ms

我想将@id值作为自动增量插入Items表中

表名=项目 Columns=代码、名称

列代码不允许空值,并且是唯一的,但没有自动递增, 我试图编写一个查询,它将代码列中的值(1,2,3,4,…)填充为自动增量,但它不起作用

这是我的问题

DECLARE @id INT 
SET @id = (select MAX(Code) from Items)

SET @id =@id+1

insert into Items (Code,Name) values(@id,'m')
这就是错误所在

Msg 515,16级,状态2,第6行 无法将空值插入“代码”列、表“项目”中;列不允许空值。插入失败。 声明已终止

我希望@id作为自动增量插入到代码列中


任何人都可以帮我。

我可以假定您的桌子是空的吗

在这种情况下,

SET @id = (select MAX(Code) from Items)
是空的

所以

也为空

正确的代码是:

SET @id = (select ISNULL(MAX(Code),0) from Items)
当没有行时,它将返回数字0


典型的初学者SQL错误-请注意SQL中NULL的“有毒”性质,它会将它涉及的所有内容都转换为-NULL。

我可以假定您的表是空的吗

在这种情况下,

SET @id = (select MAX(Code) from Items)
是空的

所以

也为空

正确的代码是:

SET @id = (select ISNULL(MAX(Code),0) from Items)
当没有行时,它将返回数字0


典型的初学者SQL错误-请注意SQL中NULL的“有毒”性质,它会将它涉及的所有内容都转换为-NULL。

如果使用@id,则可能会在这两个语句之间更改它

因为下面是一条语句,所以您不需要将其包装在事务中

insert into Items (Code, Name) 
select MAX(Code) + 1, 'm'
  from items
我认为这是处理空项目的

insert into Items (Code, Name) 
select isnull(MAX(Code), 0) + 1, 'm'
  from items

如果您使用@id,则可能会在两个语句之间更改它

因为下面是一条语句,所以您不需要将其包装在事务中

insert into Items (Code, Name) 
select MAX(Code) + 1, 'm'
  from items
我认为这是处理空项目的

insert into Items (Code, Name) 
select isnull(MAX(Code), 0) + 1, 'm'
  from items

您使用的是什么数据库?您使用的是什么数据库?select和INSERTRYES之间存在一个risk MAX(Code)/@id更改是和否。此问题与锁定无关。在很多情况下,这都不是问题——从在可序列化锁定下运行的代码到在单线程ETL过程中运行的代码。我回答了这个问题,假设OP知道站点规则(提供最少的复制示例代码,忽略所有其他元素),并且有大量的场景存在问题。OP的一个基本问题得分为8,您假设他们了解站点规则和锁定?select和INSERTRYES和no之间存在风险MAX(代码)/@id更改。此问题与锁定无关。在很多情况下,这都不是问题——从在可序列化锁定下运行的代码到在单线程ETL过程中运行的代码。我回答了这个问题,假设OP知道站点规则(提供最少的复制示例代码,忽略所有其他元素),并且有大量的场景存在问题。OP的基本问题得分为8分,你认为他们了解网站规则和锁定?