Почему оператор OUTPUT при вставке в таблицу внутри предложения IF возвращает ноль во втором столбце? - PullRequest
0 голосов
/ 22 марта 2012

Вот мой код "upsert":

UPDATE LastTicket SET LastTicketNumber=LastTicketNumber+1
    OUTPUT INSERTED.LastTicketNumber WHERE CategoryId='1';

IF @@ROWCOUNT=0 INSERT INTO LastTicket (CategoryId,LastTicketNumber)
    OUTPUT INSERTED.LastTicketNumber VALUES ('1','2')

Итак, когда строка существует, она успешно обновляется, OUTPUT возвращает новый, увеличенный LastTicketNumber.

С другой стороны, когда строка не существует, сервер sql успешно создает ее и заполняет данными, которые я передаю SqlCommand (1,2). Таким образом, он создает строку, но возвращает null. Ничего не значит! Это почему? И почему, когда я заменяю «INSERTED.LastTicketNumber» на «INSERTED.CategoryId», НАЧИНАЕТСЯ возвращать ненулевое значение, идентификатор категории. Это почему? И как вернуть то, что мне нужно?

Таблица содержит только эти два столбца и некластеризованный первичный составной ключ в обоих из них.

(MSSQL 2008)

1 Ответ

2 голосов
/ 22 марта 2012

Если в таблице нет ни одной строки, то при первом запуске пакета он вернет два набора результатов: первый будет пустым (потому что нет строки для обновления), а второй содержит вставленный идентификатор.

Возможно, вы видите первый набор результатов, а не второй.

Попробуйте выполнить следующее:

DECLARE @t table (LastTicketNumber int)

UPDATE LastTicket SET LastTicketNumber=LastTicketNumber+1
    OUTPUT  INSERTED.LastTicketNumber INTO @t (LastTicketNumber) WHERE CategoryId='1';

IF @@ROWCOUNT=0 INSERT INTO LastTicket (CategoryId,LastTicketNumber)
    OUTPUT INSERTED.LastTicketNumber INTO @t (LastTicketNumber) VALUES ('1','2')

  select LastTicketNumber from @t
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...