Sql server 如何避免在此处出现过多的授权警告?或者我甚至需要担心吗?
我编写了一个存储过程,它需要一个以XML格式表示某些数据的VARCHAR。下面是一个相同的示例:Sql server 如何避免在此处出现过多的授权警告?或者我甚至需要担心吗?,sql-server,memory,Sql Server,Memory,我编写了一个存储过程,它需要一个以XML格式表示某些数据的VARCHAR。下面是一个相同的示例: '<Documents><Filters><DocClasses><DocClass Value="QUO" /></DocClasses></Filters></Documents>' 我使用的是bog标准的sp_xml_PreparedDocument等文件,所以我不会通过记录这些文件来让您感到厌烦。我只想说,
'<Documents><Filters><DocClasses><DocClass Value="QUO" /></DocClasses></Filters></Documents>'
我使用的是bog标准的sp_xml_PreparedDocument等文件,所以我不会通过记录这些文件来让您感到厌烦。我只想说,我将它的句柄保存在一个名为@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
在“实际执行计划”输出中,这将生成警告
查询内存授予检测到“过度授予”,这可能会影响可靠性。授权大小。。。。(等)
我的问题是:
1) 我真的需要担心吗?
2) 如果是这样,我如何避免这种情况?我通过首先计算行数,然后在顶部使用结果来防止过度授权。显然,这会导致SQL对所需的内存做出更好的估计,并且过量的授权警告“消失”
您是否尝试过使用XML方法重写代码,例如
value()
?这会导致同样的警告吗?你好,罗杰·沃尔夫——XML不是问题所在;如果没有Insert语句,SELECT不会导致这种过度授权。然而,我确实找到了解决这个问题的方法——如果这是一个问题的话——请看下面我自己的答案。。。。
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
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