MS SQL номер из XML (варчар) ячеек - PullRequest
0 голосов
/ 25 февраля 2020

Можете ли вы сказать мне, как анализировать XML не только правильно, но и красиво, учитывая, что ячейка в nvarchar (max) - это число между двумя тегами?

Пример (XML):

<SignedLicenseInfo> <LicenseInfo> <ExpirationDate> 9223372036854775807 </ ExpirationDate> <AvailiableModules> 30 </ AvailiableModules> <PagesLimit> 708,976 </ PagesLimit> <PagesLimitRenewDate> 132274944000000000 </ PagesLimitRenewDate> <IsDefaultLicense> true </ IsDefaultLicense> <CustomModuleAuthorId> </ CustomModuleAuthorId> <IsCountRecognizedPagesOnly> false </ IsCountRecognizedPagesOnly> <IsCyrillicLanguageEnabled> true </ IsCyrillicLanguageEnabled> <MaximumNumberOfTemplateFields> 2147483647 </ MaximumNumberOfTemplateFields> <Type> 11 </ Type> <Amount> 0 </ Amount> </ StationInfo > </ LicenseStationInfo> <CustomFeatures> </ CustomFeatures> <LocalExpirationDate> 132271122849228006 </ LocalExpirationDate> </ LicenseInfo> <Signature> XXXXXXXXXXXXXYYYYYYYYYYYYYYYYYYYYYYYYXXXXXXXXXdfsd </ Signature> </ SignedLicenseInfo>

Вам нужно получить то, что есть (708976). Я получил следующий запрос в базе данных:

SELECT substring (s.Value, CHARINDEX ('<PagesLimit>', s.Value) +12, CHARINDEX ('</PagesLimit>', s.Value, CHARINDEX ('<PagesLimit>', s.Value) +12) - CHARINDEX ('<PagesLimit>', s.Value) -12) as My_String
from dbo.Settings s

Как это можно сделать более кратким и логичным? И не путем выбора количества символов туда-сюда. Спасибо.

Ответы [ 2 ]

1 голос
/ 25 февраля 2020

Ваш XML не правильно сформирован ... Мне пришлось удалить некоторые пробелы, и есть два закрывающих тега, в которых отсутствуют открывающие теги (найдите их в комментариях).

XML is не должен анализироваться как строка с некоторыми необычными дополнениями . Существуют некоторые собственные XML -методы, использующие XQuery и XPath.

Попробуйте:

DECLARE @xml XML=
N'<SignedLicenseInfo>
  <LicenseInfo>
    <ExpirationDate> 9223372036854775807 </ExpirationDate>
    <AvailiableModules> 30 </AvailiableModules>
    <PagesLimit> 708,976 </PagesLimit>
    <PagesLimitRenewDate> 132274944000000000 </PagesLimitRenewDate>
    <IsDefaultLicense> true </IsDefaultLicense>
    <CustomModuleAuthorId />
    <IsCountRecognizedPagesOnly> false </IsCountRecognizedPagesOnly>
    <IsCyrillicLanguageEnabled> true </IsCyrillicLanguageEnabled>
    <MaximumNumberOfTemplateFields> 2147483647 </MaximumNumberOfTemplateFields>
    <Type> 11 </Type>
    <Amount> 0 </Amount>
    <!-- /StationInfo -->
    <!-- /LicenseStationInfo -->
    <CustomFeatures />
    <LocalExpirationDate> 132271122849228006 </LocalExpirationDate>
  </LicenseInfo>
  <Signature> XXXXXXXXXXXXXYYYYYYYYYYYYYYYYYYYYYYYYXXXXXXXXXdfsd </Signature>
</SignedLicenseInfo>';

SELECT @xml.value('(/SignedLicenseInfo/LicenseInfo/PagesLimit/text())[1]','varchar(max)');

Возвращает 708,976.

0 голосов
/ 26 февраля 2020

Спасибо всем. Используя предоставленную информацию, я сделал это:

declare @xml xml;
SELECT @xml = s.Value from dbo.Settings s where s.Name='LicenseString';
select @xml.value('(/SignedLicenseInfo/LicenseInfo/PagesLimit)[1]', 'int');
...