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”
ExecuteSqlCommand 返回“无效的对象名称”错误
SqlException:在 C# (VISUAL STUDIO) 和 sql server 中构建网站时出现无效的对象名称错误
在 SQL 中使用 Group By 和 Aggregate - 获取错误“选择列表中的列无效,因为它不包含在聚合函数或 GROUP BY 中”