SQL中的函数中的无效对象名称错误

时间:2013-07-31 10:21:59

标签: asp.net sql sql-server

我有以下功能定义

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'.

是什么原因?什么是错误?

5 个答案:

答案 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)