我收到此错误:
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
为什么我收到此错误?
答案 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)