【问题标题】:SQL 2008 user defined function not recognizedSQL 2008 用户定义函数无法识别
【发布时间】: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') - 这是一个标量函数而不是表值函数

标签: sql sql-server-2008 user-defined-functions


【解决方案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)

【讨论】:

    猜你喜欢
    • 2015-02-17
    • 1970-01-01
    • 2019-04-03
    • 2017-06-21
    • 2021-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多