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

Posted

技术标签:

【中文标题】SQL 中的函数中的无效对象名称错误【英文标题】:Invalid Object Name Error in Function in SQL 【发布时间】:2013-07-31 10:21:58 【问题描述】:

我定义了以下函数

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

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

【问题讨论】:

【参考方案1】:

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

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

应该可以。

你不能把它当成一个表格,即select * ...,你只需要像上面一样直接选择结果。

更多详情请见Types of Functions。

【讨论】:

在我的情况下,问题不是使用“dbo”,但我并没有真正了解这些规则。【参考方案2】:

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

我只是想扩展 t-clausen.dk 的帖子,它将您的函数切换为 多语句 表值函数。我会更进一步,并实际使用 inline 表值函数:

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

【讨论】:

【参考方案3】:

您的函数不是返回一个表,而是返回一个 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')

【讨论】:

【参考方案4】:

或者,如果您确实想要一个表函数,请尝试将您的函数更改为这样的 - 然后您可以使用 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

【讨论】:

【参考方案5】:
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) 

【讨论】:

虽然这段代码可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。

以上是关于SQL 中的函数中的无效对象名称错误的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 上表包含点时生成错误的 FROM 子句导致 Sqoop 无效对象名称错误

尝试发布 Web 应用程序时应用程序中的服务器错误。无效的对象名称“dbo.Employees”

第 1 行的 CSV 输入中的列数无效错误

ExecuteSqlCommand 返回“无效的对象名称”错误

SqlException:在 C# (VISUAL STUDIO) 和 sql server 中构建网站时出现无效的对象名称错误

在 SQL 中使用 Group By 和 Aggregate - 获取错误“选择列表中的列无效,因为它不包含在聚合函数或 GROUP BY 中”