由另一个程序员创建的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
答案 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上测试过。