Метод XML Value возвращает пустое значение, если число символов превышает 43679 - PullRequest
0 голосов
/ 28 мая 2018

Возникла проблема при получении строковых данных из столбца XML.У меня есть узел в XML, который состоит из огромных данных.Если я пытаюсь получить его либо с помощью метода value, либо с помощью query, он дает пустую строку (т. Е. Равную NULL в xml).

При отладке я узнал, только метод valueизвлечение данных, если символы в нем меньше или равны 43679 .

Я прочитал все вопросы SO, связанные с рисунком 43679 , что является ошибкой в ​​SSMS, в то время каккопирование из сетки SSMS.Но здесь проблема не с SSMS.Даже SP, вызывающий приложение .Net, также получает ту же проблему.

Пример:

Declare  @XmlStr XML;

select @XmlStr=
'<Main>
  <Node1>/9j/4gIcSUNDX1BST0ZJTEUAAQEA.. 50000+Charcters ...</Node1>
</Main>';

SELECT @XmlStr.value('(/Main/Node1)[1]','varchar(max)') ;

Если Node1 содержит 43679 символов ниже, он выдает результат.Любая работа вокруг?или я что-то упустил ??

Я использую SQL Server 2008R2

1 Ответ

0 голосов
/ 28 мая 2018

Вы не должны пытаться получить это как строку ... Значение в <Node1> является двоичным значением в кодировке base64.XML .value() неявно перекодирует это для вас.Попробуйте это

Declare  @XmlStr XML;

select @XmlStr=
'<Main>
  <Node1>/9j/4gIcSUNDX1BST0ZJTEUAAQEA</Node1>
</Main>';

SELECT @XmlStr.value('(/Main/Node1)[1]','varbinary(max)') 
      ,CAST(@XmlStr.value('(/Main/Node1)[1]','varbinary(max)') AS VARCHAR(100));

Результат ясно показывает, что это JPEG (начинается с FFD8).Размер VARBINARY(MAX) должен быть достаточным ...

0xFFD8FFE2021C4943435F50524F46494C4500010100    
ÿØÿâICC_PROFILE

(бессмысленное) приведение к varchar показывает нам некоторые EXIF-данные ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...