从sql程序调用用户定义的标量函数

时间:2010-07-02 14:23:17

标签: tsql user-defined-functions

我仍然是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

     

Msg 7350,Level 16,State 2,Line 5   无法从OLE DB提供程序“MSDASQL”获取链接服务器“SrvLinnk”的列信息

1 个答案:

答案 0 :(得分: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),你的最小值/最大值是+/- 9.999那么为什么这个“When @LTV_Range >= 100 then '100+'”?

接下来,为什么OPENQUERY会向包含SQL Server函数的DB2实例提交SQL调用?

我假设你想要函数调用+分组+外部排序。你在哪里设置@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)

现在的问题毫无疑问我很遗憾地说......