0

另一个程序员创建的 SQL 函数正在减慢我的存储过程。

有谁知道为什么这会导致存储过程减慢其在查询 where 子句中的调用速度

AND (dbo.fn_XmlElementDateValue(ua.details, 'start_date') >= @StartDate)
AND (dbo.fn_XmlElementDateValue(ua.details, 'end_date') <= @EndDate)

功能

Create FUNCTION [dbo].[fn_XmlAttributeDateValue](@xml text, @tagname varchar(100))
RETURNS DATETIME 
AS 
BEGIN 
    DECLARE @startpos int, @endpos int, @returnvalue varchar(100)

    IF (NOT @tagname IS NULL)
       BEGIN

    SET @startpos = CHARINDEX('<field name="' + @tagname + '" value="', @xml) + LEN('<field name="' + @tagname + '" value="')

    IF (@startpos > 0)
    BEGIN
        SET @endpos = CHARINDEX('" />', @xml, @startpos)

        IF (@endpos > @startpos)
        BEGIN     -- Return the requested value 
            SET @returnvalue = SUBSTRING(@xml, @startpos, @endpos - @startpos)

            IF (ISDATE(@returnvalue) = 1)
            BEGIN
                 RETURN CAST(@returnvalue AS DATETIME)
            END
        END 
     END
   END  --  Tag empty or not found 
   RETURN NULL
END
4

1 回答 1

0

我强烈建议使用 XML 类型来查询 XML 数据。字符串操作既昂贵又低效。

这将涉及将您的功能更改为以下内容:

Create FUNCTION [dbo].[fn_XmlAttributeDateValue](@xml XML, @tagname varchar(100)) 
RETURNS DATETIME  
AS  
BEGIN 
    DECLARE @returnvalue varchar(100)
    IF ISNULL(@tagname, '') = ''        
        RETURN NULL

    SELECT @returnvalue = @xml.value('(//field[@name=(sql:variable("@tagname"))])[1]/@value', 'varchar(100)')
    RETURN CAST(@returnvalue AS DATETIME) 
END

然后像这样传递给函数:

DECLARE @InXML VARCHAR(MAX) = '<root><field name="test1" value="not interested" /><field name="test2" value="2013-11-04 00:00:01" /></root>'

SELECT [dbo].[fn_XmlAttributeDateValue](CONVERT(XML, @InXML), 'test2')

在 SQL 2012 上对此进行了测试。

于 2013-11-04T17:39:11.403 回答