我仍然是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”的列信息
答案 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)
现在的问题毫无疑问我很遗憾地说......