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

Откуда: Calgary
Сообщений: 1167
declare @myproduct nvarchar(255)
set @myproduct='''Tovar1'''+','+'''Tovar1'''

print @myproduct -- ==== печатает 'Tovar1','Tovar2' как раз то, что нужно

но следующий код ничего не возвращает

select * from PRODUCT
where CODE in (@myproduct)

если делаю тест:

select * from PRODUCT
where CODE in ('Tovar1','Tovar2' )   

- то все работает как надо

Помогите, плиз, разрулить :)
17 окт 11, 22:44    [11455656]     Ответить | Цитировать Сообщить модератору
 Re: Разделенная запятыми строка в параметре для запроса  [new]
iljy
Member

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

https://www.sql.ru/articles/mssql/03060701arraysandlistsinsqlserver.shtml
17 окт 11, 22:55    [11455720]     Ответить | Цитировать Сообщить модератору
 Re: Разделенная запятыми строка в параметре для запроса  [new]
trew
Member

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

Интересное решение
11403903
18 окт 11, 00:08    [11456080]     Ответить | Цитировать Сообщить модератору
 Re: Разделенная запятыми строка в параметре для запроса  [new]
ZOOKABAKODER
Member

Откуда:
Сообщений: 178
А с 2005 можно написать CLR процу, хотя что будет быстрее работать, не знаю.
18 окт 11, 00:13    [11456109]     Ответить | Цитировать Сообщить модератору
 Re: Разделенная запятыми строка в параметре для запроса  [new]
iljy
Member

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

а можно не заниматься фигней и использовать табличные параметры.
18 окт 11, 00:16    [11456126]     Ответить | Цитировать Сообщить модератору
 Re: Разделенная запятыми строка в параметре для запроса  [new]
Alexander2
Member

Откуда: Calgary
Сообщений: 1167
trew,

то что надо, но не могу заставить эту фишку заработать
18 окт 11, 00:47    [11456229]     Ответить | Цитировать Сообщить модератору
 Re: Разделенная запятыми строка в параметре для запроса  [new]
Alexander2
Member

Откуда: Calgary
Сообщений: 1167
зверское решение - работает!!!! спасибо trew!!!

declare @myproduct varchar(255)

set @myproduct='''TOVAR1'''+','+'''TOVAR2'''+','+'''TOVAR3'''

print @myproduct

select * from PRODUCT WHERE CHARINDEX(CODE,','+@myproduct+',',0) > 0
18 окт 11, 00:53    [11456243]     Ответить | Цитировать Сообщить модератору
 Re: Разделенная запятыми строка в параметре для запроса  [new]
iljy
Member

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

откуда такая страсть к разбрасыванию граблей и отстреливанию ног?
declare @myproduct table(CODE varchar(255))

insert @myproduct values('TOVAR1'),('TOVAR2'),('TOVAR3')

select * from PRODUCT p join @myproduct t on p.CODE = t.CODE
18 окт 11, 01:21    [11456265]     Ответить | Цитировать Сообщить модератору
 Re: Разделенная запятыми строка в параметре для запроса  [new]
Alexander2
Member

Откуда: Calgary
Сообщений: 1167
iljy,

дело в том, что эта переменная @myproduct на самом деле :myproduct ,сидящая (повторяющаяся) в 13 блоках в огромном sql scripter, сидящем внутри ADODataSet (Delphi), которую я формирую в приложении, когда юзер выбирает чекбоксами наименования товаров (myproduct:=myproduct+CHR(39)+adsProductCode.FieldValues['Code']+CHR(39)+',')

как токо юзер натыкал нужных товаров, запускаю выполнение скрипта, передавая :myproduct это значение
18 окт 11, 01:42    [11456287]     Ответить | Цитировать Сообщить модератору
 Re: Разделенная запятыми строка в параметре для запроса  [new]
iljy
Member

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

какой сервер? В 2008 можно использовать табличные параметры, в более ранних можно преобразовать строку в табличную переменную. В любом случае вы выбрали самый неудачный вариант.
18 окт 11, 01:45    [11456289]     Ответить | Цитировать Сообщить модератору
 Re: Разделенная запятыми строка в параметре для запроса  [new]
Alexander2
Member

Откуда: Calgary
Сообщений: 1167
iljy,

во-первых, база вертится на 2005 сервере, но...(молчать, господа офицеры) она ДОЛЖНА ОСТАВАТЬСЯ с compatibility level 80 из-за ограничений версии системы управления предприятем;
во-вторых, вариант, как раз удачный, работает 100% ( у нас не так много кодов продуктов) не зашкалит, даже если выбрать все продукты (все же это не тот случай, что "в атаку пойдут танки, сначала один, потом - второй") конечно.

удачнее трудно представить, строковую переменную я могу формировать на лету, передавать ее в скрипт и ждать выполнения
18 окт 11, 01:57    [11456297]     Ответить | Цитировать Сообщить модератору
 Re: Разделенная запятыми строка в параметре для запроса  [new]
iljy
Member

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

declare @product table(CODE varchar(255))

insert @product values('TOVAR1'),('TOVAR11'),('TOVAR2')

declare @myproduct varchar(255)

set @myproduct='''TOVAR11'''+','+'''TOVAR21'''

print @myproduct

select * from @product WHERE CHARINDEX(CODE,','+@myproduct+',',0) > 0
удачи.
18 окт 11, 02:15    [11456303]     Ответить | Цитировать Сообщить модератору
 Re: Разделенная запятыми строка в параметре для запроса  [new]
aleks2
Guest
Alexander2
declare @myproduct nvarchar(255)
set @myproduct='''Tovar1'''+','+'''Tovar1'''

print @myproduct -- ==== печатает 'Tovar1','Tovar2' как раз то, что нужно

но следующий код ничего не возвращает

select * from PRODUCT
where CODE in (@myproduct)

если делаю тест:

select * from PRODUCT
where CODE in ('Tovar1','Tovar2' )   

- то все работает как надо

Помогите, плиз, разрулить :)


CREATE function [dbo].[f_StrToTableEx](@str varchar(8000), @delimiter varchar(64)=',')
returns table as
return(
WITH str_nums ( n1, n2, Number ) 
AS 
( 
select  1-DATALENGTH(@delimiter) as n1, charindex(@delimiter, @str+@delimiter) as n2, 0 as Number  
UNION ALL 
select n2 as n1, charindex(@delimiter, @str+@delimiter, n2+DATALENGTH(@delimiter)) as n2, Number+1 as Number
from str_nums
WHERE n2<DATALENGTH(@str)
) 
SELECT SUBSTRING(@str, n1+DATALENGTH(@delimiter), n2-n1-DATALENGTH(@delimiter)) as Value, Number, n1+DATALENGTH(@delimiter) as StartPosition FROM str_nums
)
GO
select P.* from PRODUCT P INNER JOIN [dbo].[f_StrToTableEx](@myproduct, ',') X ON P.CODE=X.Value

[/SRC]
18 окт 11, 07:34    [11456464]     Ответить | Цитировать Сообщить модератору
 Re: Разделенная запятыми строка в параметре для запроса  [new]
SignOff
Member

Откуда: Stockholm
Сообщений: 424
aleks2,

ага - рекурсивный запросец помодняцки. главное не забыть про глубину рекурсии...

Кстати, лучш еюзать nvarchar - а то потом не сможете вставить китайские символы :)
18 окт 11, 13:14    [11458684]     Ответить | Цитировать Сообщить модератору
 Re: Разделенная запятыми строка в параметре для запроса  [new]
trew
Member

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

Извлечение значений из списка, разделенного запятыми (CSV)
http://www.comprog.ru/XML/article_3778.htm
Решение, с использованием XML.
18 окт 11, 13:30    [11458867]     Ответить | Цитировать Сообщить модератору
 Re: Разделенная запятыми строка в параметре для запроса  [new]
SignOff
Member

Откуда: Stockholm
Сообщений: 424
trew,

Да там у чувака запрос с ХМЛ аж на 3 сека быстрее работает. Вот правда а что если юзать nvarchar и вставить символ который ХМЛ не прохавает например неразрывный пробел, то насколько быстрее будет работать ? Насколько я понимаю пример с ХМЛ юзает MS XML какой то там версии.
18 окт 11, 14:09    [11459317]     Ответить | Цитировать Сообщить модератору
 Re: Разделенная запятыми строка в параметре для запроса  [new]
ZOOKABAKODER
Member

Откуда:
Сообщений: 178
iljy
а можно не заниматься фигней и использовать табличные параметры.

А как их передавать с клиента? Кстати серьёзный вопрос: вот есть ADODB 2.8 как через него табличный параметр передавать?
19 окт 11, 00:24    [11463356]     Ответить | Цитировать Сообщить модератору
 Re: Разделенная запятыми строка в параметре для запроса  [new]
iljy
Member

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

http://msdn.microsoft.com/ru-ru/library/bb510472.aspx
19 окт 11, 00:36    [11463397]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить