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

Откуда:
Сообщений: 198
Здравствуйте! Хочу написать процедуру или функцию которой в качетсве параметра передается не одно значение а список значений , который в внутри используется после оператора IN. То есть внутри объекта будет к примеру такой простой select :

select * from test2 where shop in (@input)

вот в качестве @input мне и надо подставлять список значений. вобще складывается ощущение что без создания нового табличного типа здесь не обойтись. или все таки можно?
29 июн 11, 13:57    [10892879]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по TSQL  [new]
Врунгель
Member

Откуда:
Сообщений: 6
можно передать параметром XML, внутри твоей процедуры разобрать его во временную таблицу и работать с ней
29 июн 11, 14:01    [10892930]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по TSQL  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Во-первых, лучше всего вставить все значения из списка IN() в табличную переменную, временную или постоянную таблицу,
после чего строить JOIN с этой таблицей. Такую табличную переменную в SQL2008 можно даже передавать в процедуры и
функции через табличный параметр.
В-вторых, - Массивы и Списки в SQL Server
29 июн 11, 14:03    [10892940]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по TSQL  [new]
vovaa
Member

Откуда:
Сообщений: 198
Уже подумал про табличную переменную. Создаю ее :

declare @table table (shop char(10))

Затем должен занести в нее нужные значения . Как?

Так не работает
select * into @table from
(select distinct shop from test2) gg
29 июн 11, 14:13    [10893014]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по TSQL  [new]
vovaa
Member

Откуда:
Сообщений: 198
insert into @table select distinct shop from test2

а вот так работает :)
29 июн 11, 14:15    [10893030]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по TSQL  [new]
vovaa
Member

Откуда:
Сообщений: 198
Наверное все же стоит объяснить почему такой вопрос возник. Есть плоский отчет на основе большого парметризированного зарпоса. теперь я хочу засунуть запрос либо в функцию либо в процедуру и передавать в нее просто параметры из отчета. внутри запроса много операторов IN. У меня пока нет идей :( может кто нить подскажет ?
29 июн 11, 14:35    [10893193]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по TSQL  [new]
Начинающий SQL 2008
Member

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

-- Вариант через xml. Если строка оканчивается разделителем, как в примере ниже, то будет не очень хорошо.
declare @Where_ID_in varchar(max), @xml_str xml

set @Where_ID_in = 'a,b,c,d,'
set @xml_str = '<b>' + replace(@Where_ID_in, ',', '</b><b>')+'</b>'
--select @xml_str
select f.value('.', 'Nvarchar(max)') [Value] from @xml_str.nodes('b') R(f)
go


-- Вариант с рекурсией. Лишен недостатка, который был выше с xml
declare @str varchar(8000), @delimiter varchar(64)

select @str = 'a,b,c,d,', @delimiter = ','

;with str_nums (n1, n2, Number) 
as
( 
 select 1-len(@delimiter) [n1], charindex(@delimiter, @str+@delimiter) [n2], 0 as Number  
 union all
 select n2 [n1], charindex(@delimiter, @str+@delimiter, n2+len(@delimiter)) [n2], Number+1 [Number]
 from str_nums
 where n2 < len(@str)
) 
select substring(@str, n1+len(@delimiter), n2-n1-1) [Value]--, Number, n1+1 [StartPosition]
from str_nums
29 июн 11, 14:52    [10893333]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по TSQL  [new]
vovaa
Member

Откуда:
Сообщений: 198
Есть плоский отчет на основе большого с множеством параметров и операторов IN. Понятное дело что когда мы указываем в запросе такую конструкцию - where column1 in @parameter и затем выбираем несколько значений параметра SQL сам каким то образом "генерирует" такую конструкцию - where column1 in ('param_value1','param_value2','param_value3')

теперь я хочу вместо запроса использовать при формировании отчета либо процедуру либо функцию. но возникает проблема при передаче в процедуру множественных значений параметра. Может кто то сталкивался с данной ситуацией? Или тут вобще нет решения?
29 июн 11, 16:37    [10894377]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по TSQL  [new]
Начинающий SQL 2008
Member

Откуда:
Сообщений: 438
vovaa,
Если в продолжение этой темы, то тогда вот:
+ читать до конца
I used the MS example of checking the multi checkbox for the parameter and then using a WHERE Column IN (@MultiParam)

Есть 2 пути: Filter метод (не очень быстрый) и SQL метод (эффективнее)

Filter Method (не очень быстрый)
Create a multi-value parameter. Let's call it @Animals and you select Dog, Cat, Bird (or Select All)
Your main Dataset, which will return a result set to your report, does not reference @Animals in it's where clause.
Instead, click on Dataset Properties and select Filters
In the Filter setup dialog, click on the column in your result set that corresponds to the Animal value.
For the operator, select the "In" operator
For the value, type in [@Animals]
Done!

This will "post-filter" your SQL query and only return the values that have been filtered by your multi-value parameter.
Only Dog, Cat, Bird records will return to your report. The downside to this approach is that the processing occurs at the Report Server level
and not by your Database server, because you are not using SQL to do the work. In many cases (most cases!) I find this the easiest and quickest way
to do what you want.



SQL Method (эффективнее)
Create a multi-value parameter. Let's call it @Animals and you select Dog, Cat, Bird (or Select All). Same as the Filter Method!
You will need a stored procedure for your main report Result Dataset. Let's call it sp_get_animals.
sp_get_animals will take one argument, @Animals, so the calling mechanism looks like this: exec sp_get_animals @Animals
When you are configuring your parameters in the Query dialog, use the following expression to define the value of your parameter:
=join(Parameters!Animals.Value,",")
This will create a string that looks like this: "Bird,Dog,Cat"
In the body of your stored procedure, you will have to parse @Animals to pick off Bird, Dog, Cat.
Once you have parsed @Animals, you can use the SQL IN clause to actually process it.


Т.е. по русски:
Тогда с помощью Expression вы можете сформировать строку со всеми выбраннымии Value параметра и передать ее в хранимку.
=Join(Parameters!<ParameterName>.Value,", ") - Выражение, объединяющее в одну строку все значения в массиве многозначного параметра типа String.
А в хранимке выполняйте парсинг и обрабатывайте дальше, как вам нужно.
30 июн 11, 11:30    [10897951]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по TSQL  [new]
vovaa
Member

Откуда:
Сообщений: 198
спасибо за ответ. я уже обрадовался что это то что нужно но то ли я не так что то делаю то ли предложенный вариант передает преобразованные в строку значения параметра не тех которые выбрал пользователь во время формирования отчета а вобще все возможные значения параметра.
8 июл 11, 16:55    [10947221]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить