2013-07-31 54 views
1

我有以下函数定义无效的对象名称错误在SQL

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 [email protected]_id) 


return @xmlValue 




END 

当我击F5命令执行成功/ ...

但是当我尝试使用下面的查询来执行它:

select * from [GetXMLValues](1,'sadfj') 

它显示了一个错误说:Invalid object name 'GetXMLValues'.

什么原因?什么是错误?

回答

9

这是一个标量函数,而不是表值函数。

select dbo.[GetXMLValues](1,'sadfj') 

应该工作。

你不能把这个看成是一张表,即select * ...,你只需要直接按上面的方法选择结果即可。

有关更多详细信息,请参见Types of Functions

+0

在我的案例问题不是使用“dbo”,但我并没有真正得到这些规则。 –

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 [email protected]_id 

return 
end 

然后,你可以调用你的函数是这样的:

select xmlValue from dbo.[GetXMLValues](1,'sadfj') 
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 [email protected]_id) 


    return 
END 


GO 
3

正如t-clausen.dk和Ian Preston所说,这是因为你有一个标量函数而不是表值函数。

我只是想延长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 [email protected]_id 
) 

,你再以同样的方式使用:

select xmlValue from dbo.[GetXMLValues](1,'sadfj') 

退房: Query performance and multi-statement table valued functions

+0

使用内联表+1 –

相关问题