Вставить из XML в таблицу SQL Server, где длина узла превышает 65000 символов?

#sql-server #xml #tsql #xquery

#sql-сервер #xml #tsql #xquery

Вопрос:

Может ли кто-нибудь помочь мне обойти ограничение (правильно переписать фактическую вставку) для SQLType, который не может быть типом «текст» при использовании значения fonction ? (ссылка : https://learn.microsoft.com/en-us/sql/t-sql/xml/value-method-xml-data-type?view=sql-server-ver15 )

Узел «примечания» в приведенном ниже xml будет иметь более 65000 символов. Если я оставлю его как есть, он будет обрезан после 65000 символов и проигнорирует остальное. изменение его на: MY_XML.mydata.query('NOTES').value('.', 'text') приведет к ошибке.

вот что у меня есть, которое работает практически для всего, кроме столбца «текст»:

 declare @myxml xml 

set @myxml = '<WebData>
  <Data>
    <ID>2003-0001</ID>
    <Number_1>2004</number>
    <NOTES> a huge chunk of text </notes>
  </Data>
</WebData>'

INSERT INTO myTable(ID,Number_1,NOTES)
SELECT MY_XML.mydata.query('ID').value('.', 'varchar(10)'),
MY_XML.mydata.query('Number_1').value('.', 'int'),
MY_XML.mydata.query('NOTES').value('.', 'nvarchar(max)') 
FROM @monxml.nodes('/WebData/data') MY_XML(mydata)
  

Комментарии:

1. Я не совсем уверен, почему вы используете .value() здесь в первую очередь.

2. Обнаружил запрос и заставил его работать. Я не был уверен, как запросить статистику xml в первую очередь, и большинство примеров, которые я нашел, используют это.

Ответ №1:

Я скачал большой текстовый файл отсюда: https://www.sample-videos.com/download-sample-text-file.php

Его размер чуть больше 100 КБ: SampleTextFile_100kb.txt .

И все работает. Пожалуйста, ознакомьтесь с T-SQL ниже.

Просто не верьте своим глазам. Это ограничение SSMS. Он не может отображать большой текстовый столбец.

Все <notes> текстовое значение элемента вставляется в таблицу. Столбец notes_length показывает его фактическую длину.

Кроме того, пожалуйста, обратите пристальное внимание на SELECT инструкцию. В нем показано, как правильно разделить XML и преобразовать его в прямоугольный / реляционный формат.

SQL

 -- DDL and sample data population, start
DECLARE @tbl TABLE (ID VARCHAR(10), Number_1 INT, notes NVARCHAR(MAX));
DECLARE @xml XML = 
N'<WebData>
    <Data>
        <ID>2003-0001</ID>
        <Number_1>2004</Number_1>
        <notes>Lorem ipsum dolor sit amet, ...
        ..., sed pharetra mauris vehicula vel.</notes>
    </Data>
</WebData>';
-- DDL and sample data population, end

INSERT INTO @tbl (ID, Number_1, notes)
SELECT c.value('(ID/text())[1]', 'VARCHAR(10)') AS ID
    , c.value('(Number_1/text())[1]', 'INT') AS Nmbr
    , c.value('(notes/text())[1]', 'NVARCHAR(MAX)') AS Notes
FROM @xml.nodes('/WebData/Data') AS t(c);

-- test
SELECT * 
    , LEN(notes) AS [notes_length]
FROM @tbl;
  

Вывод

  ----------- ---------- --------------------------------- -------------- 
|    ID     | Number_1 |              notes              | notes_length |
 ----------- ---------- --------------------------------- -------------- 
| 2003-0001 |     2004 | Lorem ipsum dolor sit amet,...  |       101854 |
 ----------- ---------- --------------------------------- -------------- 
  

Комментарии:

1. Хорошо, в моем тесте я застрял на 65000 символов, но мне никогда не приходило в голову проверять длину! Так что это было визуальное ограничение. большое спасибо за это! Я не могу загрузить это во второй раз, но спасибо за упрощение SQL-запроса. ваш намного более интуитивно понятен!