#sql-server #xml #tsql #xml-parsing
#sql-сервер #xml #tsql #xml-синтаксический анализ
Вопрос:
Я открыл много больших XML-файлов, используя хранимую процедуру sp_xml_preparedocument
, и я закрываю вкладку в SSMS без вызова sp_xml_removedocument
для освобождения памяти.
В результате, теперь, когда я пытаюсь проанализировать другой XML, используя следующий код:
EXEC sp_xml_preparedocument @idoc OUTPUT, @result
Я получаю эту ошибку:
XML-документ не удалось создать из-за нехватки памяти сервера. Используйте sp_xml_removedocument для выпуска XML-документов
Но поскольку я не сохранил дескрипторы, как я мог освободить память, хранящуюся в открытом XML-файле? Сеанс был закрыт, и я больше не могу получить доступ к дескриптору…
P.S. Я не могу поверить, что если вы вызовете sp_xml_preparedocument
и забудете закрыть его с помощью sp_xml_removedocument
, файл останется во внутреннем кэше навсегда. Это реально?
Комментарии:
1. Используйте
select document_id from sys.dm_exec_xml_handles(@@SPID);
для извлечения дескрипторов.2. @HABO Спасибо! но я обнаружил, что даже если я использую 0 в качестве аргумента, он ничего не возвращает. Только когда я выполняю sp на той же вкладке, я могу восстановить открытый XML
3. Должен признать, что я понятия не имею об этом… Причина может заключаться в том, что этот подход устарел примерно на 15 лет… Поддержка XML была введена с версии 2000, и основные методы XQuery вступили в игру, я думаю, с версии 2005. С тех пор рекомендуемым подходом являются методы, предоставляемые собственным типом данных XML . Вы можете использовать цикл подсчета для вызова
sp_xml_removedocument
с любым номером… или перезагрузите систему, если это возможно.4. забавный факт: я только что погуглил sql server, чтобы удалить XML-документы из памяти сервера . Первая запись относится к 2005 году и возвращает два предложения: цикл подсчета и перезапуск сервера 🙂
5. @Shnugo Благодарит вас за ваш ответ, сервер находится в рабочем состоянии, поэтому мы не можем его легко перезапустить. Решение цикла кажется практичным, хотя я думаю, что дескрипторы могут быть не уникальными для разных сеансов. В любом случае, я попробую это решение. Спасибо!
Ответ №1:
Похоже, что единственным решением этой проблемы является перезапуск сервера. Ошибка исчезла после перезагрузки.