Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何避免在此处出现过多的授权警告?或者我甚至需要担心吗?_Sql Server_Memory - Fatal编程技术网

Sql server 如何避免在此处出现过多的授权警告?或者我甚至需要担心吗?

Sql server 如何避免在此处出现过多的授权警告?或者我甚至需要担心吗?,sql-server,memory,Sql Server,Memory,我编写了一个存储过程,它需要一个以XML格式表示某些数据的VARCHAR。下面是一个相同的示例: '<Documents><Filters><DocClasses><DocClass Value="QUO" /></DocClasses></Filters></Documents>' 我使用的是bog标准的sp_xml_PreparedDocument等文件,所以我不会通过记录这些文件来让您感到厌烦。我只想说,

我编写了一个存储过程,它需要一个以XML格式表示某些数据的VARCHAR。下面是一个相同的示例:

'<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