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

Откуда: Москва
Сообщений: 191
mssql 2005
не подскажите ничего понять не могу - вот функция
ALTER function [LSDBO].[Ric_Get_CallerID]
--получить строку содержащую номер телефона @Phone
        (@Phone varchar(256)      			-- Искомый номер телефона
         )
Returns varchar(255)
 Begin
  Declare @ObjMnemo varchar(255),			-- Mnemo текущего объекта
          @ObjId numeric(18),				-- id текущего объекта
          @CltId numeric(18),				-- id компании
          @ObjDescr varchar(255)			-- Описание текущего объекта. Возврат 

  Set @ObjDescr='Компания не определена'	-- Значение по умолчанию

  Select top(1)								-- Запрос на первое попавшееся совпадение 
         @ObjId = rw.id,
         @ObjMnemo = tw.mnemo, 
         @ObjDescr = rw.description
    From lsdbo.object_reference rw left join lsdbo.object_type tw on rw.type_id = tw.id left join 
         lsdbo.attrib_value av on rw.id = av.object_id and av.attrib_id = 100040102200000 left join 
         lsdbo.value_string vv on av.value_id = vv.id and av.attrib_id = 100040102200000 
   Where vv.value like '%'+@Phone+'%' 

  --Исключение - если это контактное лицо выйти на компанию 
   If @ObjMnemo='Сnt'
--   If @ObjMnemo Like 'Сnt'
--   If CONVERT(varchar(255), @ObjMnemo) = 'Cnt' 
       Select @ObjDescr = case rw.id when @ObjId then 'Частное лицо' else rw.description end  
                         From lsdbo.object_reference rw left join lsdbo.object_type tw on rw.type_id=tw.id 
                        Where rw.id = (Select LSDBO.Ric_Get_Numeric_atr(@ObjId, 100004087100000))

  Return @ObjDescr
 End
Если запускать ее как функцию - не могу попасть в блок IF, если запускать ее по шагам (не в виде функции, а с печатью на контрольных точках и т.д.) в студии все работает (при тех же исходных данных)...

это день сегодня такой или что это может быть
17 окт 13, 12:31    [14984744]     Ответить | Цитировать Сообщить модератору
 Re: UDF не заходит в IF и просто в коде заходит  [new]
Glory
Member

Откуда:
Сообщений: 104751
ef1
или что это может быть

Что переменной ничего не присвоилось. Потому что запрос ничего не выбрал
17 окт 13, 12:39    [14984811]     Ответить | Цитировать Сообщить модератору
 Re: UDF не заходит в IF и просто в коде заходит  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
ну так если @Phone один и тот же, то
Select top(1)

по разному срабатывает, и ордер не указан, так что всякое может быть....
17 окт 13, 12:40    [14984819]     Ответить | Цитировать Сообщить модератору
 Re: UDF не заходит в IF и просто в коде заходит  [new]
подозрительный парсер
Guest
If @ObjMnemo='Сnt'
-- If @ObjMnemo Like 'Сnt'
-- If CONVERT(varchar(255), @ObjMnemo) = 'Cnt'
Select @ObjDescr = case rw.id when @ObjId then 'Частное лицо' else rw.description end

попробуй убрать строки с комментарием или добавить begin-end к ифу, или просто вставить пустую строку между ифом и селектом, когда-то ловился на таком, подозреваю баг парсера
17 окт 13, 12:44    [14984848]     Ответить | Цитировать Сообщить модератору
 Re: UDF не заходит в IF и просто в коде заходит  [new]
ef1
Member

Откуда: Москва
Сообщений: 191
...
  Select top(1)								-- Запрос на первое попавшееся совпадение 
         @ObjId = rw.id,
         @ObjMnemo = tw.mnemo, 
         @ObjDescr = rw.description
    From lsdbo.object_reference rw left join lsdbo.object_type tw on rw.type_id = tw.id left join 
         lsdbo.attrib_value av on rw.id = av.object_id and av.attrib_id = 100040102200000 left join 
         lsdbo.value_string vv on av.value_id = vv.id and av.attrib_id = 100040102200000 
   Where vv.value like '%'+@Phone+'%' 
   Order by tw.mnemo  

  -- Set @ObjMnemo='Сnt'
  --Исключение - если это контактное лицо выйти на компанию 
   If @ObjMnemo='Сnt'
       Select @ObjDescr = case rw.id when @ObjId then 'Частное лицо' else rw.description end  
                         From lsdbo.object_reference rw left join lsdbo.object_type tw on rw.type_id=tw.id 
                        Where rw.id = (Select LSDBO.Ric_Get_Numeric_atr(@ObjId, 100004087100000))

  Return @ObjMnemo + '|' +@ObjDescr
 End

что интересно при явном присвоении переменной
Set @ObjMnemo='Сnt'
попадаю в блок If

сортировка Order by tw.mnemo - не повлияла

UDF возвращает вот это Cnt|Дубовцев Владимир

т.е. переменная инициализируется в запросе но в сравнение не попадает... я уж и явно ее приводил к varchar и все мимо...
что еще можно попробовать
17 окт 13, 12:57    [14984937]     Ответить | Цитировать Сообщить модератору
 Re: UDF не заходит в IF и просто в коде заходит  [new]
ef1
Member

Откуда: Москва
Сообщений: 191
  -- Set @ObjMnemo='Сnt'
  --Исключение - если это контактное лицо выйти на компанию 
   If @ObjMnemo='Сnt'

     Begin

       Select @ObjDescr = case rw.id when @ObjId then 'Частное лицо' else rw.description end  
                         From lsdbo.object_reference rw left join lsdbo.object_type tw on rw.type_id=tw.id 
                        Where rw.id = (Select LSDBO.Ric_Get_Numeric_atr(@ObjId, 100004087100000))
     End 

  Return @ObjMnemo + '|' +@ObjDescr
 End

begin end и пустая строка )))) не спасла!!!!
что делать... не знаю!)))
17 окт 13, 12:59    [14984948]     Ответить | Цитировать Сообщить модератору
 Re: UDF не заходит в IF и просто в коде заходит  [new]
Glory
Member

Откуда:
Сообщений: 104751
ef1
т.е. переменная инициализируется в запросе

В 'Сnt' первая буква русская
17 окт 13, 12:59    [14984950]     Ответить | Цитировать Сообщить модератору
 Re: UDF не заходит в IF и просто в коде заходит  [new]
ef1
Member

Откуда: Москва
Сообщений: 191
сервер крутится на виртуальной машине.... но это по моему совсем уж не в ту сторону
17 окт 13, 13:01    [14984967]     Ответить | Цитировать Сообщить модератору
 Re: UDF не заходит в IF и просто в коде заходит  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31987
ef1
что делать... не знаю!)))
Если вам обязательно нужно, что бы было попадание в блок if, зачем вы делаете left join lsdbo.object_type tw, а не inner join lsdbo.object_type tw?
ef1
я уж и явно ее приводил к varchar и все мимо..
Монитор переворачивали? Клавиатуру меняли?
17 окт 13, 13:01    [14984968]     Ответить | Цитировать Сообщить модератору
 Re: UDF не заходит в IF и просто в коде заходит  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31987
Glory
ef1
т.е. переменная инициализируется в запросе

В 'Сnt' первая буква русская
Да, действительно :-)
17 окт 13, 13:02    [14984972]     Ответить | Цитировать Сообщить модератору
 Re: UDF не заходит в IF и просто в коде заходит  [new]
ef1
Member

Откуда: Москва
Сообщений: 191
Нет - ставлю с англицкой буквой Cnt и с русской Cnt - в IF не заходит
т.е. если переменная определена через Set - все ок и реакция на русскую и англицкую есть
а если переменная получена в запросе - она, в в этой конкретной UDF никак не попадает в блок IF в качестве условия, хотя в качестве возврата все нормально
17 окт 13, 13:09    [14985038]     Ответить | Цитировать Сообщить модератору
 Re: UDF не заходит в IF и просто в коде заходит  [new]
Glory
Member

Откуда:
Сообщений: 104751
ef1
Нет - ставлю с англицкой буквой Cnt и с русской Cnt - в IF не заходит

Ну так поставьте то значение, которое есть в таблице и которое получает переменная
Или вы хотите безусловный переход ?
17 окт 13, 13:12    [14985069]     Ответить | Цитировать Сообщить модератору
 Re: UDF не заходит в IF и просто в коде заходит  [new]
ef1
Member

Откуда: Москва
Сообщений: 191
))стучался головой уже об стену, даже UDF пересоздал...)))) мимо
подскажите тогда альтернативу... мне кажется вот такое множественное присвоение в запросе не нравится парсеру при выполнении
  Select top(1)								-- Запрос на первое попавшееся совпадение 
         @ObjId = rw.id,
         @ObjMnemo = tw.mnemo, 
         @ObjDescr = rw.description

нужно разбить на три отдельных запроса?
17 окт 13, 13:14    [14985081]     Ответить | Цитировать Сообщить модератору
 Re: UDF не заходит в IF и просто в коде заходит  [new]
ef1
Member

Откуда: Москва
Сообщений: 191
безусловный переход? не совсем понял - мне просто нужно по одному из возвращаемых значений запроса содержащего одну строку - сделать дополнительную выборку из БД...
17 окт 13, 13:17    [14985109]     Ответить | Цитировать Сообщить модератору
 Re: UDF не заходит в IF и просто в коде заходит  [new]
Glory
Member

Откуда:
Сообщений: 104751
ef1
не совсем понял - мне просто нужно по одному из возвращаемых значений запроса содержащего одну строку - сделать дополнительную выборку из БД...

Объясните тогда, как значение в поле одновременно может быть и 'Сnt' с русской С и английской С ?
Вы не знаете, с чем хотите сравнить ?
17 окт 13, 13:20    [14985127]     Ответить | Цитировать Сообщить модератору
 Re: UDF не заходит в IF и просто в коде заходит  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
ef1
Нет - ставлю с англицкой буквой Cnt и с русской Cnt - в IF не заходит
т.е. если переменная определена через Set - все ок и реакция на русскую и англицкую есть
а если переменная получена в запросе - она, в в этой конкретной UDF никак не попадает в блок IF в качестве условия, хотя в качестве возврата все нормально


поставьте Like '%nt%' для эксперимента
17 окт 13, 13:23    [14985148]     Ответить | Цитировать Сообщить модератору
 Re: UDF не заходит в IF и просто в коде заходит  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31987
ef1
Нет - ставлю с англицкой буквой Cnt и с русской Cnt - в IF не заходит
т.е. если переменная определена через Set - все ок и реакция на русскую и англицкую есть
а если переменная получена в запросе - она, в в этой конкретной UDF никак не попадает в блок IF в качестве условия, хотя в качестве возврата все нормально
Вы уже приведите код, который выполняете сейчас.

Посмотрим, всё таки вы поправили те 2 ошибки, илли нет.

Потом уже можно идти дальше.
17 окт 13, 13:23    [14985149]     Ответить | Цитировать Сообщить модератору
 Re: UDF не заходит в IF и просто в коде заходит  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
сделайте процедуру с точно таким кодом, в ней можно всякие промежуточные выводы сделать
17 окт 13, 13:25    [14985161]     Ответить | Цитировать Сообщить модератору
 Re: UDF не заходит в IF и просто в коде заходит  [new]
ef1
Member

Откуда: Москва
Сообщений: 191
нет нет, это я для проверки делал...
сравниваю с (единственным) английским вариантом 'Cnt'

но получается что с явной инициализацией переменной @ObjMnemo через Set все работает
а с инициализацией переменной @ObjMnemo в запросе (значение возвращается верное) - не работает

а вот почему? ...
17 окт 13, 13:26    [14985167]     Ответить | Цитировать Сообщить модератору
 Re: UDF не заходит в IF и просто в коде заходит  [new]
Glory
Member

Откуда:
Сообщений: 104751
ef1
а вот почему? .

Потому что в переменной другое значение
17 окт 13, 13:28    [14985181]     Ответить | Цитировать Сообщить модератору
 Re: UDF не заходит в IF и просто в коде заходит  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
ef1
нет нет, это я для проверки делал...
сравниваю с (единственным) английским вариантом 'Cnt'

но получается что с явной инициализацией переменной @ObjMnemo через Set все работает
а с инициализацией переменной @ObjMnemo в запросе (значение возвращается верное) - не работает

а вот почему? ...


а структуру таблиц можете показать?

lsdbo.object_type
lsdbo.object_reference
17 окт 13, 13:29    [14985190]     Ответить | Цитировать Сообщить модератору
 Re: UDF не заходит в IF и просто в коде заходит  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31987
ef1
но получается что с явной инициализацией переменной @ObjMnemo через Set все работает
а с инициализацией переменной @ObjMnemo в запросе (значение возвращается верное) - не работает

а вот почему? ...
Как вы проверили, что возвращается в запросе внутри функции?

Естественно, IF не может работать неправильно, это можете исключить из вариантов :-)

Просто отладьте код, это же так просто.

И вообще, что в вашем понимании "не могу попасть в блок IF", что функция то возвращает?

Может, управление попадает в блок IF, но вы об этом не знаете?
17 окт 13, 13:33    [14985220]     Ответить | Цитировать Сообщить модератору
 Re: UDF не заходит в IF и просто в коде заходит  [new]
ef1
Member

Откуда: Москва
Сообщений: 191
вот текущая UDF
ALTER function [LSDBO].[Ric_Get_CallerID]
--получить строку содержащую номер телефона @Phone
        (@Phone varchar(256)      			-- Искомый номер телефона
         )
Returns varchar(255)
 Begin
  Declare @ObjMnemo varchar(255),			-- Mnemo текущего объекта
          @ObjId numeric(18),				-- id текущего объекта
          @CltId numeric(18),				-- id компании
          @ObjDescr varchar(255)			-- Описание текущего объекта. Возврат 

  Set @ObjDescr='Компания не определена'	-- Значение по умолчанию

  Select top(1)								-- Запрос на первое попавшееся совпадение 
         @ObjId = rw.id,
         @ObjMnemo = tw.mnemo, 
         @ObjDescr = rw.description
    From lsdbo.object_reference rw left join lsdbo.object_type tw on rw.type_id = tw.id left join 
         lsdbo.attrib_value av on rw.id = av.object_id and av.attrib_id = 100040102200000 left join 
         lsdbo.value_string vv on av.value_id = vv.id and av.attrib_id = 100040102200000 
   Where vv.value like '%'+@Phone+'%' 
   Order by tw.mnemo  

  --Исключение - если это контактное лицо выйти на компанию 
  -- Set @ObjMnemo='Сnt'
   If @ObjMnemo='Сnt'
       Select @ObjDescr = case rw.id when @ObjId then 'Частное лицо' else rw.description end  
                         From lsdbo.object_reference rw left join lsdbo.object_type tw on rw.type_id=tw.id 
                        Where rw.id = (Select LSDBO.Ric_Get_Numeric_atr(@ObjId, 100004087100000))
  Return @ObjDescr
 End

вот она же в студии по шагам с принтами

К сообщению приложен файл. Размер - 43Kb
17 окт 13, 13:42    [14985267]     Ответить | Цитировать Сообщить модератору
 Re: UDF не заходит в IF и просто в коде заходит  [new]
ef1
Member

Откуда: Москва
Сообщений: 191
она в отладчике работает.....
все!
я скопировал текст с IF из отладчика вставил в UDF - запустилась....
не знаю в чем было дело (но не в русских буквах)
причем в отладчике она тоже не сразу пускалась
сначала вот так не работала If @ObjMnemo='Сnt'
поменял на такое сравнение If @ObjMnemo Like 'Сnt' - заработала
вернул обратно на If @ObjMnemo='Сnt' - заработала

в общем наверно день сегодня такой...

ВСЕМ ОГРОМНОЕ СПАСИБО ЗА ПОДДЕРЖКУ!!!!!)))
17 окт 13, 13:46    [14985294]     Ответить | Цитировать Сообщить модератору
 Re: UDF не заходит в IF и просто в коде заходит  [new]
Гость333
Member

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

Покажите ещё вызов функции.
17 окт 13, 13:47    [14985298]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить