Я открыл много больших 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, файл навсегда останется во внутреннем кеше. Это реально?
@HABO Спасибо! но я обнаружил, что даже если я использую 0 в качестве аргумента, он ничего не возвращает. Только когда я выполняю sp на той же вкладке, я могу восстановить открытый XML
Должен признаться, что я понятия не имею об этом... Причина может заключаться в том, что этот подход устарел примерно на 15 лет... Поддержка XML была введена с v2000, а основные методы XQuery вошли в игру, я думаю, с v2005. С тех пор рекомендуемым подходом являются методы , предоставляемые собственным типом данных XML . Вы можете использовать цикл подсчета, чтобы вызвать sp_xml_removedocument с любым номером... или перезагрузить систему, если это возможно.
забавный факт: я только что погуглил сервер sql, чтобы удалить xml-документы из памяти сервера. Первая запись относится к 2005 году и возвращает два предложения: цикл подсчета и перезапуск сервера :-)
@Shnugo Спасибо за ваш ответ, сервер находится в работе, поэтому мы не можем легко его перезапустить. Решение цикла кажется практичным, хотя я думаю, что дескрипторы могут быть не уникальными для разных сеансов. В любом случае, я попробую это решение. Спасибо!
@zening.chen, пожалуйста, дайте нам знать, если это сработало. Это поможет другим с той же проблемой.
@Shnugo Извините, но это не помогает.





Похоже, что единственным решением этой проблемы является перезагрузка сервера. Ошибка исчезло после перезагрузки.
Используйте выберите document_id из sys.dm_exec_xml_handles(@@SPID); чтобы получить ручки.