我编写了一个存储过程,该存储过程期望VARCHAR表示XML格式的某些数据。这是一个相同的示例:
'<Documents><Filters><DocClasses><DocClass Value="QUO" /></DocClasses></Filters></Documents>'
我处理XML以填充表变量:
DECLARE @DocClassesFiltered BIT
DECLARE @DocClasses TABLE
([DocClass] VARCHAR(3) PRIMARY KEY)
SET @DocClassesFiltered = 0
我使用的是sp_xml_preparedocument等,这是沼泽的标准,因此我不会通过记录在案。可以说我将其句柄保存在名为@idoc
的变量中然后我按如下方式填充表变量:
IF EXISTS
(SELECT TOP 1 1
FROM OPENXML(@idoc, 'Documents/Filters/DocClasses/DocClass', 2)
WITH([Value] VARCHAR(3) '@Value') [DAL])
BEGIN
SET @DocClassesFiltered = 1
INSERT
INTO @DocClasses
([DocClass])
SELECT [Value]
FROM OPENXML(@idoc, 'Documents/Filters/DocClasses/DocClass', 2)
WITH([Value] VARCHAR(3) '@Value') [DAL]
END
在“实际执行计划”输出中,产生警告 查询内存授予检测到“ ExcessiveGrant”,这可能会影响可靠性。资助金额 ....(等)
我的问题: 1)我什至需要为此担心吗? 2)如果可以,该如何避免?
答案 0 :(得分:0)
我先计算行数,然后在TOP中使用结果,以防止出现过多拨款。显然,这导致SQL对所需的内存进行了更好的估计,并且“过量授权”警告“消失了”。
DECLARE @XMLFilterCount INT
SELECT @XMLFilterCount = COUNT(1)
FROM OPENXML(@idoc, 'Documents/Filters/DocClasses/DocClass', 2)
WITH([Value] VARCHAR(3) '@Value') [DAL]
IF @XMLFilterCount > 0
BEGIN
SET @DocClassesFiltered = 1
INSERT
INTO @DocClasses
([DocClass])
SELECT TOP (@XMLFilterCount) [Value]
FROM OPENXML(@idoc, 'Documents/Filters/DocClasses/DocClass', 2)
WITH([Value] VARCHAR(3) '@Value') [DAL]
END