0

我有一个带有字段的表: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。有人可以提出解决此问题的方法吗?也许以某种方式将 NULL 转换为 0?

谢谢

4

2 回答 2

1

也许这会做:

    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_Number() over ( partition by UserId order by UserProjectName )或将其留给应用程序可能更有意义。

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

于 2013-07-27T02:16:40.250 回答
0
INSERT INTO UserProject (UserID, UserProjectName,  UserProjectNumber) 
VALUES  (2, 'Test', ISNULL((SELECT MAX(UserProjectNumber) FROM UserProject WHERE UserID=2),0)+1)
于 2013-07-27T00:31:53.817 回答