<table-valued function>不是可识别的内置函数名称

l--*_*''' 13 sql sql-server sql-server-2008

我收到此错误:

消息195,级别15,状态10,行
1'fnParseName'不是可识别的内置函数名称.

在这个查询:

SELECT  fnParseName(DOCTORFIRSTNAME+' ' +DOCTORLASTNAME) 
  FROM [PracticeandPhysician]
Run Code Online (Sandbox Code Playgroud)

这是fnParseName的代码

create FUNCTION [dbo].[fnParseName]
               (@FullName NVARCHAR(128))
RETURNS @FullNameParts TABLE  (FirstName  NVARCHAR(128),
                               Middle     NVARCHAR(128),
                               LastName   NVARCHAR(128))
AS
  BEGIN
    ... function body that populates @FullNameParts ...
    RETURN
  END
Run Code Online (Sandbox Code Playgroud)

为什么我收到此错误?

Aar*_*and 19

这是一个表值函数.所以你可能意味着:

SELECT p.DOCTORFISTNAME, p.DOCTORLASTNAME, t.FirstName, t.Middle, t.LastName
  FROM dbo.[PracticeandPhysician] AS p
  CROSS APPLY dbo.fnParseName(p.DOCTORFIRSTNAME + ' ' + p.DOCTORLASTNAME);
Run Code Online (Sandbox Code Playgroud)

请注意,你不能说:

SELECT dbo.TableValueFunction('foo');
Run Code Online (Sandbox Code Playgroud)

比你说的更多:

SELECT dbo.Table;
--or
SELECT dbo.View;
Run Code Online (Sandbox Code Playgroud)

但是,您可以说:

SELECT * FROM dbo.fnParseName('foo bar');
--or
SELECT FirstName, Middle, LastName FROM dbo.fnParseName('foo bar');
Run Code Online (Sandbox Code Playgroud)

(并不是说我已经验证了你的功能是按照你的想法做到的,或者是有效的.)

始终使用dbo.其他人建议前缀.


Pet*_*art 12

您始终必须使用模式名称dbo.或该函数的模式名称为SQL函数调用添加前缀(dbo是默认模式).

SELECT dbo.fnParseName(--etc
Run Code Online (Sandbox Code Playgroud)

  • @Peter它是一个表值函数.前缀很重要,但真正的问题是你不能像表达式那样引用表值函数(尽管你可以使用标量UDF). (2认同)