2013-07-27 2 views
0

У меня есть таблица с полем: UserProjectNumber, это просто поле int, которое нужно увеличивать на единицу каждый раз. В настоящее время я увеличиваю это число с помощью следующего оператора INSERT. Это работает отлично, поскольку в этом случае для этого пользователя уже есть запись. Если это первый раз, когда оператор выполняется она не потому, что он не может добавить 1 к NULLSQL Incrementing Value для несуществующей строки

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?

Благодаря

+0

Есть ли причина, по которой использование столбца 'IDENTITY' является неприемлемым? – HABO

+0

@HABO - Все еще дает ту же ошибку, что и вставка значения NULL. Столбец Identity - это PK для этой таблицы. Пользователь может иметь только 6 проектов - номер 1 - номер 6 - идентификационный номер не будет жизнеспособным по этому случаю, как это могло бы быть в миллионах. – James

ответ

1

Mayhaps это будет делать:

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(), или триггер, может быть лучшим выбором.

+0

ROW_NUMBER() ЯВЛЯЕТСЯ ТОЧНО, что я был ищу - я даже не знал, что существует! Благодаря! – James

0
INSERT INTO UserProject (UserID, UserProjectName, UserProjectNumber) 
VALUES (2, 'Test', ISNULL((SELECT MAX(UserProjectNumber) FROM UserProject WHERE UserID=2),0)+1) 
+0

GIVES ERROR: Невозможно вставить значение NULL в столбец «UserProjectDeadline», таблицу «dbo.UserProject»; столбец не допускает нулей. INSERT терпит неудачу. – James

+2

@James Поставьте значение для * UserProjectDeadline * (или добавьте ограничение DEFAULT). Обратите внимание, что это * не * одно из уже заданных полей. – user2246674

+0

@ user2246674 Да, duh .. –

Смежные вопросы