XML函数导致存储过程缓慢

时间:2013-11-04 14:10:45

标签: sql sql-server stored-procedures

由另一个程序员创建的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

1 个答案:

答案 0 :(得分: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上测试过。