Sql server 如何在SQL server查询中将变量(@id)作为自动增量插入表中?
我想将@id值作为自动增量插入Items表中 表名=项目 Columns=代码、名称 列代码不允许空值,并且是唯一的,但没有自动递增, 我试图编写一个查询,它将代码列中的值(1,2,3,4,…)填充为自动增量,但它不起作用 这是我的问题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
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分,你认为他们了解网站规则和锁定?