powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / MSSQL Число из XML(varchar) ячейки
5 сообщений из 5, страница 1 из 1
MSSQL Число из XML(varchar) ячейки
    #39930685
malltaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет.
Не подскажете, как не только корректно, но и красиво спарсить XML, с учетом, что ячейка в nvarchar(max), число между двух тегов?

Пример:
Код: xml
1.
<SignedLicenseInfo><LicenseInfo><ExpirationDate>9223372036854775807</ExpirationDate><AvailiableModules>30</AvailiableModules><PagesLimit>708976</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>


Достать нужно то, что в <PagesLimit>(708976). У меня получился вот такой запрос в БД:
Код: sql
1.
2.
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


Как его можно сделать лаконичнее и логичнее? А не подбором количества символов туда и сюда.
Спасибо.
...
Рейтинг: 0 / 0
MSSQL Число из XML(varchar) ячейки
    #39930695
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот бы в 2020м году, когда есть куча готовых десериализаторов (даже в самом MSSQL две штуки), писать свой на строковых функциях...
...
Рейтинг: 0 / 0
MSSQL Число из XML(varchar) ячейки
    #39930702
Serп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
malltaf,

в приведенном примере отсутствуют открывающие тэги для </StationInfo></LicenseStationInfo>, а так, если xml валидный, то:
Код: sql
1.
2.
3.
4.
declare @xml xml = '<SignedLicenseInfo><LicenseInfo><ExpirationDate>9223372036854775807</ExpirationDate><AvailiableModules>30</AvailiableModules><PagesLimit>708976</PagesLimit><PagesLimitRenewDate>132274944000000000</PagesLimitRenewDate><IsDefaultLicense>true</IsDefaultLicense><CustomModuleAuthorId></CustomModuleAuthorId><IsCountRecognizedPagesOnly>false</IsCountRecognizedPagesOnly><IsCyrillicLanguageEnabled>true</IsCyrillicLanguageEnabled><MaximumNumberOfTemplateFields>2147483647</MaximumNumberOfTemplateFields><Type>11</Type><Amount>0</Amount><CustomFeatures></CustomFeatures><LocalExpirationDate>132271122849228006</LocalExpirationDate></LicenseInfo><Signature>XXXXXXXXXXXXXYYYYYYYYYYYYYYYYYYYYYYYYXXXXXXXXXdfsd</Signature></SignedLicenseInfo>'

select n.value('(PagesLimit)[1]','int')
from @xml.nodes('/SignedLicenseInfo/LicenseInfo') as r(n)
...
Рейтинг: 0 / 0
MSSQL Число из XML(varchar) ячейки
    #39930703
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serп
malltaf,

в приведенном примере отсутствуют открывающие тэги для </StationInfo></LicenseStationInfo>, а так, если xml валидный, то:
Код: sql
1.
2.
3.
4.
declare @xml xml = '<SignedLicenseInfo><LicenseInfo><ExpirationDate>9223372036854775807</ExpirationDate><AvailiableModules>30</AvailiableModules><PagesLimit>708976</PagesLimit><PagesLimitRenewDate>132274944000000000</PagesLimitRenewDate><IsDefaultLicense>true</IsDefaultLicense><CustomModuleAuthorId></CustomModuleAuthorId><IsCountRecognizedPagesOnly>false</IsCountRecognizedPagesOnly><IsCyrillicLanguageEnabled>true</IsCyrillicLanguageEnabled><MaximumNumberOfTemplateFields>2147483647</MaximumNumberOfTemplateFields><Type>11</Type><Amount>0</Amount><CustomFeatures></CustomFeatures><LocalExpirationDate>132271122849228006</LocalExpirationDate></LicenseInfo><Signature>XXXXXXXXXXXXXYYYYYYYYYYYYYYYYYYYYYYYYXXXXXXXXXdfsd</Signature></SignedLicenseInfo>'

select n.value('(PagesLimit)[1]','int')
from @xml.nodes('/SignedLicenseInfo/LicenseInfo') as r(n)

или без nodes
Код: sql
1.
select @x.value('(/SignedLicenseInfo/LicenseInfo/PagesLimit)[1]', 'int')
...
Рейтинг: 0 / 0
MSSQL Число из XML(varchar) ячейки
    #39930961
malltaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg

или без nodes
Код: sql
1.
select @x.value('(/SignedLicenseInfo/LicenseInfo/PagesLimit)[1]', 'int')



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

Код: sql
1.
2.
3.
declare @xml xml;
SELECT @xml = s.Value from dbo.Settings s where s.Name='LicenseString';
select @xml.value('(/SignedLicenseInfo/LicenseInfo/PagesLimit)[1]', 'int');
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / MSSQL Число из XML(varchar) ячейки
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]