Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Проверка на возвращение единственного значения  [new]
spectatorpiter
Member

Откуда: Санкт-Петербург
Сообщений: 20
Необходимо выбрать определенное значение, например ID, по другому значению и присвоить его переменной для дальнейшей обработки. Соответственно выбранное значение не должно равняться NULL и быть неоднозначным.

Подскажите как можно сократить ниже приведенную конструкцию, не теряя функциональности.


IF (SELECT ID FROM Table WHERE Name=@NAME) IS NOT NULL 
              AND (SELECT COUNT(ID) FROM Table WHERE Name=@NAME)=1
BEGIN
       ...
END;
26 мар 13, 10:38    [14095492]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на возвращение единственного значения  [new]
_djХомяГ
Guest
@@rowcount=1 -----однозначность
26 мар 13, 10:48    [14095532]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на возвращение единственного значения  [new]
wizli
Member

Откуда: Minsk
Сообщений: 270
Вот так можно сделать
if exists (select  count(t.ID)
		  ,t.name
	   from	   #t t
	   where   t.name = @name
	   group by t.name
	   having count(t.ID) = 1)
26 мар 13, 11:13    [14095693]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на возвращение единственного значения  [new]
spectatorpiter
Member

Откуда: Санкт-Петербург
Сообщений: 20
_djХомяГ,

IF (SELECT ID FROM Table WHERE Name=@NAME) IS NOT NULL 
              AND @@ROWCOUNT=1
BEGIN
       ...
END;


Не работает.

Так как я пишу логику в ХП мне ненужно что бы возвращались лишние данные, так что ниже приведенный вариант тоже не катит

SELECT ID FROM Table WHERE Name=@NAME
IF (SELECT ID FROM Table WHERE Name=@NAME) IS NOT NULL 
              AND @@ROWCOUNT=1
BEGIN
       ...
END;
26 мар 13, 11:13    [14095694]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на возвращение единственного значения  [new]
Glory
Member

Откуда:
Сообщений: 104760
spectatorpiter
Не работает.

Конечно не работает

declare @x int
set @x = null
select @x=id from sysobjects
if @x is not null and @@rowcount = 1
	select 'Success'
else
	select 'Failure'
26 мар 13, 11:17    [14095717]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на возвращение единственного значения  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
declare @ID int
select top 2 @ID = ID FROM Table WHERE Name=@NAME
if @@rowcount = 1 and @ID is not null begin
...
end
26 мар 13, 11:17    [14095723]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на возвращение единственного значения  [new]
spectatorpiter
Member

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

Это работает если запрос вернет 0, либо 1 значение. А если более 1?
26 мар 13, 11:18    [14095726]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на возвращение единственного значения  [new]
Glory
Member

Откуда:
Сообщений: 104760
spectatorpiter
Это работает если запрос вернет 0, либо 1 значение. А если более 1?

Вы мой запрос запускали ?
26 мар 13, 11:19    [14095736]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на возвращение единственного значения  [new]
spectatorpiter
Member

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

Сори, перепутал с SET.
26 мар 13, 11:20    [14095747]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на возвращение единственного значения  [new]
invm
Member

Откуда: Москва
Сообщений: 9633
Так вам надо присваивание в переменную или нет?
Если надо, то
select @id = id from Table where name = @name
if @@rowcount = 1
 begin
 ...
 end;

А если нет
if (select count(*) from Table where name = @name) = 1
 begin
 ...
 end;


ЗЫ: На уровне изоляции ниже serializable, такой код может приводить к проблемам в многопользовательском окружении.
26 мар 13, 11:23    [14095768]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на возвращение единственного значения  [new]
spectatorpiter
Member

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

Я просто для присвоения использовал SET, поэтому и проверял сначала получаемое значения, а потом только его присваивал.
Теперь переделаю под SELECT для оптимизации запроса.
26 мар 13, 11:31    [14095814]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на возвращение единственного значения  [new]
invm
Member

Откуда: Москва
Сообщений: 9633
На входе в begin ... end, при уровне изоляции ниже serializable, результат проверки уже недостоверен. А используете вы set или select не играет никакой роли.
Поэтому, если при обработке существенно отсутствие дубликатов, то, как минимум, нужно пользовать holdlock.
26 мар 13, 12:05    [14096045]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на возвращение единственного значения  [new]
spectatorpiter
Member

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

У меня вся ХП представляет собой одну транзакцию, а вот уровни изоляции уже зависят от контекста выполняемых в них операций.
26 мар 13, 12:47    [14096285]     Ответить | Цитировать Сообщить модератору
 Re: Проверка на возвращение единственного значения  [new]
invm
Member

Откуда: Москва
Сообщений: 9633
spectatorpiter,

Похоже, вы еще очень слабо себе представляете, что такое уровни изоляции транзакций и для чего они нужны.
Вот для начала -- Теоретические основы конкурентного доступа к данным.
26 мар 13, 12:51    [14096312]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить