我有以下功能定义
alter FUNCTION [dbo].[GetXMLValues](@business_id int, @id varchar(30))
RETURNS varchar(30)
AS
BEGIN
declare @xmlValue varchar(30)
set @xmlValue = (SELECT top 1000 T.Content.value('(/XmlDataPairDocument/dataitem[@id=sql:variable("@id")]/@value)[1]', 'VARCHAR(100)')
FROM tblApplications T where t.business_id =@business_id)
return @xmlValue
END
我点击F5命令成功执行/...
但是当我尝试使用以下查询执行它时:
select * from [GetXMLValues](1,'sadfj')
它显示错误说:Invalid object name 'GetXMLValues'.
是什么原因?什么是错误?
答案 0 :(得分:12)
这是标量功能,而不是表格值功能。
select dbo.[GetXMLValues](1,'sadfj')
应该有用。
您不能将此视为表格,即select * ...
,您只需直接按上述方式选择结果。
有关详细信息,请参阅Types of Functions。
答案 1 :(得分:3)
正如t-clausen.dk和Ian Preston所提到的那样,这是因为你有一个Scalar函数而不是一个表值函数。
我只想扩展t-clausen.dk的帖子,该帖子将您的函数切换为多语句表值函数。我会更进一步,实际使用内联表值函数:
ALTER FUNCTION [dbo].[GetXMLValues](@business_id int, @id varchar(30))
RETURNS TABLE
AS
RETURN (
SELECT top 1000 T.Content.value('(/XmlDataPairDocument/dataitem[@id=sql:variable("@id")]/@value)[1]', 'VARCHAR(100)')
FROM tblApplications T where t.business_id =@business_id
)
然后以相同的方式使用:
select xmlValue from dbo.[GetXMLValues](1,'sadfj')
退房: Query performance and multi-statement table valued functions
答案 2 :(得分:2)
你的函数没有返回一个表,它返回一个varchar(30)。使用您的函数的正确语法是:
select [dbo].[GetXMLValues](1,'sadfj')
尝试使用此功能:
ALTER FUNCTION [dbo].[GetXMLValues](@business_id int, @id varchar(30))
RETURNS @t table (xmlValue varchar(30))
AS
BEGIN
insert @t (xmlValue)
SELECT top 1000 T.Content.value('(/XmlDataPairDocument/dataitem[@id=sql:variable("@id")]/@value)[1]', 'VARCHAR(100)')
FROM tblApplications T where t.business_id =@business_id
return
end
然后你可以用这种方式调用你的函数:
select xmlValue from dbo.[GetXMLValues](1,'sadfj')
答案 3 :(得分:1)
或者如果你想要一个表函数,尝试将你的函数更改为这样的东西 - 那么你可以使用select * from ...
ALTER FUNCTION [dbo].[GetXMLValues](@business_id int, @id varchar(30))
RETURNS
@outputTbl_xmlValue table
(
xmlValue varchar(30)
)
AS
BEGIN
INSERT @outputTbl_xmlValue SELECT top 1000 T.Content.value('(/XmlDataPairDocument/dataitem[@id=sql:variable("@id")]/@value)[1]', 'VARCHAR(100)')
FROM tblApplications T where t.business_id =@business_id)
return
END
GO
答案 4 :(得分:0)
ALTER FUNCTION Isnulldate(@maxdate1 DATETIME,
@maxdate2 DATETIME,
@maxdate3 DATETIME)
returns DATETIME
AS
BEGIN
DECLARE @date DATETIME
IF @maxdate3 IS NOT NULL
BEGIN
SET @date=@maxdate3
RETURN @date
END
IF @maxdate2 IS NOT NULL
BEGIN
SET @date=@maxdate2
RETURN @date
END
IF @maxdate1 IS NOT NULL
BEGIN
SET @date=@maxdate1
RETURN @date
END
RETURN @date
END
##执行##
DECLARE @dateim DATETIME=Getdate()
SELECT dbo.Isnulldate(NULL, NULL, @dateim)