不存在行的SQL递增值

不存在行的SQL递增值,sql,sql-server,case,Sql,Sql Server,Case,我有一个带有字段的表:UserProjectNumber,这只是一个int字段,需要每次递增一。我目前使用下面的INSERT语句递增这个数字。只要表中已有此用户的记录,此操作就可以正常工作。如果这是第一次运行该语句,它将失败,因为它无法将1添加到NULL INSERT INTO UserProject (UserID, UserProjectName, UserProjectNumber) VALUES (2, 'Test', CASE WHEN (SELECT MAX(UserProje

我有一个带有字段的表:UserProjectNumber,这只是一个int字段,需要每次递增一。我目前使用下面的INSERT语句递增这个数字。只要表中已有此用户的记录,此操作就可以正常工作。如果这是第一次运行该语句,它将失败,因为它无法将1添加到NULL

INSERT INTO UserProject (UserID, UserProjectName,  UserProjectNumber) 
VALUES  (2, 'Test', CASE WHEN (SELECT MAX(UserProjectNumber) FROM UserProject WHERE UserID=2)= NULL THEN 0 ELSE (SELECT MAX(UserProjectNumber) FROM UserProject WHERE UserID=2)+1 END )
我正在使用MS SQL Server 2012。有人能提出解决这个问题的办法吗?也许以某种方式将空值转换为0

谢谢

也许这样可以:

    declare @UserProject as Table
      ( UserProjectId Int Identity, UserId Int, UserProjectName VarChar(32), UserProjectNumber Int );

    insert into @UserProject ( UserId, UserProjectName, UserProjectNumber ) values
      ( 2, 'Test', ( select IsNull( Max( UserProjectNumber ), 0 ) + 1 from @UserProject where UserId = 2 ) );
    insert into @UserProject ( UserId, UserProjectName, UserProjectNumber ) values
      ( 2, 'Alpha', ( select IsNull( Max( UserProjectNumber ), 0 ) + 1 from @UserProject where UserId = 2 ) );
    insert into @UserProject ( UserId, UserProjectName, UserProjectNumber ) values
      ( 1, 'Aleph', ( select IsNull( Max( UserProjectNumber ), 0 ) + 1 from @UserProject where UserId = 1 ) );
    insert into @UserProject ( UserId, UserProjectName, UserProjectNumber ) values
      ( 2, 'Beta', ( select IsNull( Max( UserProjectNumber ), 0 ) + 1 from @UserProject where UserId = 2 ) );
    insert into @UserProject ( UserId, UserProjectName, UserProjectNumber ) values
      ( 1, 'Beth', ( select IsNull( Max( UserProjectNumber ), 0 ) + 1 from @UserProject where UserId = 1 ) );

    select *
      from @UserProject
      order by UserId, UserProjectNumber;
当允许用户删除项目时,
UserProjectNumber
列的维护就会出现问题。这些数字应该保持密集吗?新项目是否应该重用旧数字

如果添加
UserProjectNumber
的目的仅仅是为了显示,那么使用
Row\u number()over(按UserId按UserProjectName划分)
动态生成一个数字或将其留给应用程序可能更有意义


如果目的是强制每个用户执行六个项目的限制,那么使用
Count()
的约束或触发器可能是更好的选择。

给出错误:无法将值NULL插入“UserProjectDeadline”列,表“dbo.UserProject”;列不允许空值。INSERT失败。@请为UserProjectDeadline提供一个值(或添加一个默认约束)。请注意,它不是已指定的字段之一。@user2246674它已具有默认约束1,但我正在通过asp.net插入记录,因此需要分离我试图避免的语句。是否存在使用
IDENTITY
列不可接受的原因?@HABO-仍然给出有关插入NULL的相同错误价值标识列是此表的主键。用户只能有6个项目-编号1到编号6-在这种情况下,身份号码将不可行,因为它可能有数百万。ROW_Number()正是我所寻找的-我甚至不知道它的存在!谢谢
    declare @UserProject as Table
      ( UserProjectId Int Identity, UserId Int, UserProjectName VarChar(32), UserProjectNumber Int );

    insert into @UserProject ( UserId, UserProjectName, UserProjectNumber ) values
      ( 2, 'Test', ( select IsNull( Max( UserProjectNumber ), 0 ) + 1 from @UserProject where UserId = 2 ) );
    insert into @UserProject ( UserId, UserProjectName, UserProjectNumber ) values
      ( 2, 'Alpha', ( select IsNull( Max( UserProjectNumber ), 0 ) + 1 from @UserProject where UserId = 2 ) );
    insert into @UserProject ( UserId, UserProjectName, UserProjectNumber ) values
      ( 1, 'Aleph', ( select IsNull( Max( UserProjectNumber ), 0 ) + 1 from @UserProject where UserId = 1 ) );
    insert into @UserProject ( UserId, UserProjectName, UserProjectNumber ) values
      ( 2, 'Beta', ( select IsNull( Max( UserProjectNumber ), 0 ) + 1 from @UserProject where UserId = 2 ) );
    insert into @UserProject ( UserId, UserProjectName, UserProjectNumber ) values
      ( 1, 'Beth', ( select IsNull( Max( UserProjectNumber ), 0 ) + 1 from @UserProject where UserId = 1 ) );

    select *
      from @UserProject
      order by UserId, UserProjectNumber;