2013-07-31 79 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 –

相關問題