相关疑难解决方法(0)

将Xml转换为Table SQL Server

我想知道如何读取xml数据并将其转换为TSQL中的表?

例如:

<row>
    <IdInvernadero>8</IdInvernadero>
    <IdProducto>3</IdProducto>
    <IdCaracteristica1>8</IdCaracteristica1>
    <IdCaracteristica2>8</IdCaracteristica2>
    <Cantidad>25</Cantidad>
    <Folio>4568457</Folio>
</row>
<row>
    <IdInvernadero>3</IdInvernadero>
    <IdProducto>3</IdProducto>
    <IdCaracteristica1>1</IdCaracteristica1>
    <IdCaracteristica2>2</IdCaracteristica2>
    <Cantidad>72</Cantidad>
    <Folio>4568457</Folio>
</row>      
Run Code Online (Sandbox Code Playgroud)

8   3   8   8   25  4568457
3   3   1   2   72  4568457
Run Code Online (Sandbox Code Playgroud)

xml sql t-sql sql-server-2005 sql-server-2008

49
推荐指数
2
解决办法
18万
查看次数

为什么在使用XPath查询时需要CROSS APPLY?

TL;博士

为什么不:

SELECT 
    SomeXmlColumn.nodes('/people/person') AS foo(b)
FROM MyTable
Run Code Online (Sandbox Code Playgroud)

工作?

之前的问题

几乎所有我在SQL Server中看到(或得到)使用XPath查询的答案要求您使用XML将XML文档加入自身CROSS APPLY.

为什么?

例如:

SELECT 
   p.value('(./firstName)[1]', 'VARCHAR(8000)') AS firstName,
   p.value('(./lastName)[1]', 'VARCHAR(8000)') AS lastName
FROM table 
   CROSS APPLY field.nodes('/person') t(p)
Run Code Online (Sandbox Code Playgroud)

例如:

SELECT a.BatchXml.value('(Name)[1]', 'varchar(50)') AS Name,
    a.BatchXml.value('(IDInfo/IDType)[1]', 'varchar(50)') AS IDType,
    a.BatchXml.value('(IDInfo/IDOtherDescription)[1]', 'varchar(50)') AS IDOtherDescription
FROM BatchReports b
CROSS APPLY b.BatchFileXml.nodes('Customer') A(BatchXml)
WHERE a.BatchXml.exist('IDInfo/IDType[text()=3]')=1
Run Code Online (Sandbox Code Playgroud)

例如:

SELECT  b.BatchID,
        x.XmlCol.value('(ReportHeader/OrganizationReportReferenceIdentifier)[1]','VARCHAR(100)') AS OrganizationReportReferenceIdentifier,
        x.XmlCol.value('(ReportHeader/OrganizationNumber)[1]','VARCHAR(100)') AS OrganizationNumber
FROM    Batches b
CROSS APPLY b.RawXml.nodes('/CasinoDisbursementReportXmlFile/CasinoDisbursementReport') x(XmlCol);
Run Code Online (Sandbox Code Playgroud)

甚至从MSDN联机丛书:

SELECT nref.value('first-name[1]', 'nvarchar(32)') FirstName,
       nref.value('last-name[1]', 'nvarchar(32)') …
Run Code Online (Sandbox Code Playgroud)

sql-server xpath

31
推荐指数
2
解决办法
2万
查看次数

在T-SQL中忽略XML命名空间

使用T-SQL查询数据时,如何删除/忽略xml文件中的XML命名空间?

我正在将一个xml文件加载到一个变量中,它工作得很好.但是xml有一个名称空间集,除非我删除它,否则我的查询会变空.

T-SQL:

DECLARE @xml xml
SELECT @xml = BulkColumn FROM OPENROWSET(BULK 'C:\myfile.xml', SINGLE_BLOB) AS A

SELECT X.z.value('ID[1]', 'VARCHAR(3)') FROM @xml.nodes('myroot/element') AS X(z)
Run Code Online (Sandbox Code Playgroud)

XML示例:

<?xml version="1.0" encoding="utf-8"?>
<myroot xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <element>
    <ID>1</ID>
  </element>
  <element>
    <ID>2</ID>
  </element>
  <element>
    <ID>3</ID>
  </element>
</myroot>
Run Code Online (Sandbox Code Playgroud)

这有效,查询返回:

1
2
3

但XML还包含一个默认命名空间:

<myroot xmlns="http://XXX" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
Run Code Online (Sandbox Code Playgroud)

xmlns="http://XXX"完全搞砸了我的查询.不幸的是,在加载之前手动修改xml并不是一个真正的选择.

问题:

  • 将数据加载到变量中时,如何删除或忽略命名空间?
  • 或者如何修改我的查询来处理命名空间?

t-sql sql-server-2005 xml-namespaces

9
推荐指数
1
解决办法
2万
查看次数

SQL Server中的XML查询

我刚开始在SQL Server数据库中查询XML.我遇到了最基本的查询问题.这是一个简化的例子.我如何返回描述?下面的SELECT语句是我正在使用的,但它什么都不返回.

SELECT Incidents.IncidentXML.query
('data(/dsIncident/IncidentInformation/Description)') AS Description 
FROM Incidents
Run Code Online (Sandbox Code Playgroud)

这是我正在使用的XML文件的片段:

<dsIncident xmlns="http://tempuri.org/dsIncident.xsd">
  <IncidentInformation>
    <Description>This is the description.</Description>
    <Country>Singapore</Country>
  </IncidentInformation>
</dsIncident>
Run Code Online (Sandbox Code Playgroud)

xml sql sql-server xquery

5
推荐指数
1
解决办法
4505
查看次数