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驱动程序
SQL Server 2008 - 返回连接条目和“无法绑定多部分标识符”错误的用户定义函数