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

Откуда: г. Калуга
Сообщений: 1198
Надо сгородить что-то подобное

    IF EXISTS(
    ;With GiveCpn as
    (Select 1 as Number
     union all
     Select Number + 1 from GiveCpn where Number + 1 <= 5)
     
      select * 
      from GiveCpn GC
      where not Exists (  
      SELECT 
        1
      FROM 
        dbo.CouponsStore 
      Where CouponCode = 1 and SeriesID = 1 and GC.Number >= FirstNumber and GC.Number <= LastNumber))
    begin
      RAISERROR (@ErrorMsg, 16, 1)
    end  


собственно запрос то рабочий, как теперь проверить, возвращает он записи или нет? Вариант с @@RowCount не устраивает, т.к. в этом случае процедура вернет набор данных, чего не хотелось бы. Какие варианты?
21 янв 14, 16:21    [15447768]     Ответить | Цитировать Сообщить модератору
 Re: проверить возвращает ли запрос данные в ХП  [new]
Glory
Member

Откуда:
Сообщений: 104760
Это теперь модно, все запросы начинать с ;With ?
21 янв 14, 16:24    [15447797]     Ответить | Цитировать Сообщить модератору
 Re: проверить возвращает ли запрос данные в ХП  [new]
Кот Матроскин
Member

Откуда: Москва
Сообщений: 8933
minva
Вариант с @@RowCount не устраивает, т.к. в этом случае процедура вернет набор данных, чего не хотелось бы. Какие варианты?

Избежать возврата набора данных крайне просто - вместо select ... сделать select ... into #t
Но Glory Вам правильно намекает, что избавиться от with - гораздо более прямой способ.
21 янв 14, 16:33    [15447869]     Ответить | Цитировать Сообщить модератору
 Re: проверить возвращает ли запрос данные в ХП  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Glory
Это теперь модно, все запросы начинать с ;With ?
Однако, CTE-то рекурсивное...

Недоработка Microsoft просматривается. И давно
21 янв 14, 16:43    [15447957]     Ответить | Цитировать Сообщить модератору
 Re: проверить возвращает ли запрос данные в ХП  [new]
Glory
Member

Откуда:
Сообщений: 104760
iap
Glory
Это теперь модно, все запросы начинать с ;With ?
Однако, CTE-то рекурсивное...

Не смешите меня - это последовательный набор чисел от 1 до 5
21 янв 14, 17:01    [15448110]     Ответить | Цитировать Сообщить модератору
 Re: проверить возвращает ли запрос данные в ХП  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
minva
Какие варианты?
1. Завести уже наконец в БД таблицу натуральных чисел.
2. Если п.1 будет проигнорирован, на основе CTE сделать инлайновую параметризованную функцию.
21 янв 14, 17:01    [15448115]     Ответить | Цитировать Сообщить модератору
 Re: проверить возвращает ли запрос данные в ХП  [new]
minva
Member

Откуда: г. Калуга
Сообщений: 1198
Glory, это в примере набор чисел, в реальной жизни там переменные будут.

Есть два диапазона (2 записи в базе) 101-200 и 250-300. Можно выдать номера внутри диапазона, т.е. 120-150 или из дух диапазонов, если они последовательны (101-200 и 201-300 - можно выдать 120-150) Вот мне надо выдать ошибку если выдаваемые номера частично не входят ни в один диапазон. Это собственно задача, другого способа решения я пока не придумал
21 янв 14, 17:07    [15448153]     Ответить | Цитировать Сообщить модератору
 Re: проверить возвращает ли запрос данные в ХП  [new]
Glory
Member

Откуда:
Сообщений: 104760
minva
Glory, это в примере набор чисел, в реальной жизни там переменные будут.

Ну тогда, дооо, без рекурсивного запроса это просто невозможно решить.
21 янв 14, 17:09    [15448166]     Ответить | Цитировать Сообщить модератору
 Re: проверить возвращает ли запрос данные в ХП  [new]
minva
Member

Откуда: г. Калуга
Сообщений: 1198
Glory, это сарказм? пока другого способа не придумал

* ( (101-200 и 201-300 - можно выдать 120-250))
21 янв 14, 17:14    [15448205]     Ответить | Цитировать Сообщить модератору
 Re: проверить возвращает ли запрос данные в ХП  [new]
Glory
Member

Откуда:
Сообщений: 104760
minva
пока другого способа не придумал

* ( (101-200 и 201-300 - можно выдать 120-250))

Причем тут это ?
Проверка того, возвращает ли запрос данные, НЕ должна возвращать ВСЕ эти данные.
21 янв 14, 17:22    [15448241]     Ответить | Цитировать Сообщить модератору
 Re: проверить возвращает ли запрос данные в ХП  [new]
minva
Member

Откуда: г. Калуга
Сообщений: 1198
Glory,
то ли мы друг друга не понимаем, то ли я дурак. Ну напишу я Select top 1 * ..... что принципиально изменится? Вопрос в том, что ВЫ сказали, что я with зря заюзал, вот я и спрашиваю, есть ли другой способ.

PS Под словом выдать я имел ввиду выдать пользователю талоны с такими номерами, а не выдать в запросе. Мне нужно проверить входят ли эти номера в диапазоны прописанные в базе или нет
21 янв 14, 17:28    [15448281]     Ответить | Цитировать Сообщить модератору
 Re: проверить возвращает ли запрос данные в ХП  [new]
Glory
Member

Откуда:
Сообщений: 104760
Это элементарная задача. Называется она пересечение отрезков.
Два отрезка XY и AB пересекаются, если начало 1го отрезка меньше-равно концу 2го отрезка и конец 1го отрезка больше-равен началу 2го отрезка. Т.е. если X <= B and Y >=A
21 янв 14, 19:18    [15448862]     Ответить | Цитировать Сообщить модератору
 Re: проверить возвращает ли запрос данные в ХП  [new]
minva
Member

Откуда: г. Калуга
Сообщений: 1198
Glory, на пальцах то я это и сам знаю, запрос такой написать не получилось. :(

 
FirsNumber LastNumber
10            20
21            30
35            40


Отрезки, которые надо сравнить:
1. 15-25 удовлетворяет условию, т.к. он пересекается, но 10-20 и 21-30 идут подряд, "дырок" нет
2. 25-35 НЕ удовлетворяет условию, т.к. номеров 31-34 в таблице нет
22 янв 14, 10:22    [15450672]     Ответить | Цитировать Сообщить модератору
 Re: проверить возвращает ли запрос данные в ХП  [new]
Glory
Member

Откуда:
Сообщений: 104760
minva
Отрезки, которые надо сравнить:
1. 15-25 удовлетворяет условию, т.к. он пересекается, но 10-20 и 21-30 идут подряд, "дырок" нет

Складывать отрезки тоже никто не догадался ?
Статью про это Ицик Бен Ган написал уже лет 10 назад, по интернету она уже наверное расползлась тысячами вариантов
22 янв 14, 10:29    [15450719]     Ответить | Цитировать Сообщить модератору
 Re: проверить возвращает ли запрос данные в ХП  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Glory
iap
пропущено...
Однако, CTE-то рекурсивное...

Не смешите меня - это последовательный набор чисел от 1 до 5
Ничего смешного: рекурсивные запросы примером автора этой темы не ограничиваются.
А в EXISTS() запрос с рекурсивным CTE не вставишь - это безобразие.
22 янв 14, 10:37    [15450771]     Ответить | Цитировать Сообщить модератору
 Re: проверить возвращает ли запрос данные в ХП  [new]
Glory
Member

Откуда:
Сообщений: 104760
iap
Ничего смешного: рекурсивные запросы примером автора этой темы не ограничиваются.

Смешно, когда рекурсивные запросы суют во все места.
22 янв 14, 10:39    [15450784]     Ответить | Цитировать Сообщить модератору
 Re: проверить возвращает ли запрос данные в ХП  [new]
minva
Member

Откуда: г. Калуга
Сообщений: 1198
Glory
Складывать отрезки тоже никто не догадался ?
Статью про это Ицик Бен Ган написал уже лет 10 назад, по интернету она уже наверное расползлась тысячами вариантов


Догадаться можно много до чего, не получается это реализовать в виде запроса!!! За Бен Гана спасибо, не знал такого, почитаю его книжку, но пока мне нужно решить мою задачу, хоть ссылку дайте на статью
22 янв 14, 10:53    [15450852]     Ответить | Цитировать Сообщить модератору
 Re: проверить возвращает ли запрос данные в ХП  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
minva
не получается это реализовать в виде запроса!!!
Мда, не читатель...

Функция
create function dbo.fnNumbers
(
 @Amount int
)
returns table
as
return (
 with GiveCpn as
 (
  Select 1 as Number
  union all
  Select Number + 1 from GiveCpn where Number + 1 <= @Amount
 )
 select Number from GiveCpn
);
Запрос
IF EXISTS(
     select * 
      from db.fnNumbers(5) GC
      where not Exists (  
      SELECT 
        1
      FROM 
        dbo.CouponsStore 
      Where CouponCode = 1 and SeriesID = 1 and GC.Number >= FirstNumber and GC.Number <= LastNumber))
    begin
      RAISERROR (@ErrorMsg, 16, 1)
    end  
22 янв 14, 11:41    [15451239]     Ответить | Цитировать Сообщить модератору
 Re: проверить возвращает ли запрос данные в ХП  [new]
minva
Member

Откуда: г. Калуга
Сообщений: 1198
invm, спасибо, на основе рекурсии я и сам сделал, без функции, но все прекрасно вышло. Свою задачу то я решил
Тут уже принципиальный вопрос в том, как это без рекурсии сделать :) Просто интересно стало
22 янв 14, 13:30    [15451942]     Ответить | Цитировать Сообщить модератору
 Re: проверить возвращает ли запрос данные в ХП  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
minva
Тут уже принципиальный вопрос в том, как это без рекурсии сделать :) Просто интересно стало

invm
minva
Какие варианты?
1. Завести уже наконец в БД таблицу натуральных чисел.
22 янв 14, 13:46    [15452030]     Ответить | Цитировать Сообщить модератору
 Re: проверить возвращает ли запрос данные в ХП  [new]
Glory
Member

Откуда:
Сообщений: 104760
minva
За Бен Гана спасибо, не знал такого, почитаю его книжку, но пока мне нужно решить мою задачу, хоть ссылку дайте на статью

Это сама статья - http://www.osp.ru/win2000/2013/09/13037077/
Это сжатый пример - http://www.sqlbooks.ru/readarticle.aspx?part=09&file=addition11
22 янв 14, 14:05    [15452128]     Ответить | Цитировать Сообщить модератору
 Re: проверить возвращает ли запрос данные в ХП  [new]
aleks2
Guest
invm
minva
Тут уже принципиальный вопрос в том, как это без рекурсии сделать :) Просто интересно стало

invm
пропущено...
1. Завести уже наконец в БД таблицу натуральных чисел.



Не, ну рекурсия и таблица в данном конкретном случае - полное фуфло.

Можно сделать без времянок,но проще с ними.

declare @t table(fn int, ln int, id int identity);
insert @t(fn, ln)
values
  (10,            20)
, (21,            30)
, (35,            40);

-- 1 преобразуем интервалы в дырки
declare @b table(n int, id int identity primary key clustered);
declare @e table(n int, id int identity primary key clustered);

insert @b(n) values(-200000000) -- дохера, короче
insert @b(n)
  select ln+1 from @t t where not exists( select * from @t tt where t.id<>tt.id and t.ln+1 between tt.fn and tt.ln)
    order by ln;

select * from @b

insert @e(n)
  select fn-1 from @t t where not exists( select * from @t tt where t.id<>tt.id and t.fn-1 between tt.fn and tt.ln)
    order by fn;
insert @e(n) values(200000000) -- дохера, короче

select * from @e

-- дырки
declare @h table(fn int, ln int, id int identity);
insert @h(fn, ln)
  select b.n, e.n from @b b inner join @e e on b.id = e.id;

select * from @h

declare @ib int = 15, @ie int = 25

if exists( select * from @h where @ib <= ln and fn <= @ie )
  print 'Засада!'
else  
  print 'Нет засады.'

select @ib = 25, @ie = 35

if exists( select * from @h where @ib <= ln and fn <= @ie )
  print 'Засада!'
else  
  print 'Нет засады.'
22 янв 14, 19:54    [15453928]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить