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

Posted

技术标签:

【中文标题】SQL 2008 用户定义函数无法识别【英文标题】:SQL 2008 user defined function not recognized 【发布时间】:2020-05-14 15:43:21 【问题描述】:

这是我第一次尝试用户定义的函数,所以我在识别我做错了什么时遇到了一些问题。我的目标是创建一个函数,该函数将接受零件 ID 作为参数,然后处理一系列 if 条件,分析 ID 中的第二个字符,以确定基于标准命名约定的产品类型。我在脚本中做了一些调整,我在 master 和数据库中运行了每个版本。创建函数时我没有收到任何失败错误,但是每次尝试使用它都会导致以下错误。 “get_product_type”不是可识别的内置函数名称。

此功能的当前版本如下。

create function get_product_type (@part nvarchar(30))
returns nvarchar(30)
with execute as caller
as 
begin
    DECLARE @product nvarchar(30);
    if SUBSTRING(@part,1,1) = 'A' 
        set @product = 'ELLIPTICAL';
    else if SUBSTRING(@part,1,1) = 'B' 
        set @product = 'F&D SPHERICAL';
    else if SUBSTRING(@part,1,1) = 'C' 
        set @product = 'F&D SPHERICAL';
    else if SUBSTRING(@part,1,1) = 'D' 
        set @product = 'HEMISPHERICAL';
    else if SUBSTRING(@part,1,1) = 'E' 
        set @product = 'CONICAL';
    else if SUBSTRING(@part,1,1) = 'F' 
        set @product = 'FLANGED ONLY';
    else if SUBSTRING(@part,1,1) = 'G' 
        set @product = 'DISHED ONLY';
    else if SUBSTRING(@part,1,1) = 'H' 
        set @product = 'TULIP BOWL';
    else if SUBSTRING(@part,1,1) = 'I' 
        set @product = 'TESTING/COUPONS/CHARPIES';
    else if SUBSTRING(@part,1,1) = 'J' 
        set @product = 'FLARED/DISHED';
    else if SUBSTRING(@part,1,1) = 'K' 
        set @product = 'HEAD BRACES';
    else if SUBSTRING(@part,1,1) = 'L' 
        set @product = 'MISCELLANEOUS';
    else if SUBSTRING(@part,1,1) = 'M' 
        set @product = 'HEAD PAD EXTENSIONS';
    else if SUBSTRING(@part,1,1) = 'N' 
        set @product = 'HEAD PADS';
    else if SUBSTRING(@part,1,1) = 'O' 
        set @product = 'MISCELLANEOUS';
    else if SUBSTRING(@part,1,1) = 'P' 
        set @product = 'HUBS';
    else if SUBSTRING(@part,1,1) = 'Q' 
        set @product = 'FLANGED/FLUED';
    else if SUBSTRING(@part,1,1) = 'R' 
        set @product = 'FLUED/PLATE';
    else if SUBSTRING(@part,1,1) = 'S' 
        set @product = 'SILL PAD';
    else if SUBSTRING(@part,1,1) = 'T' 
        set @product = 'TOOLING';
    else if SUBSTRING(@part,1,1) = 'U' 
        set @product = 'CYLENDAR REPAD';
    else if SUBSTRING(@part,1,1) = 'V' 
        set @product = 'ROLLING CANS';
    else if SUBSTRING(@part,1,1) = 'W' 
        set @product = 'HEAT TREAT';
    else if SUBSTRING(@part,1,1) = 'X' 
        set @product = 'SPHERE';
    else if SUBSTRING(@part,1,1) = 'Y' 
        set @product = 'BLASTING';
    else if SUBSTRING(@part,1,1) = 'Z' 
        set @product = 'MISCELLANEOUS';
    else set @product = 'MISCELLANEOUS';

    return @product
end

如果问题在于我如何尝试调用该函数,那么我的所有尝试都是,

get_product_type(cl.PART_ID), 

如果有人能在正确的方向上提供推动力,将不胜感激。

谢谢大家。

【问题讨论】:

澄清一下,我一直在尝试在 select 语句中调用它,我只是不想包含整个查询,但我会相应地修改帖子 我有点明白你在说什么,我会做一些研究。谢谢。 好吧,我仍然缺少一些东西,我尝试 select * from get_product_type 'aa' 认为它会返回 'ELLIPTICAL' 但现在我得到的错误是 - 无效的对象名称 'get_product_type'。跨度> 是的,正如@MartinSmith 两次指出的那样,您在函数名称之前缺少dbo. 哦 - 不要使用 select * from dbo.get_product_type('aa') 使用 select dbo.get_product_type('aa') - 这是一个标量函数而不是表值函数 【参考方案1】:

我不会这样做——它非常慢,您可以使用 SQL 使用左连接加快此过程

首先定义一个表,有两列,一个字符代码和一个描述

它看起来像这样

 CREATE TABLE LOOKUP (
    CODE CHAR(1),
    DESC VARCHAR(100)
 )

将 CODE 字段设为主键。

然后你可以像这样“调用”你的函数:

 SELECT 
   COALESCE(LOOKUP.DESC,'MISCELLANEOUS') AS DESC
 FROM TABLENAMEHERE
 LEFT JOIN LOOKUP ON LOOKUP.CODE =  SUBSTRING(TABLENAMEHERE.PRODUCTCODE,1,1)

【讨论】:

以上是关于SQL 2008 用户定义函数无法识别的主要内容,如果未能解决你的问题,请参考以下文章

Window 2008 Tomcat 7 MS SQL Server 2008R2 - 无法识别JNDI JDBC驱动程序

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

SQL Server 2008 - 返回连接条目和“无法绑定多部分标识符”错误的用户定义函数

SQL Server 10.50 OVER PARTITION 无法识别

appdesign中的函数或变量参数无法识别

用户定义的结构在声明时无法识别并给出类型错误