<table-valued function> не является признанным встроенным именем функции
Я получаю эту ошибку:
Msg 195, уровень 15, состояние 10, строка 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
Почему я получаю эту ошибку?
Ответы
Ответ 1
Это табличная функция. Поэтому вы, вероятно, имели в виду:
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');
(Не то, чтобы я подтвердил, что ваша функция делает то, что вы думаете, или делает это эффективно.)
Пожалуйста, всегда используйте префикс dbo.
, как предлагали другие.
Ответ 2
Вам всегда нужно префиксные вызовы функций SQL с именем схемы dbo.
или именем схемы для этой функции (dbo - это схема по умолчанию).
SELECT dbo.fnParseName(--etc
Ответ 3
UDFs/Функции должны иметь префикс имени схемы (скорее всего, "dbo" ). Измените вызов на
SELECT
dbo.fnParseName(DOCTORFIRSTNAME + ' ' + DOCTORLASTNAME)
FROM
[PracticeandPhysician]
Ответ 4
Проблема, с которой вы столкнулись, похожа на то, с чем я столкнулся. Скалярная функция и встроенные функции таблицы существенно отличаются в плане реализации. См. Ниже для различных
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 реализации скаляра - совершенно другая встроенная таблица. Надеюсь, это поможет
Ответ 5
Если вы хотите присвоить значение, возвращаемое tfn, в переменной хранимой процедуры, вы можете сделать это следующим образом:
select @my_local_variable_in_procedure = column_name_returned_from_tfn from dbo.my_inline_tfn (@tfn_parameter)