Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Проверка значения Null в Transact-SQL  [new]
Странный Хомяк
Guest
Добрый день.
Необходимо проверить есть ли запись в таблице и если ее нет, добавить и получить ее ID. По моим соображениям должно выглядеть примерно так:
DECLARE @TraipID int

SELECT 
    @TripID=ID
FROM
    <таблица>
WHERE
    <условия>

IF @TripID=Null
BEGIN
    <добавить строку>
    SELECT @TripID=@@IDENTITY
END


Но у меня не происходит добавления записи, ни получения ID
18 дек 13, 14:04    [15311197]     Ответить | Цитировать Сообщить модератору
 Re: Проверка значения Null в Transact-SQL  [new]
DmitryVT
Member

Откуда: VRN
Сообщений: 192
DECLARE @TraipID int

SET @TraipID = (SELECT ... FROM ... WHERE ...)

IF @TraipID IS NULL
BEGIN
   INSERT .....
   SET @TraipID = (SELECT @@IDENTITY)
END
18 дек 13, 14:12    [15311297]     Ответить | Цитировать Сообщить модератору
 Re: Проверка значения Null в Transact-SQL  [new]
pio777
Member

Откуда:
Сообщений: 127
Странный Хомяк,

Значит ваш селект козвращает хотя-бы один айдишник. Выполните эту часть и убедитесь.
SELECT 
    ID
FROM
    <таблица>
WHERE
    <условия>
18 дек 13, 14:19    [15311392]     Ответить | Цитировать Сообщить модератору
 Re: Проверка значения Null в Transact-SQL  [new]
pio777
Member

Откуда:
Сообщений: 127
DmitryVT,

Переменную можно присваивать не только через SET, но и SELECT.
18 дек 13, 14:20    [15311407]     Ответить | Цитировать Сообщить модератору
 Re: Проверка значения Null в Transact-SQL  [new]
Странный Хомяк
Guest
Спасибо!
18 дек 13, 14:22    [15311428]     Ответить | Цитировать Сообщить модератору
 Re: Проверка значения Null в Transact-SQL  [new]
Dmitry V. Liseev
Member [заблокирован]

Откуда: Санкт-Петербург
Сообщений: 5489
pio777
DmitryVT,

Переменную можно присваивать не только через SET, но и SELECT.
Дело не в этом. Просто =NULL вместо IS NULL было.
18 дек 13, 14:49    [15311756]     Ответить | Цитировать Сообщить модератору
 Re: Проверка значения Null в Transact-SQL  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
Может, проще MERGE написать?

А получение IDENTITY разными функциями сильно зависит от триггеров таблицы на INSERT.
Про эти триггеры мы ничего не знаем...
18 дек 13, 15:12    [15311995]     Ответить | Цитировать Сообщить модератору
 Re: Проверка значения Null в Transact-SQL  [new]
_djХомяГ
Guest
получить значение (если сервер >=2005) можно через клаузу OUTPUT
18 дек 13, 15:24    [15312090]     Ответить | Цитировать Сообщить модератору
 Re: Проверка значения Null в Transact-SQL  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
_djХомяГ
получить значение (если сервер >=2005) можно через клаузу OUTPUT
Если нет триггера INSTEAD OF INSERT
18 дек 13, 15:46    [15312262]     Ответить | Цитировать Сообщить модератору
 Re: Проверка значения Null в Transact-SQL  [new]
лолл
Member

Откуда:
Сообщений: 450
DmitryVT,

Используйте SCOPE_IDENTITY()
19 дек 13, 09:28    [15315263]     Ответить | Цитировать Сообщить модератору
 Re: Проверка значения Null в Transact-SQL  [new]
DmitryVT
Member

Откуда: VRN
Сообщений: 192
поясните пожалуйста в кратце разницу между

SCOPE_IDENTITY() и @@IDENTITY

справку прочел но как то не все усвоилось

заранее спасибо!!!
19 дек 13, 09:54    [15315418]     Ответить | Цитировать Сообщить модератору
 Re: Проверка значения Null в Transact-SQL  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31438
DmitryVT
SCOPE_IDENTITY() и @@IDENTITY

справку прочел но как то не все усвоилось
@@IDENTITY старая, SCOPE_IDENTITY() новая.

BOL
Функции SCOPE_IDENTITY и @@IDENTITY возвращают последние значения идентификатора, созданные в таблицах во время текущего сеанса. Однако функция SCOPE_IDENTITY возвращает значения, вставленные только в рамках текущей области, тогда как действие функции @@IDENTITY не ограничивается никакими областями.

Например, существует две таблицы, T1 и T2, и для таблицы T1 определен триггер INSERT. Когда в таблицу T1 вставляется строка, триггер срабатывает и добавляет строку в таблицу T2. В этом сценарии используются две области: вставка в таблицу T1 и вставка триггером в таблицу T2.

Допуская, что столбец идентификаторов имеется в обеих таблицах, T1 и T2, функции @@IDENTITY и SCOPE_IDENTITY вернут разные значения в конце инструкции INSERT в таблице T1. Функция @@IDENTITY возвращает значение столбца идентификаторов, добавленное в текущем сеансе последним во всех областях. Это значение, вставленное в таблицу T2. Функция SCOPE_IDENTITY() возвратит значение IDENTITY, вставленное в таблицу T1. Это было последним добавлением, произошедшим в заданной области.
19 дек 13, 10:07    [15315493]     Ответить | Цитировать Сообщить модератору
 Re: Проверка значения Null в Transact-SQL  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31438
iap
_djХомяГ
получить значение (если сервер >=2005) можно через клаузу OUTPUT
Если нет триггера INSTEAD OF INSERT
Ну вообще если есть триггер INSTEAD OF INSERT, то OUTPUT вообще не показывает то, что вставленно в таблицу, что в общем довольно логично.
Он просто выдаёт тот набор данных, который передан триггеру. Поэтому поле IDENTITY, так же как и все остальные поля, не будет показано.
19 дек 13, 10:15    [15315569]     Ответить | Цитировать Сообщить модератору
 Re: Проверка значения Null в Transact-SQL  [new]
DmitryVT
Member

Откуда: VRN
Сообщений: 192
Спасибо за разъяснение
19 дек 13, 10:16    [15315578]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить