2012-03-05 35 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)