TSQL 程序中无法识别 SQL 标量函数元素

Posted

技术标签:

【中文标题】TSQL 程序中无法识别 SQL 标量函数元素【英文标题】:SQL Scalar function element not recognized in TSQL program 【发布时间】:2010-07-04 20:43:29 【问题描述】:

我有一个输入 db2 表,其中包含两个元素:loan_number、debt_to_income;该表的名称是#Input_Table。我正在尝试通过针对该表运行 SQL 程序来测试该函数。问题是由于某种原因在 SQL 程序中无法识别该函数的元素,也许我一直在寻找很久?我需要验证表中的输出是否会按 debt_to_income 字段的顺序输出。

这里是功能代码:

 ALTER FUNCTION [dbo].[FN_DTI_BANDS]
(
    -- the parameters for the function here
    @FN_DTI_Band            decimal(4,3)
     )
RETURNS varchar(16)
AS
BEGIN

declare @Return varchar(16)

select @Return =

        Case
        when @FN_DTI_Band is NULL then ' Missing'
        WHEN @FN_DTI_Band = 00.00 then ' Missing'
        When @FN_DTI_Band < = 0.31 then 'Invalid'
        When @FN_DTI_Band between 0.31 and 0.34 then '31-34'
        When @FN_DTI_Band between 0.34 and 0.38 then '34-38'
        When @FN_DTI_Band >= 0.38 then '38+'
        else null end
            -- Return the result of the function
            RETURN @Return
END

这是 T-SQL 测试程序:

SELECT  loan_number,dbo.FN_DTI_BANDS(debt_to_income)as FN_DTI_Band

from #Input_table

SELECT      COUNT(*), FN_DTI_Band
FROM  #Input_table
GROUP BY FN_DTI_Band
ORDER BY FN_DTI_Band

这是错误:

Msg 207, Level 16, State 1, Line 7
Invalid column name 'FN_DTI_Band'.
Msg 207, Level 16, State 1, Line 5
Invalid column name 'FN_DTI_Band'.

有人可以帮我找出我忽略的地方吗?谢谢!

【问题讨论】:

【参考方案1】:

表 #input_table 没有名为 FN_DTI_Band 的列。

只有第一个 select 语句的结果具有该列名。

您需要使第一个选择语句成为第二个的子查询

类似这样的:

SELECT COUNT(*), T.FN_DTI_Band
FROM 
(
   SELECT  loan_number,dbo.FN_DTI_BANDS(debt_to_income) as FN_DTI_Band
   from #Input_table
) T
GROUP BY T.FN_DTI_Band
ORDER BY T.FN_DTI_Band

【讨论】:

尝试过并出现新错误:消息 8115,级别 16,状态 8,第 2 行将数字转换为数据类型数字的算术溢出错误。所以我尝试:使用 TEST SELECT COUNT(*), t.FN_DTI_BAND from ( SELECT loan_number, case when debt_to_income = 0 then 0 else dbo.FN_DTI_BANDS(debt_to_income) END as FN_DTI_Band from #T2 )T GROUP BY t.FN_DTI_Band ORDER BY t .FN_DTI_Band 还是不太对... 部分数据输入行在债务收入列中有 0.0000 您可以在 select 语句中使用 where 将其取出。 为什么要进行转换...只需将参数声明为数字而不是小数(4,3) 我只是没想到,SQL 对我来说还是有些新意。谢谢您指出这一点,非常感谢!【参考方案2】:

尝试在函数名称前加上“dbo”。

Select Count(*), dbo.FN_DTI_Band
From....

【讨论】:

以上是关于TSQL 程序中无法识别 SQL 标量函数元素的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Tsql 标量函数转换为表函数?

从 postgres 表中提取 json 数组给出错误:无法从标量中提取元素

tsql 实用程序 (FreeTDS) 可以连接到 SQL Server,但 pymssql 不能

SQL 2008 用户定义函数无法识别

区分 .sql 文件是 PL/SQL 还是 TSQL

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