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

Откуда:
Сообщений: 67
есть процедура которая возвращает набор данных для отчета, необходимо добавить условие (список id сотрудников) тип id uniqueidentifier, пробую передавать строку но тогда процедура ругается "Ошибка при преобразовании строки символов в тип uniqueidentifier."

PROCEDURE [dbo].[rep_itog]	
	@DN as datetime,
	@DK as datetime,
	@key as nvarchar(max) =null
....
set @key=convert(uniqueidentifier,REPLACE (@key, '"', ''''))
select * from users where id in(@key)


EXEC [dbo].[rep_itog_zakaz]
@DN = N'20150101',
@DK = N'20151231',
@key = N'"7579A31B-2E63-42FD-A048-00FB17B3644B","26206083-C633-4030-873F-19CA635099D9","DA6D0899-2406-4DD7-805D-705B3254C9A3","5678BBE7-E7D6-4066-80D2-A4BFA37723A1","BEF3CFBE-4417-4C7B-8C00-E6E713A2B66D"'
9 дек 15, 01:59    [18532969]     Ответить | Цитировать Сообщить модератору
 Re: как передать в процедуру список uniqueidentifier?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
Если не умеете парсить строку в набор, передавайте список через таблицу или табличный параметр.
9 дек 15, 02:10    [18532977]     Ответить | Цитировать Сообщить модератору
 Re: как передать в процедуру список uniqueidentifier?  [new]
dim---76
Member

Откуда:
Сообщений: 67
не совсем понятно про парсить, имеете в виду в процедуре разобрать строку по отдельным ид и загнать их в табличную переменную, а потом подставлять ее в select, была такая мысль, но подумал что возможно есть более простой путь, в management studio если делаю
select * from users where id in('7579A31B-2E63-42FD-A048-00FB17B3644B','26206083-C633-4030-873F-19CA635099D9','DA6D0899-2406-4DD7-805D-705B3254C9A3','5678BBE7-E7D6-4066-80D2-A4BFA37723A1','BEF3CFBE-4417-4C7B-8C00-E6E713A2B66D')
работает
9 дек 15, 09:46    [18533496]     Ответить | Цитировать Сообщить модератору
 Re: как передать в процедуру список uniqueidentifier?  [new]
Glory
Member

Откуда:
Сообщений: 104760
dim---76
в management studio если делаю
select * from users where id in('7579A31B-2E63-42FD-A048-00FB17B3644B','26206083-C633-4030-873F-19CA635099D9','DA6D0899-2406-4DD7-805D-705B3254C9A3','5678BBE7-E7D6-4066-80D2-A4BFA37723A1','BEF3CFBE-4417-4C7B-8C00-E6E713A2B66D')

работает

Нет, вы делаете вот так
select * from users where id in('''7579A31B-2E63-42FD-A048-00FB17B3644B'',''26206083-C633-4030-873F-19CA635099D9'',''DA6D0899-2406-4DD7-805D-705B3254C9A3'',''5678BBE7-E7D6-4066-80D2-A4BFA37723A1'',''BEF3CFBE-4417-4C7B-8C00-E6E713A2B66D''')
9 дек 15, 10:15    [18533649]     Ответить | Цитировать Сообщить модератору
 Re: как передать в процедуру список uniqueidentifier?  [new]
преобразовании строки символов
Guest
dim---76,

set @key=convert(uniqueidentifier,REPLACE (@key, '"', ''''))
select * from users where id in(@key)

наборов/set'ов/enum'ов в сиквеле нет
id in (@key_set) написать нельзя
можно или написать там конкретный перечень
id in (@key1, @key2,..)
или положить туда набор строк
id in (select key from @keys)
строка ни в каком случае не справится с тем что написано изначально: из одной переменной она в несколько не превратится (даже если бы были enum'ы - все равно переменная как была varchar так varchar и осталась)
из скалярной переменной в набор данных тоже
select * from users where id in(@key)

id имеет тип uniqueidentifier
@key - скалярная переменная типа varchar
все что тут происходит - попытка преобразовать длинную строку с кучей гуидов в один гуид - преобразовать varchar к uniqueidentifier
и завершается, естественно, ошибкой
set @key=convert(uniqueidentifier,REPLACE (@key, '"', ''''))

@key как был так и остался варчаром. хоть два конверта делай.
и конвертация выполняется к uniqueidentifier - это скалярный тип и там (иметь такой тип, быть значением переменной такого типа) может быть только один uniqueidentifier, а не стопка.

а надо распарсивать строку и делать из нее табличку
гугл завален правильными ответами (готовым кодом)
9 дек 15, 11:21    [18534025]     Ответить | Цитировать Сообщить модератору
 Re: как передать в процедуру список uniqueidentifier?  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1873
dim---76,
declare	@key varchar(max) = N'"7579A31B-2E63-42FD-A048-00FB17B3644B","26206083-C633-4030-873F-19CA635099D9"'  
	
declare @table table(ID uniqueidentifier)	
insert into @table 
values('7579A31B-2E63-42FD-A048-00FB17B3644B'),('26206083-C633-4030-873F-19CA635099D9'),('11111111-C633-4030-873F-19CA635099D9'),('22222222-C633-4030-873F-19CA635099D9')
	
	
select * from @table
where @key like '%'+cast(ID as varchar(36))+'%'	
9 дек 15, 14:39    [18535566]     Ответить | Цитировать Сообщить модератору
 Re: как передать в процедуру список uniqueidentifier?  [new]
Apoj_sql
Member

Откуда:
Сообщений: 43
запихните набор гуидов в xml и передавайте в процедуру этот xml в качестве параметра, в процедуре развернёте
9 дек 15, 15:04    [18535776]     Ответить | Цитировать Сообщить модератору
 Re: как передать в процедуру список uniqueidentifier?  [new]
dim---76
Member

Откуда:
Сообщений: 67
set @key=convert(uniqueidentifier,REPLACE (@key, '"', '''')) не заметил когда копировал, естественно не будет работать

наверное остановлюсь на парсинге раз проще не получается
9 дек 15, 21:05    [18537665]     Ответить | Цитировать Сообщить модератору
 Re: как передать в процедуру список uniqueidentifier?  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
dim---76, cpсамое простое хмл, как уже писали. Разбор и разбор из коробки
9 дек 15, 23:27    [18538000]     Ответить | Цитировать Сообщить модератору
 Re: как передать в процедуру список uniqueidentifier?  [new]
Glory
Member

Откуда:
Сообщений: 104760
dim---76
наверное остановлюсь на парсинге раз проще не получается

надо просто изначально заносить все ваши " id сотрудников" в таблицу
Тогда не придется сначала их запихивать в один параметер, который потом опять разбирать на отдельные элементы
9 дек 15, 23:30    [18538006]     Ответить | Цитировать Сообщить модератору
 Re: как передать в процедуру список uniqueidentifier?  [new]
Alexander Titkin
Member

Откуда: Москва
Сообщений: 91
dim---76
set @key=convert(uniqueidentifier,REPLACE (@key, '"', '''')) не заметил когда копировал, естественно не будет работать

наверное остановлюсь на парсинге раз проще не получается


Самое простое, что бы не парсить, это использовать динамику.
10 дек 15, 09:12    [18538604]     Ответить | Цитировать Сообщить модератору
 Re: как передать в процедуру список uniqueidentifier?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31442
Mike_za
dim---76, cpсамое простое хмл, как уже писали. Разбор и разбор из коробки
И передача табличного параметра в принципе несложно сделать.
Да и разбор строки и преобразование в таблицу тоже.
Самый простой вариант у LexusR 18535566 . Но он конечно неоптимален для сервера, индекс не будет использоваться. Допустимо только для передачи, например, значений небольшого справочника.

В общем, полно путей.

Любой вполне нормально можно использовать, кроме этого, конечно:
Alexander Titkin
Самое простое, что бы не парсить, это использовать динамику.
10 дек 15, 10:28    [18538976]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить