<table-valued function =“”>不是可识别的内置函数名</table-valued>

时间:2012-03-05 23:19:46

标签: sql sql-server sql-server-2008

我收到此错误:

  

Msg 195,Level 15,State 10,Line 1   'fnParseName'不是公认的内置函数名。

在此查询中:

SELECT  fnParseName(DOCTORFIRSTNAME+' ' +DOCTORLASTNAME) 
  FROM [PracticeandPhysician]

这是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

为什么我收到此错误?

5 个答案:

答案 0 :(得分: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);

请注意,您不能说:

SELECT dbo.TableValueFunction('foo');

比你说的更多:

SELECT dbo.Table;
--or
SELECT dbo.View;

但是,您可以说:

SELECT * FROM dbo.fnParseName('foo bar');
--or
SELECT FirstName, Middle, LastName FROM dbo.fnParseName('foo bar');

(并不是说我已经验证了你的功能符合你的想法,或者效率很高。)

请像其他人建议的那样always use the dbo. prefix

答案 1 :(得分:12)

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

SELECT dbo.fnParseName(--etc

答案 2 :(得分:1)

UDF /函数需要以模式名称为前缀(很可能是“dbo”)。将通话更改为

SELECT
    dbo.fnParseName(DOCTORFIRSTNAME + ' ' + DOCTORLASTNAME) 
FROM
    [PracticeandPhysician]

答案 3 :(得分:1)

你遇到的问题与我遇到的问题类似。标量函数和表内联函数在实现方面有很大不同。请参阅下面的差异

 Create function udfCountry
 (
@CountryName varchar(50)
 )
 returns varchar(2)
 as 
 BEGIN
 Declare @CountryID varchar(2),
    @Result varchar(2)

 Select @CountryID = Country from 
dbo.GeoIPCountryNames where CountryName = @CountryName

set @Result = isNull(@CountryID, 'NA')
if @Result = 'NA'
set @Result = 'SD'
return @Result
End

//实施

select dbo.[udfCountry]('Nigeria')

//示例结果

NG

//内联表函数示例

 Create FUNCTION  ConditionEvaluation
 (
  @CountrySearch varchar(50)
 )
 returns @CountryTable table 
(
Country varchar(2),
CountryName varchar(50)
 )
 as 

 Begin

 Insert into @CountryTable(Country, CountryName)
 Select Country, CountryName from GeoIPCountryNames
 where Country like '%'+@CountrySearch+'%'
 return 
 end

//实施样本

 Declare @CountrySearch varchar(50)
 set @CountrySearch='a'
 select * from  ConditionEvaluation(@CountrySearch)

实现标量的部分是完全不同的内联表。我希望这有帮助

答案 4 :(得分:1)

如果要在存储过程的变量中分配tfn返回的值,可以这样做:

select  @my_local_variable_in_procedure = column_name_returned_from_tfn from dbo.my_inline_tfn (@tfn_parameter)