2012-03-05 31 views
13

我收到此错误:<表值函数>是无法识别的内置函数名称

Msg 195, Level 15, State 10, Line 1
'fnParseName' is not a recognized built-in function name.

在此查询:

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 

为什么我得到这个错误?

+0

这是值函数表是否有帮助 – 2012-03-05 23:28:17

回答

18

这是一个表值函数。所以,你可能是指:

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

+0

非常感谢你!我怎么会把整个桌子都放进fnparsename? – 2012-03-06 03:09:41

+0

我没有证明在第一个样本中,使用'CROSS APPLY'?它应该在'dbo。[Practice andPhysician]''中输出来自每个输入行的列。 – 2012-03-06 03:10:10

+0

这太棒了!什么是交叉应用 – 2012-03-06 03:59:50

12

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

SELECT dbo.fnParseName(--etc 
+0

消息4121,级别16,状态1,行2 找不到列“dbo”或用户定义的函数或集合“dbo.fnParseName”,或名称不明确。 – 2012-03-05 23:23:21

+0

然后我会说你是在错误的数据库。 – 2012-03-05 23:27:02

+0

@MattGibson nope绝对不是,我可以发送你的快照,如果你想 – 2012-03-05 23:27:33

2

UDF /函数需要以模式名称(最可能是“dbo”)作为前缀。将呼叫更改为

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

消息4121,级别16,状态1,行2 无法找到列“dbo”或用户定义的函数或聚合“dbo.fnParseName”,或名称不明确。 – 2012-03-05 23:23:08

+0

模式前缀在这里不是问题(虽然它仍然是必需的,但有一个更基本的语法问题)。 – 2012-03-05 23:54:58

1

您遇到的问题与我遇到的问题类似。标量函数和表内联函数在实现方面有很大不同。见下面的diiferent

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 '%'[email protected]+'%' 
return 
end 

//实施样品

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

实现标量的parttern是完全不同的行内表。我希望这有助于

1

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

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