Вызов определенной пользователем скалярной функции из программы sql - PullRequest
0 голосов
/ 02 июля 2010

Я все еще новичок в функциях 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 для вызова и проверки вышеfunction:

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Поставщик БД "MSDASQL" для связанного сервера "SrvLinnk"

1 Ответ

1 голос
/ 02 июля 2010

Ну, функция должна выглядеть так, по крайней мере, , если это для 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) ваш мин / макс составляет +/- 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)

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

...