2012-03-05 12 views
13

sto ottenendo questo errore:<funzione con valori di tabella> non è un riconosciuto built-in nome della funzione

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

In questa query:

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

Ecco il codice per 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 

Perché viene visualizzato questo errore?

+0

si tratta di una tabella di funzione con valori se questo aiuta –

risposta

18

È una funzione valutata a livello di tabella. Quindi probabilmente volevi dire:

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

Si noti che non si può dire:

SELECT dbo.TableValueFunction('foo'); 

Non più di quanto si potrebbe dire:

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

È possibile, tuttavia, dire:

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

(Non che io abbia convalidato quello la tua funzione fa quello che pensi, o lo fa in modo efficiente.)

Si prega di always use the dbo. prefix come altri hanno suggerito.

+0

grazie mille !!! come potrei passare un'intera tabella in fnparsename? –

+0

Non l'ho mostrato nel primo esempio, usando 'CROSS APPLY'? Dovrebbe generare colonne da ogni riga di input in 'dbo. [PracticeandPhysician]'. –

+0

questo è meraviglioso! cosa fa cross apply –

12

È sempre necessario prefissare chiamate di funzione SQL con il nome schema dbo. o il nome dello schema per tale funzione (dbo è lo schema predefinito).

SELECT dbo.fnParseName(--etc 
+0

Msg 4121, Livello 16, stato 1, riga 2 Impossibile trovare la colonna "dbo" o la funzione definita dall'utente o aggregare "dbo.fnParseName" o il nome è ambiguo. –

+0

Quindi direi che ti trovavi nel database sbagliato. –

+0

@MattGibson decisamente no, posso inviarti un'istantanea se vuoi –

2

UDF/funzioni devono essere preceduto con il nome dello schema (molto probabilmente "dbo"). Cambia la chiamata a

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

Msg 4121, livello 16, stato 1, riga 2 Impossibile trovare la colonna "dbo" o la funzione definita dall'utente o aggregare "dbo.fnParseName" o il nome è ambiguo. –

+0

Il prefisso dello schema non è il problema qui (mentre sarà ancora richiesto, c'è un problema di sintassi più fondamentale). –

1

Il problema riscontrato è simile a quello che ho riscontrato anch'io. La funzione scalare e le funzioni inline della tabella sono abbastanza diverse in termini di implementazione. Vedi sotto per la 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 

// Implementation

select dbo.[udfCountry]('Nigeria') 

// campione risultato

NG 

// funzione di tabella linea di esempio

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 

// campione Implementation

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

il parttern di implementazione di scalare è una tabella in linea piuttosto diversa.Spero che questo aiuta

1

Se si desidera assegnare il valore restituito da TFN in una variabile di stored procedure, si può fare in questo modo:

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