Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 来自XML(varchar)单元格的MSSQL编号_Sql Server_Xml_Parsing_Shred - Fatal编程技术网

Sql server 来自XML(varchar)单元格的MSSQL编号

Sql server 来自XML(varchar)单元格的MSSQL编号,sql-server,xml,parsing,shred,Sql Server,Xml,Parsing,Shred,考虑到nvarchar(max)中的单元格是两个标记之间的数字,您能告诉我如何不仅正确而且漂亮地解析XML吗 示例(XML): 9223372036854775807 30 708976 13227494000000000对错2147483647 11 0 132271122849228006 XXXXXXXXXXXXXXXXYYYYYYYYYYYYYYYYYYYYYYXXXXXXXX DFSD 您需要获取(708976)中的内容。我在数据库中得到以下查询: SELECT substring

考虑到nvarchar(max)中的单元格是两个标记之间的数字,您能告诉我如何不仅正确而且漂亮地解析XML吗

示例(XML):

9223372036854775807 30 708976 13227494000000000对错2147483647 11 0 132271122849228006 XXXXXXXXXXXXXXXXYYYYYYYYYYYYYYYYYYYYYYXXXXXXXX DFSD
您需要获取(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
选择子字符串(s.Value,CHARINDEX(“”,s.Value)+12,CHARINDEX(“”,s.Value,CHARINDEX(“”,s.Value)+12)-CHARINDEX(“”,s.Value)-12)作为我的字符串
从dbo.s
如何使它更简洁、更符合逻辑?而不是通过选择来回的字符数。
谢谢。

您的XML格式不正确。。。我不得不删除一些空白,还有两个结束标记,它们缺少开始标记(找到它们)

XML不能被解析为带有一些花哨额外内容的字符串。有一些使用XQuery和XPath的原生XML方法

试试这个:

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)');
DECLARE@xml=
不
9223372036854775807 
30
708,976 
132274944000000000
符合事实的
错误的
符合事实的
2147483647
11
0
132271122849228006
XXXXXXXXXXXXYYYYYYYYYYYYYYYYYYYYXXXXXXXXXXXXXXXX DFSD
';
选择@xml.value(“(/SignedLicenseInfo/LicenseInfo/PagesLimit/text())[1]”,选择“varchar(max)”;

这将返回
708976

,感谢大家。利用提供的信息,我做到了:

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

看看XQUERY。回答得好,我这边+1!
declare @xml xml;
SELECT @xml = s.Value from dbo.Settings s where s.Name='LicenseString';
select @xml.value('(/SignedLicenseInfo/LicenseInfo/PagesLimit)[1]', 'int');