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

Откуда:
Сообщений: 566
Добрый день!
Написал запрос, может конечно кривой.
В условии необходимо выбирать обозначения из списка IN, который в свою очередь формируется из справочника Spr_Analog , где находятся шаблоны обозначений (например 'AA%BB' ). В справочнике аналогов находятся значения с '%' , что означает неопределенное кол-во символом.
В условии мы находим "разницу" шаблона и @Name (это в нашем случае ' 15 ') и подставляется во все значения шаблонов, которые соответствуют IDA.
При выполнении выдается ошибка:
Msg 536, Level 16, State 5, Line 4
Invalid length parameter passed to the SUBSTRING function.

Если убираю в условии
and s.mnf=p.PriceManufacturer
или
Replace(Replace(@Name,SubString(s.Name,PATINDEX('%[%]%',s.Name)+1,Len(s.Name)),''),SubString(s.Name,1,PATINDEX('%[%]%',s.Name)-1), то ошибки нет.
Подскажите, пожалуйста, в чем дело или как можно оптимизировать запрос.
Спасибо.

DECLARE @Name AS VARCHAR(100)
SET @Name='AA 15 BB' 

select name,PriceManufacturer
from dbo.PriceGeneral p
where 
replace(replace(replace(replace(replace(replace(replace(p.name,' ',''),'.',''),',',''),'/',''),'\',''),'-',''),'_','')
IN (
Select 
replace(replace(replace(replace(replace(replace(replace(
Replace(A.Name,'%', 
(Select top 1 Replace(Replace(@Name,SubString(s.Name,PATINDEX('%[%]%',s.Name)+1,Len(s.Name)),''),SubString(s.Name,1,PATINDEX('%[%]%',s.Name)-1),	'')
 from dbo.Spr_Analog S where @name LIKE s.name and s.mnf=p.PriceManufacturer ))
,' ',''),'.',''),',',''),'/',''),'\',''),'-',''),'_','')
from dbo.Spr_Analog A 
where IDA=1
)
2 окт 13, 14:04    [14912279]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1873
ошибка тут
SubString(s.Name,1,PATINDEX('%[%]%',s.Name)-1)

для шаблонов в которые не совпадают с параметром PATINDEX('%[%]%',s.Name) выдаёт 0
и длина SubString получается -1
2 окт 13, 14:49    [14912571]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Lexx_SQL
Member

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

понятно..спасибо
2 окт 13, 14:50    [14912579]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Lexx_SQL
Member

Откуда:
Сообщений: 566
LexusR,
я не пойму, почему тогда когда я заменяю
and s.mnf=p.PriceManufacturer
на
and s.mnf='xxxxx', то все работает.
По идее это условие
where @name LIKE s.name and s.mnf=p.PriceManufacturer
должно выбирать только совпадающие значения.
2 окт 13, 14:56    [14912645]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Glory
Member

Откуда:
Сообщений: 104760
Lexx_SQL
По идее это условие
where @name LIKE s.name and s.mnf=p.PriceManufacturer
должно выбирать только совпадающие значения.

Порядок вычисления условий может отличаться от порядка их расположения в тексте запроса
2 окт 13, 15:00    [14912680]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1873
попробуйте немного переделать запрос по получению наименований из шаблонов - что-то типа такого
DECLARE @Name AS VARCHAR(100)
SET @Name='AA 15 BB' 
--макет таблицы шаблонов
declare @Spr_Analog table (name varchar(100))
insert into @Spr_Analog values('AA%BB')
insert into @Spr_Analog values('cc%dd')
insert into @Spr_Analog values('kk%')
insert into @Spr_Analog values('%mm')


;with Templates(LeftPart,RightPart) AS
 (select Left(Name,Charindex('%',Name)-1) ,Right(Name,Charindex('%',REVERSE(Name))-1) from @Spr_Analog)
,InputData(Value) AS
(SELECT TOP 1 REPLACE(REPLACE(@Name,T.LeftPart,''),T.RightPart,'')
FROM  Templates T 
WHERE (T.LeftPart>'' AND @Name like T.LeftPart+'%')
	 OR  (T.RightPart>'' AND @Name like '%'+T.RightPart))
, AllAnalogs(Name)	 AS 
(SELECT t.LeftPart+d.Value+t.RightPart 
FROM Templates t CROSS APPLY InputData d)
SELECT * FROM AllAnalogs aa
-- JOIN dbo.PriceGeneral p 
--ON p.name = aa.Name AND .......
3 окт 13, 09:24    [14916085]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить