7

我定义了以下功能

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

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

4

5 回答 5

21

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

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

应该管用。

您不能将其视为表格,即select * ...您只需如上所述直接选择结果即可。

有关详细信息,请参阅函数类型。

于 2013-07-31T10:24:44.870 回答
4

正如 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 =@business_id
)

然后您以相同的方式使用它:

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

查看: 查询性能和多语句表值函数

于 2013-07-31T10:33:24.137 回答
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')
于 2013-07-31T10:26:07.887 回答
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
于 2013-07-31T10:32:32.490 回答
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) 
于 2019-03-28T05:26:11.670 回答