Я генерирую XML из 60 таблиц и сохраняю этот XML в таблице.
Table Name : Final_XML_Table
PK FK XML_Content (type xml)
1 1 "XML that I am generating from 60 tables"
Когда я запускаю запрос ниже, он дает исключение памяти:
Select * from Final_XML_Table
Вещи, которые я пробовал: 1. Результаты в текст: я получаю только несколько строк из XML в виде текста в окне вывода. 2. Результаты в файл: я получаю только несколько строк из XML в файле.
Пожалуйста, предложите, а также, если есть какие-либо изменения, придется ли мне делать это на сервере SQL во время развертывания.
Я также установил XML_Data на неограниченный:
Я установил XML_DATA как неограниченный. все же он дает ту же ошибку
вы перезапускали SSMS?
Да, но не повезло :( ... такая же ошибка





Эта ошибка не является ошибкой SQL Server, это ошибка SSMS. Это означает, что SSMS не хватает памяти.
SSMS - это только 32-битное приложение, поэтому может адресовать только 2 ГБ ОЗУ. Если он попытается адресовать большее количество адресов, возникнет ошибка. если вы открыли SSMS и вернули очень большие наборы данных, эта оперативная память будет израсходована.
Честно говоря, если вы выполняете такой запрос, как SELECT * FROM Final_XML_Table, то я рискну предположить, что набор данных огромен. Добавьте предложение WHERE или не возвращайте набор данных на экран. если вам действительно нужно просмотреть данные (все), экспортируйте их во что-нибудь другое. Но я очень сомневаюсь, что вам нужно смотреть на строку каждый, если вы возвращаете около 2 ГБ данных.
table имеет только 1 запись и содержит xml, который содержит около 58 тыс. строк кода.
@JFI, если вы выполняли другие запросы, это также увеличило бы объем оперативной памяти, которую использует SSMS (поскольку иногда у нее есть привычка не выпускать ее). Хотя 58К строк сами по себе ничего не значат. Если бы в каждой строке было всего 1-10 символов, она не была бы такой большой, но если бы каждая имела 500-1000 (пробел (' ') тоже считается символом), то размер значительно больше. Точно так же, как таблица с 1 строкой и 1 столбцом, которая представляет собой nvarchar(MAX), которая заполнена до отказа, намного больше, чем таблица с 8 столбцами типа данных bit с 80 миллионами строк. (Первый составляет 2 ГБ, а другой ~ 80 МБ)
У меня есть файл xml размером 3 МБ, я вставил данные этого xml в 60 таблиц, и теперь я повторно генерирую xml из таблицы, я правильно сгенерировал 59 таблиц xml, и когда я создаю окончательную таблицу, которая содержит полный xml, как ожидалось , это выдает ошибку. Таким образом, ожидаемый размер xml составляет 3 МБ, который вставляется в таблицу в столбце типа xml.
Это не ответ, но за комментарий ...
Тот факт, что вы можете хранить XML, ясно показывает, что XML не является к большому для базы данных.
Тот факт, что вы получаете исключение недостаточно памяти с Select * from Final_XML_Table, ясно показывает, что SSMS имеет проблему при чтении / отображении вашего XML.
Вы можете попробовать проверить длину, как здесь:
DECLARE @tbl TABLE (x XML);
INSERT INTO @tbl VALUES('<root><test>blah</test><test /><test2><x/></test2></root>');
SELECT * FROM @tbl; --This does not work for you
SELECT DATALENGTH(x) FROM @tbl; --This returns just "82" in this case
Возможно, из-за логической ошибки при создании вашего XML (неправильное соединение?) XML содержит несколько / повторяющихся элементов. Вы можете попробовать запрос, подобный этому, чтобы получить количество узлов, чтобы проверить, реалистично ли это число:
SELECT x.value('count(//*)','int') FROM @tbl
В приведенном выше примере возвращается "5".
Вы можете сделать то же самое с исходным XML.
С помощью запроса, подобного следующему, вы можете получить все имена узлов первого уровня, второго уровня и так далее. Вы можете проверить, все ли в порядке:
SELECT firstLevel.value('local-name(.)','varchar(max)') AS l1_node
,SecondLevel.value('local-name(.)','varchar(max)') AS l2_node
--add more
FROM @tbl
OUTER APPLY x.nodes('/*') AS A(firstLevel)
OUTER APPLY A.firstLevel.nodes('*') AS B(SecondLevel)
--add more
И, конечно же, вы можете открыть ResourceMonitor, чтобы посмотреть на фактическое использование памяти ...
Вернитесь с подробностями ...
большое спасибо .... datalength - 37708889 Count - 928720 Я видел до 11 уровня, он выглядит хорошо, и до 11 уровня он дает около 710145 записей.
1-й и второй уровень точно такие же, как я ожидал.
@JFI Тот факт, что мои утверждения работают, ясно показывает: SSMS может иметь дело с большим XML, как это делает SQL Server, но он не может отображать этот размер, поскольку он ограничен 32-битными адресами.
да .. это правда ... но в этом случае, как я могу видеть исходный XML на ssms, который я использую для вставки данных в таблицы ... и ожидание, что этот xml такой же, как у меня, генерируемого
@JFI Вы проверяли DATALENGTH оригинала?
Попробуйте выполнить запрос щелкните правой кнопкой мыши, выберите «параметры» из контекстного меню и откройте область «сетки» в «результатах». Есть опция для данных XML. Вы можете установить это значение на «без ограничений». Это будет использовать всю память, которая может быть обработана. Значение по умолчанию может быть маленьким для вашего XML ...