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

Откуда:
Сообщений: 261
В хранимую процедуру передаю строку, содержащую несколько кодов учреждений: @s='1118, 1119, 1108'.

Как в хр. процедуре, используя эту строку, сделать такой или ему подобный запрос:

select *
from lpu
where lpuid in (1118, 1119, 1108)
18 сен 17, 13:09    [20803187]     Ответить | Цитировать Сообщить модератору
 Re: В строке несколько кодов учреждений. Как использовать их в запросе select?  [new]
aleksrov
Member

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

т.е. код у вас трока?
18 сен 17, 13:12    [20803198]     Ответить | Цитировать Сообщить модератору
 Re: В строке несколько кодов учреждений. Как использовать их в запросе select?  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5112
- передавать не строку, а табличную переменную
- внутри пр-ры распарсить строку в таблицу\переменную и использовать join
18 сен 17, 13:13    [20803210]     Ответить | Цитировать Сообщить модератору
 Re: В строке несколько кодов учреждений. Как использовать их в запросе select?  [new]
Rankatan
Member

Откуда:
Сообщений: 250
declare @IDs nvarchar(max)='1,5,9,11,3,2';

--1 вариант
select *
from lpu
where lpuid in (
	select a.b.value('(text())[1]', 'int') 
	FROM (VALUES(CAST('<r>'+REPLACE(@IDs,',','</r><r>')+'</r>' AS XML))) X(X)
	CROSS APPLY X.nodes('/r') a(b)
)

--2 варинт

set @sql varchar(max) = 'select * from lpu where lpuid in ('+@IDs+')'
exec (@sql)
18 сен 17, 13:14    [20803216]     Ответить | Цитировать Сообщить модератору
 Re: В строке несколько кодов учреждений. Как использовать их в запросе select?  [new]
aleksrov
Member

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

Жесть какая...
Надо для данных использовать верные типы, а не извращаться.
18 сен 17, 13:16    [20803231]     Ответить | Цитировать Сообщить модератору
 Re: В строке несколько кодов учреждений. Как использовать их в запросе select?  [new]
iap
Member

Откуда: Москва
Сообщений: 46954
seg856
В хранимую процедуру передаю строку, содержащую несколько кодов учреждений: @s='1118, 1119, 1108'.

Как в хр. процедуре, используя эту строку, сделать такой или ему подобный запрос:
select *
from lpu
where lpuid in (1118, 1119, 1108)
select *
from lpu
where ','+replace(@s,' ','')+',' like '%,'+lpuid+',%';
18 сен 17, 13:24    [20803267]     Ответить | Цитировать Сообщить модератору
 Re: В строке несколько кодов учреждений. Как использовать их в запросе select?  [new]
iap
Member

Откуда: Москва
Сообщений: 46954
iap
seg856
В хранимую процедуру передаю строку, содержащую несколько кодов учреждений: @s='1118, 1119, 1108'.

Как в хр. процедуре, используя эту строку, сделать такой или ему подобный запрос:
select *
from lpu
where lpuid in (1118, 1119, 1108)
select *
from lpu
where ','+replace(@s,' ','')+',' like '%,'+lpuid+',%';
select *
from lpu
where ','+replace(@s,' ','')+',' like '%,'+lpuid+',%';
[/quote]
select *
from lpu
where ','+replace(@s,' ','')+',' like '%,'+cast(lpuid as varchar)+',%';
18 сен 17, 13:28    [20803287]     Ответить | Цитировать Сообщить модератору
 Re: В строке несколько кодов учреждений. Как использовать их в запросе select?  [new]
iap
Member

Откуда: Москва
Сообщений: 46954
iap
seg856
В хранимую процедуру передаю строку, содержащую несколько кодов учреждений: @s='1118, 1119, 1108'.

Как в хр. процедуре, используя эту строку, сделать такой или ему подобный запрос:
select *
from lpu
where lpuid in (1118, 1119, 1108)
select *
from lpu
where ','+replace(@s,' ','')+',' like '%,'+lpuid+',%';
select *
from lpu
where ','+replace(@s,' ','')+',' like '%,'+lpuid+',%';
[/quote]
select *
from lpu
where ','+replace(@s,' ','')+',' like '%,'+cast(lpuid as varchar)+',%';
18 сен 17, 13:29    [20803290]     Ответить | Цитировать Сообщить модератору
 Re: В строке несколько кодов учреждений. Как использовать их в запросе select?  [new]
iap
Member

Откуда: Москва
Сообщений: 46954
У нас сломался интернет!
Так что всё криво как-то отправляется... извините.
18 сен 17, 13:31    [20803298]     Ответить | Цитировать Сообщить модератору
 Re: В строке несколько кодов учреждений. Как использовать их в запросе select?  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
SELECT
  *
INTO
  #lpu
FROM
  lpu
WHERE
  1 = 0
;
DECLARE @tsql NVARCHAR(MAX) = N'SELECT * FROM #lpu WHERE lpuid IN ( ' + @s + N' )'
INSERT INTO #lpu
EXEC sp_executesql @tsql
;
DECLARE @tsql NVARCHAR(MAX) = N'INSERT INTO #lpu SELECT * FROM #lpu WHERE lpuid IN ( ' + @s + N' )'
EXEC sp_executesql @tsql
;
18 сен 17, 14:44    [20803578]     Ответить | Цитировать Сообщить модератору
 Re: В строке несколько кодов учреждений. Как использовать их в запросе select?  [new]
SQLPowerUser
Member

Откуда: ссылка в профиле
Сообщений: 330
(с) iap. Простейший вариант, преобразование не требуется. Только про индексы при таком подходе надо забыть.
declare @t table (AccountID varchar(12))
insert @t select 'zzzzzzzzzzzz' union all select 'AXM4FA0003FW' union all select 'AXM4FA0002TF' union all select 'AXM4FA0002TG'

declare @str varchar(100)
set @str = 'AXM4FA0003FW,AXM4FA0002TF,AXM4FA0002TG'

select *
from @t
where ','+@str+',' like '%,'+AccountID+',%';

Вариант через xml от Rankatan, всё-таки подтормаживает. Поэтому лучше использовать вариант с рекурсией
declare @str varchar(8000), @delimiter varchar(64)
declare @t table (idx int, fio varchar(500))
insert @t select 1,'Иванов' union all select 2,'Петров' union all select 3,'Сидоров' union all select 4,'Кто-то еще'
select * from @t

select @str = 'Иванов,Кто-то еще,', @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 * from @t
where exists (select 1 from str_nums where fio = substring(@str, n1+len(@delimiter), n2-n1-1))

+ Тест на скорость
set nocount on
-- Заполним тестовые данные
declare @t table (Account varchar(400), Industry varchar(400))
insert @t select 'aa', '<a1234567>, s2 & 222, s35, s4' union all select 'bb', 's12,' union all select 'cc', 't1' union all select 'dd', null
select * from @t

;with cte as (select *, 1 [cnt] from @t union all select Account, Industry, cnt+1 from cte where cnt < 2000) insert @t select Account +' '+ cast(cnt as varchar), Industry from cte option (maxrecursion 0)

set statistics time on
;with t1 as (select Account, a = isnull(Industry,'') + ',' from @t)
,t2 as (
  select Account, cast(substring(a,t+1,8000)as varchar(8000))a,ltrim(cast(left(a,t-1)as varchar(8000))) [st], 1 [cnt]
  from t1 outer apply(select charindex(',',a)t) t
  union all
  select Account, cast(substring(a,t+1,8000)as varchar(8000)),ltrim(cast(left(a,t-1)as varchar(8000))), cnt+1
  from t2 cross apply(select charindex(',',a)t) t
  where t > 0
)
select Account,st,cnt from t2
order by Account,st
option (maxrecursion 0)
set statistics time off
18 сен 17, 22:16    [20804714]     Ответить | Цитировать Сообщить модератору
 Re: В строке несколько кодов учреждений. Как использовать их в запросе select?  [new]
энди
Member

Откуда: Киров, Россия
Сообщений: 1096
а просто табличный параметр нельзя использовать?
хотя конечно не все его поддерживают, но если есть возможность используйте для подобных задач лучше его
19 сен 17, 10:48    [20805224]     Ответить | Цитировать Сообщить модератору
 Re: В строке несколько кодов учреждений. Как использовать их в запросе select?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
энди
а просто табличный параметр нельзя использовать?
хотя конечно не все его поддерживают, но если есть возможность используйте для подобных задач лучше его

табличный параметра, та ещё поделка. Данное легко изменить в xml на входе, или через временные таблицы
19 сен 17, 10:50    [20805229]     Ответить | Цитировать Сообщить модератору
 Re: В строке несколько кодов учреждений. Как использовать их в запросе select?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3466
seg856
В хранимую процедуру передаю строку, содержащую несколько кодов учреждений: @s='1118, 1119, 1108'.

Как в хр. процедуре, используя эту строку, сделать такой или ему подобный запрос:

select *
from lpu
where lpuid in (1118, 1119, 1108)


можно так, например, в некоторых случаях
(@@VERSION осталась тайной)

select * from lpu
where lpuid in (SELECT cast(value as int) FROM STRING_SPLIT (@s, ','));
19 сен 17, 11:45    [20805447]     Ответить | Цитировать Сообщить модератору
 Re: В строке несколько кодов учреждений. Как использовать их в запросе select?  [new]
seg856
Member

Откуда:
Сообщений: 261
Rankatan, спасибо.
19 сен 17, 13:05    [20805825]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить