#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-запроса. ваш намного более интуитивно понятен!