Вызов пользовательской скалярной функции из программы sql

Я все еще новичок в функциях SQL. Я пытаюсь понять, как правильно использовать в программе SQL. Я хочу протестировать скалярные UDF, которые я создал, чтобы убедиться, что они правильно возвращают данные и могут возвращать большое количество данных по порядку. Я не уверен, что не так с моим синтаксисом в SQL для использования функции, так как это моя первая попытка. Может ли кто-нибудь направить меня в правильном направлении?

Вот пример.

Код функции:

SET ANSI_NULLS_ON
GO
GET QUOTED_IDENTIFIER ON
GO

ALTER FUNCTION dbo.FN_LTV_Ranges

(

   @LTV_RANGE     decimal(4,3)
)

Returns variable (160
as 
Begin

declare @Return     varchar(16)
select  @Return =

        Case 
        When @LTV_Range is NULL then 'Missing'
        When @LTV_Range is 00.00 then 'Missing'
        When @LTV_Range <= 0.75 then '<=0.75'
        When @LTV_Range between 0.75 and 0.80 then '75-80'
        When @LTV_Range between 0.80 and 0.90 then '80-90'
        When @LTV_Range between 0.90 and 1.00 then '90-100'
        When @LTV_Range >= 100 then '100+'
        else null end

        Return &Return
END

вот программа SQL для вызова и проверки вышеуказанной функции:

declare @LTV_Range         decimal(4,3)

Select top 600   s.LNumber

from OPENQUERY (SvrLink,  '

Select Lnumber, dbo.FN_LTV_Range(@LTV_Range)

 from some_table s
        where s.LNumber > '0'
          group by @LTV_Range
          Order by @LTV_Range

for Fetch only with UR')

Вот ошибка, возвращаемая при попытке запустить программу SQL:

Поставщик OLE CB "MSDASQL" для связанного сервера "SvrLink" вернул сообщение "(IBM)(драйвер CLI) (DB2/LINUXX8641) SQL0306N "@LTV_RANGE" недействителен в контексте, где он используется. SQLSTATE= 42703

Сообщение 7350, уровень 16, состояние 2, строка 5. Не удается получить информацию о столбце от поставщика OLE DB «MSDASQL» для связанного сервера «SrvLinnk».


person JMS49    schedule 02.07.2010    source источник
comment
Является ли эта функция функцией SQL Server?   -  person gbn    schedule 02.07.2010
comment
Да, эта функция является определяемой пользователем функцией сервера sql.   -  person JMS49    schedule 02.07.2010
comment
Он не будет создаваться в текущем формате в SQL Server...   -  person gbn    schedule 02.07.2010


Ответы (1)


Что ж, функция должна выглядеть как минимум так если она для SQL Server: то, что у вас выше, неверно

ALTER FUNCTION dbo.FN_LTV_Ranges
(

   @LTV_RANGE     decimal(4,3)
)
Returns varchar(16)
as 
Begin
declare @Return     varchar(16)
select  @Return =
        Case 
        When @LTV_Range is NULL then 'Missing'
        When @LTV_Range = 0 then 'Missing'
        When @LTV_Range <= 0.75 then '<=0.75'
        When @LTV_Range between 0.75 and 0.80 then '75-80'
        When @LTV_Range between 0.80 and 0.90 then '80-90'
        When @LTV_Range between 0.90 and 1.00 then '90-100'
        When @LTV_Range >= 100 then '100+'
        else null end
        Return @Return
END

Для десятичного числа (4,3) ваш min/max +/- 9,999, так почему это «When @LTV_Range >= 100 then '100+'»?

Далее, почему OPENQUERY отправляет вызов SQL экземпляру DB2, который включает функцию SQL Server?

Я предполагаю, что вам нужен вызов функции + группировка + упорядочение снаружи. А где вы устанавливаете @LTV_Range?

Наконец, группировка + упорядочивание по @LTV_Range бессмысленна: это одно значение, поэтому я предполагаю, что вы имеете в виду группировку/упорядочивание результата вызова функции.

declare @LTV_Range decimal(4,3)
Select top 600
   s.LNumber, dbo.FN_LTV_Range(@LTV_Range)
from
     OPENQUERY (SvrLink,  '
Select Lnumber
 from some_table s
        where s.LNumber > '0'
for Fetch only with UR')
group by dbo.FN_LTV_Range(@LTV_Range)
Order by dbo.FN_LTV_Range(@LTV_Range)

Вопрос в его нынешнем виде не имеет смысла, извините...

person gbn    schedule 02.07.2010
comment
Мне жаль, что я неправильно набрал информацию о функции, касающуюся возвращаемой переменной, закрывающие круглые скобки были непреднамеренно введены как ноль. Возвращаемые значения представляют собой проценты, представленные целыми числами. Причина необходимости группировать и упорядочивать возвращаемые данные заключается в том, что, когда разработчик использует функцию сводного типа (например, используя отчеты Count(*), тогда все возможные возвращаемые значения в порядке, на строках этого типа вывода: Lnumber LTV_Range 123 Отсутствует 300 ‹=75 250 75-90 75 80-90 2 100+ - person JMS49; 02.07.2010