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

Откуда:
Сообщений: 14
DECLARE @str NVARCHAR(50)
DECLARE @INDEX INT
IF @INDEX = 0
SET @str = ' AND fil_code = 12'
ELSE IF @INDEX = 1
SET @str = ' AND fil_code = 13'
ELSE
SET @str = ''
SELECT required_stages FROM TBL where region = 45 + @str

Подскажите пожалуйста как правильно поставить переменную @str,
Спасибо.
14 май 18, 10:49    [21407384]     Ответить | Цитировать Сообщить модератору
 Re: Переменная в where  [new]
aleks222
Member

Откуда:
Сообщений: 952
declare @fil_code int = case @INDEX when 0 then 12 when 1 then 13 end ;
SELECT required_stages FROM TBL where region = 45 
                                                                     and   (fil_code  = @fil_code or @fil_code is null);
14 май 18, 11:09    [21407459]     Ответить | Цитировать Сообщить модератору
 Re: Переменная в where  [new]
Tigran117
Member

Откуда:
Сообщений: 14
Спасибо aleks222

можно еще один вопрос, а если мне надо будет написать так'

DECLARE @str NVARCHAR(50)
DECLARE @INDEX INT
IF @INDEX = 0
SET @str = ' AND fil_code IN (12, 14, 45)'
ELSE IF @INDEX = 1
SET @str = ' AND fil_code IN (13, 16)'
ELSE
SET @str = ''
SELECT required_stages FROM TBL where region = 45 + @str
14 май 18, 11:36    [21407555]     Ответить | Цитировать Сообщить модератору
 Re: Переменная в where  [new]
aleks222
Member

Откуда:
Сообщений: 952
можно еще один вопрос, а если мне надо будет написать так

declare @ids table( id int primary key);
DECLARE @INDEX INT
IF @INDEX = 0
  insert@ids
      values(12), (14), (45);
ELSE IF @INDEX = 1
  insert@ids
      values(13), (16);

SELECT required_stages FROM TBL where region = 45  and ( fil_code in ( select id from @ids) or not exists(select id from @ids) )


Ну, а по-уму, это решается таблицей-справочником
index, fil_code
14 май 18, 11:41    [21407580]     Ответить | Цитировать Сообщить модератору
 Re: Переменная в where  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
DECLARE
  @sText NVARCHAR(MAX),
  @sWhere NVARCHAR(50) = '',
  @index INT
;
...
IF @index = 0
  SET @sWhere = N' AND fil_code IN ( 12, 14, 45 )'
ELSE
IF @index = 1
  SET @sWhere = N' AND fil_code IN ( 13, 16 )'
;
SET @sText = N'SELECT required_stages FROM tbl WHERE region = 45' + @sWhere
;
EXECUTE sp_executesql @sText
;
14 май 18, 11:44    [21407590]     Ответить | Цитировать Сообщить модератору
 Re: Переменная в where  [new]
invm
Member

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

Никогда не делайте во так - 21407459
Это вариант из серии "прощай индексы".
14 май 18, 11:47    [21407601]     Ответить | Цитировать Сообщить модератору
 Re: Переменная в where  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
invm
Tigran117,
Никогда не делайте во так - 21407459
Это вариант из серии "прощай индексы".

Ну индекс-то по region будет работать...

Явно же код для выгрузки в отчетик / аналитику - а там можно и подождать... пару лет.
14 май 18, 11:50    [21407609]     Ответить | Цитировать Сообщить модератору
 Re: Переменная в where  [new]
Tigran117
Member

Откуда:
Сообщений: 14
Спасибо всем, все более чем понятно, все OK !!!
14 май 18, 13:09    [21407912]     Ответить | Цитировать Сообщить модератору
 Re: Переменная в where  [new]
Rankatan
Member

Откуда:
Сообщений: 250
invm
Tigran117,

Никогда не делайте во так - 21407459
Это вариант из серии "прощай индексы".

Можете прояснить о чем вы? Не вижу проблем с индексами в этом коде:
declare @fil_code int = case @INDEX when 0 then 12 when 1 then 13 end ;
SELECT required_stages FROM TBL where region = 45 and   (fil_code  = @fil_code or @fil_code is null);
14 май 18, 16:45    [21408792]     Ответить | Цитировать Сообщить модератору
 Re: Переменная в where  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Rankatan
invm
Tigran117,

Никогда не делайте во так - 21407459
Это вариант из серии "прощай индексы".

Можете прояснить о чем вы? Не вижу проблем с индексами в этом коде:
declare @fil_code int = case @INDEX when 0 then 12 when 1 then 13 end ;
SELECT required_stages FROM TBL where region = 45 and   (fil_code  = @fil_code or @fil_code is null);

а как вы смотрите?

но вообще OPTION (RECOMPILE) и будут индексы
14 май 18, 16:47    [21408799]     Ответить | Цитировать Сообщить модератору
 Re: Переменная в where  [new]
Rankatan
Member

Откуда:
Сообщений: 250
TaPaK
Rankatan
пропущено...

Можете прояснить о чем вы? Не вижу проблем с индексами в этом коде:
declare @fil_code int = case @INDEX when 0 then 12 when 1 then 13 end ;
SELECT required_stages FROM TBL where region = 45 and   (fil_code  = @fil_code or @fil_code is null);

а как вы смотрите?

но вообще OPTION (RECOMPILE) и будут индексы

Никак.
А почему без OPTION(REOMPILE) не будет работать индексы?
14 май 18, 16:52    [21408808]     Ответить | Цитировать Сообщить модератору
 Re: Переменная в where  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Rankatan
TaPaK
пропущено...

а как вы смотрите?

но вообще OPTION (RECOMPILE) и будут индексы

Никак.
А почему без OPTION(REOMPILE) не будет работать индексы?

ну если никак не смотрите, то оно вам и не надо
14 май 18, 16:53    [21408815]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить