Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 CTE глючит или лыжи не едут ?  [new]
Greenhorn
Member

Откуда:
Сообщений: 311
Добрый день.

select @@version
-----
Microsoft SQL Server 2005 - 9.00.4266.00 (X64) 
	Oct  7 2009 17:38:17 
	Copyright (c) 1988-2005 Microsoft Corporation
	Enterprise Edition (64-bit) on Windows NT 5.2 (Build 3790: Service Pack 2)
Во на что наступил
declare @GroupName nvarchar(25)

set @GroupName = 'GGPD'

declare @Ln table(id int identity(1,1), Line nvarchar(512))

CREATE TABLE #SvcPath(
	[GroupName] [nvarchar](25) NULL,
	[Path] [nvarchar](400) NULL,
	[SvcName] [nvarchar](25) NULL
) 

insert into @Ln( Line )
select 'Key1SVC=SVC_1' union all
select 'key1path=\\qqq\xxx\' union all
select 'Key2SVC=SVC_2' union all
select 'key2path=\\qqq\yyy\' union all
select 'Key3SVC=SVC_3' union all
select 'key3path=\\qqq\zzz\' 

  ;with svc( id, [isSvc], [key], [value] )
  as (
    select s.id, [isSvc], v.[key], v.value
    from @Ln as s
    cross apply(
      select 1 as [isSvc], charindex('SVC', s.[Line]) as [i], charindex('=',s.Line) as [j]
      where s.[Line] like 'Key%SVC%'

      union all

      select 0 as [isSvc], charindex('path', s.[Line]) as [i], charindex('=',s.Line) as [j]
      where s.[Line] like 'Key%path%'
    ) as idx

    cross apply(
      select Left([Line], idx.[i]-1) as [key], LTrim(RTrim(Right(s.[line], Len(s.[line])-idx.j))) as [value]
    ) as v
  )
--insert into #SvcPath
  select @GroupName as [GroupName], cast(t1.[value] as nvarchar(25)) as [SvcName], cast(t2.[value] as nvarchar(400)) as [path]
  from svc as t1
  inner join svc as t2 on t1.[key] = t2.[key] and t1.[id] != t2.[id]
  where t1.[isSvc] = 1 and t2.[isSvc] = 0

  except

  select [GroupName], [SvcName], [path]
  from #SvcPath

drop table #SvcPath
Msg 536, Level 16, State 5, Line 21
Invalid length parameter passed to the SUBSTRING function.

Если запрос с CTE выгрузить во временную таблицу, то except работает.
Но вот что не понятно - где криминал ?
18 дек 09, 11:59    [8085685]     Ответить | Цитировать Сообщить модератору
 Re: CTE глючит или лыжи не едут ?  [new]
Glory
Member

Откуда:
Сообщений: 104760
select left('aaa', 1)
go
select left('aaa', NULL)
go
select left('aaa', -1)
18 дек 09, 12:04    [8085731]     Ответить | Цитировать Сообщить модератору
 Re: CTE глючит или лыжи не едут ?  [new]
Greenhorn
Member

Откуда:
Сообщений: 311
Glory
select left('aaa', 1)
go
select left('aaa', NULL)
go
select left('aaa', -1)


И откуда вылезает этот NULL ?
Greenhorn
Если запрос с CTE выгрузить во временную таблицу, то except работает.
18 дек 09, 12:08    [8085763]     Ответить | Цитировать Сообщить модератору
 Re: CTE глючит или лыжи не едут ?  [new]
Greenhorn
Member

Откуда:
Сообщений: 311
Greenhorn
Glory
select left('aaa', 1)
go
select left('aaa', NULL)
go
select left('aaa', -1)


И откуда вылезает этот NULL ?
Greenhorn
Если запрос с CTE выгрузить во временную таблицу, то except работает.

Т.е. -1
18 дек 09, 12:09    [8085770]     Ответить | Цитировать Сообщить модератору
 Re: CTE глючит или лыжи не едут ?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Greenhorn
Glory
select left('aaa', 1)
go
select left('aaa', NULL)
go
select left('aaa', -1)


И откуда вылезает этот NULL ?
Greenhorn
Если запрос с CTE выгрузить во временную таблицу, то except работает.

Не NULL, а -1.
Например, здесь idx.[i]-1, если idx.[i] равно 0
18 дек 09, 12:10    [8085774]     Ответить | Цитировать Сообщить модератору
 Re: CTE глючит или лыжи не едут ?  [new]
Greenhorn
Member

Откуда:
Сообщений: 311
Glory
Greenhorn
Glory
select left('aaa', 1)
go
select left('aaa', NULL)
go
select left('aaa', -1)


И откуда вылезает этот NULL ?
Greenhorn
Если запрос с CTE выгрузить во временную таблицу, то except работает.

Не NULL, а -1.
Например, здесь idx.[i]-1, если idx.[i] равно 0

Если из запроса убрать
  except

  select [GroupName], [SvcName], [path]
  from #SvcPath
То все работает !!! => предположение не верно !!!
18 дек 09, 12:13    [8085792]     Ответить | Цитировать Сообщить модератору
 Re: CTE глючит или лыжи не едут ?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Greenhorn

То все работает !!! => предположение не верно !!!

Ну конечно. А сообщение про неверный параметер сервер дает для отвода глаз
18 дек 09, 12:15    [8085810]     Ответить | Цитировать Сообщить модератору
 Re: CTE глючит или лыжи не едут ?  [new]
Greenhorn
Member

Откуда:
Сообщений: 311
Glory
Greenhorn

То все работает !!! => предположение не верно !!!

Ну конечно. А сообщение про неверный параметер сервер дает для отвода глаз

Вот и я не въехал - с какого перепугу сервер выдает енто сообщение, ели запрос без except_а РАБОТАЕТ БЕЗ ОШИБОК !!!
18 дек 09, 12:18    [8085829]     Ответить | Цитировать Сообщить модератору
 Re: CTE глючит или лыжи не едут ?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Greenhorn

Вот и я не въехал - с какого перепугу сервер выдает енто сообщение, ели запрос без except_а РАБОТАЕТ БЕЗ ОШИБОК !!!

Понимаете, сервер разные запросы может выполнять по-разному. В том числе и в разном порядке вычислять выражения.
18 дек 09, 12:21    [8085852]     Ответить | Цитировать Сообщить модератору
 Re: CTE глючит или лыжи не едут ?  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Greenhorn
Если из запроса убрать ... То все работает !!! => предположение не верно !!!
Если в запрос внести изменение, то сервер выберет другой план выполнения => другой порядок вычислений и т.д.
Но я вот что думаю. Похоже здесь решается какая-то простенькая задачка парсинга строки каким-то сложным запутанным способом.
Полезно, всё-таки, не только показывать, как Вы решаете задачу, а и как эта задача формулируется.
18 дек 09, 12:21    [8085854]     Ответить | Цитировать Сообщить модератору
 Re: CTE глючит или лыжи не едут ?  [new]
Greenhorn
Member

Откуда:
Сообщений: 311
iap
Greenhorn
Если из запроса убрать ... То все работает !!! => предположение не верно !!!
Если в запрос внести изменение, то сервер выберет другой план выполнения => другой порядок вычислений и т.д.
Но я вот что думаю. Похоже здесь решается какая-то простенькая задачка парсинга строки каким-то сложным запутанным способом.
Полезно, всё-таки, не только показывать, как Вы решаете задачу, а и как эта задача формулируется.

Простенькая задачка состоит в том, чтобы загружать при необходимости конфигурационный файл (INI) от доисторической программы (исходники и автор уже утеряны). в связи с тем, что условия эксплуатации изменились, и нужно адаптироваться к новым условиям...

P.S. Я конечно могу ошибаться, но план запроса не может влиять на результат, а может влиять только на скорость выполнения запроса...
18 дек 09, 12:31    [8085933]     Ответить | Цитировать Сообщить модератору
 Re: CTE глючит или лыжи не едут ?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Greenhorn


P.S. Я конечно могу ошибаться, но план запроса не может влиять на результат, а может влиять только на скорость выполнения запроса...

На конечный результат конечно не может. А на способы его получения - легко
18 дек 09, 12:33    [8085948]     Ответить | Цитировать Сообщить модератору
 Re: CTE глючит или лыжи не едут ?  [new]
Greenhorn
Member

Откуда:
Сообщений: 311
Glory
Greenhorn


P.S. Я конечно могу ошибаться, но план запроса не может влиять на результат, а может влиять только на скорость выполнения запроса...

На конечный результат конечно не может. А на способы его получения - легко


Т.е. Запрос
select Left([Val],Len([Val])-5) from SameTable where Len([Val]) > 5
будет временами глючить (из-за смены плана запроса)?
imho это криминал !!!

И еще, а где, в приведенных тестовых данных, есть строка, которая может вызвать данный exception ?
18 дек 09, 12:41    [8085998]     Ответить | Цитировать Сообщить модератору
 Re: CTE глючит или лыжи не едут ?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Greenhorn

imho это криминал !!!

Это не криминал. Это ваша вера в то, что запрос выполняется так, как вы думаете он должен выполняться.
18 дек 09, 12:43    [8086020]     Ответить | Цитировать Сообщить модератору
 Re: CTE глючит или лыжи не едут ?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Greenhorn

И еще, а где, в приведенных тестовых данных, есть строка, которая может вызвать данный exception ?

Вы план выполнения смотрели или нет ? Где там в плане SUBSTRING и когда она вычисляется ?
18 дек 09, 12:44    [8086027]     Ответить | Цитировать Сообщить модератору
 Re: CTE глючит или лыжи не едут ?  [new]
iap
Member

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

добавлю к словам Glory, что говоря про ошибку в функции SUBSTRING(),
сервер ругается и на ошибки в функциях LEFT() и RIGHT().
Наверно, внутри себя он эти вызовы в SUBSTRING() преобразует...
18 дек 09, 12:50    [8086071]     Ответить | Цитировать Сообщить модератору
 Re: CTE глючит или лыжи не едут ?  [new]
Greenhorn
Member

Откуда:
Сообщений: 311
Glory
Greenhorn

imho это криминал !!!

Это не криминал. Это ваша вера в то, что запрос выполняется так, как вы думаете он должен выполняться.

Раз это не криминал (в чем я лично сильно сомневаюсь), то этот простенький запрос, во избежании возможных глюков, должен быть переписан следующим образом:
select case when Len([Val]) > 5 then Left([Val],Len([Val])-5) end
from SameTable where Len([Val]) > 5
Вы это предлагаете ?
И во что тогда превратятся более сложные запросы ?
18 дек 09, 12:51    [8086079]     Ответить | Цитировать Сообщить модератору
 Re: CTE глючит или лыжи не едут ?  [new]
Greenhorn
Member

Откуда:
Сообщений: 311
iap
Greenhorn,

добавлю к словам Glory, что говоря про ошибку в функции SUBSTRING(),
сервер ругается и на ошибки в функциях LEFT() и RIGHT().
Наверно, внутри себя он эти вызовы в SUBSTRING() преобразует...

Это то как раз понятно...
18 дек 09, 12:52    [8086092]     Ответить | Цитировать Сообщить модератору
 Re: CTE глючит или лыжи не едут ?  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Greenhorn
этот простенький запрос, во избежании возможных глюков, должен быть переписан следующим образом:
select case when Len([Val]) > 5 then Left([Val],Len([Val])-5) end
from SameTable where Len([Val]) > 5
Вы это предлагаете ?
Вы абсолютно правы!
18 дек 09, 12:52    [8086093]     Ответить | Цитировать Сообщить модератору
 Re: CTE глючит или лыжи не едут ?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Greenhorn

Раз это не криминал (в чем я лично сильно сомневаюсь), то этот простенький запрос, во избежании возможных глюков, должен быть переписан следующим образом:
select case when Len([Val]) > 5 then Left([Val],Len([Val])-5) end
from SameTable where Len([Val]) > 5
Вы это предлагаете ?
И во что тогда превратятся более сложные запросы ?

Многие думают об этом задолго заранее. Например, делают тип поля char.
18 дек 09, 13:03    [8086176]     Ответить | Цитировать Сообщить модератору
 Re: CTE глючит или лыжи не едут ?  [new]
Greenhorn
Member

Откуда:
Сообщений: 311
iap
Greenhorn
этот простенький запрос, во избежании возможных глюков, должен быть переписан следующим образом:
select case when Len([Val]) > 5 then Left([Val],Len([Val])-5) end
from SameTable where Len([Val]) > 5
Вы это предлагаете ?
Вы абсолютно правы!

No Comments, одни эмоции ....
P.S. Елси у Вас программа работает правильно, то это Вам только кажется.

Glory
Многие думают об этом задолго заранее. Например, делают тип поля char.

С char_ом та же ошибка ....
18 дек 09, 13:10    [8086225]     Ответить | Цитировать Сообщить модератору
 Re: CTE глючит или лыжи не едут ?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Greenhorn

Glory
Многие думают об этом задолго заранее. Например, делают тип поля char.

С char_ом та же ошибка ....

Это вы про
select case when Len([Val]) > 5 then Left([Val],Len([Val])-5) end
from SameTable where Len([Val]) > 5
говорите ?

Сообщение было отредактировано: 18 дек 09, 13:12
18 дек 09, 13:11    [8086237]     Ответить | Цитировать Сообщить модератору
 Re: CTE глючит или лыжи не едут ?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Greenhorn

No Comments, одни эмоции ....
P.S. Елси у Вас программа работает правильно, то это Вам только кажется.

А скажем деление на 0 вы тоже нигде не проверяете ?
18 дек 09, 13:13    [8086254]     Ответить | Цитировать Сообщить модератору
 Re: CTE глючит или лыжи не едут ?  [new]
Greenhorn
Member

Откуда:
Сообщений: 311
Glory
Greenhorn

Glory
Многие думают об этом задолго заранее. Например, делают тип поля char.

С char_ом та же ошибка ....

Это вы про
select case when Len([Val]) > 5 then Left([Val],Len([Val])-5) end
from SameTable where Len([Val]) > 5
говорите ?

Нет, про первый запрос ...
18 дек 09, 13:13    [8086255]     Ответить | Цитировать Сообщить модератору
 Re: CTE глючит или лыжи не едут ?  [new]
Greenhorn
Member

Откуда:
Сообщений: 311
Glory
Greenhorn

No Comments, одни эмоции ....
P.S. Елси у Вас программа работает правильно, то это Вам только кажется.

А скажем деление на 0 вы тоже нигде не проверяете ?

В запросах типа
select 5 / [Val]
from SameTable 
where [Val] != 0
Не проверяю ...
18 дек 09, 13:15    [8086273]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить