Sql server XML解析&;T-SQL

Sql server XML解析&;T-SQL,sql-server,xml,tsql,Sql Server,Xml,Tsql,从表中的XML字段中给定以下内容: <View> <Criminal xmlns="http://tempuri.org/crimes.xsd"> <Person> <PersonID>1234</PersonID> <LastName>SMITH</LastName> <FirstName>KEVIN&l

从表中的XML字段中给定以下内容:

    <View>
      <Criminal xmlns="http://tempuri.org/crimes.xsd">
        <Person>
          <PersonID>1234</PersonID>
          <LastName>SMITH</LastName>
          <FirstName>KEVIN</FirstName>
        <Cases>
          <PersonID>1234</PersonID>
          <CaseNumber>12CASE34</CaseNumber>
        </Cases>
       </Person>
      </Criminal>
     </View>

1234
史密斯
凯文
1234
12案例34
如何提取个人/人名ID、姓氏、姓氏信息?案件编号也是如此

我的下一个问题与上面类似,但让我们添加第二个名称空间:

<MessageContent xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <Content>Content in here!!</Content>
   <Type>Empty</Type>
</MessageContent>

内容在这里!!
空的
注意,这里有两个名称空间,它们也有“:xsi”和“:xsd”。我认为这些被称为模式。

试试这个:

DECLARE @table TABLE (ID INT NOT NULL, XmlContent XML)

INSERT INTO @table VALUES(1, '<View>
      <Criminal xmlns="http://tempuri.org/crimes.xsd">
        <Person>
          <PersonID>1234</PersonID>
          <LastName>SMITH</LastName>
          <FirstName>KEVIN</FirstName>
        <Cases>
          <PersonID>1234</PersonID>
          <CaseNumber>12CASE34</CaseNumber>
        </Cases>
       </Person>
      </Criminal>
     </View>')

;WITH XMLNAMESPACES('http://tempuri.org/crimes.xsd' AS ns)
    SELECT
        PersonID = XmlContent.value('(/View/ns:Criminal/ns:Person/ns:PersonID)[1]', 'int'),
        FirstName = XmlContent.value('(/View/ns:Criminal/ns:Person/ns:FirstName)[1]', 'varchar(50)'),
        LastName = XmlContent.value('(/View/ns:Criminal/ns:Person/ns:LastName)[1]', 'varchar(50)')
    FROM @table
    WHERE ID = 1
DECLARE@table表(ID INT不为NULL,XmlContent XML)
插入@表值(1,'
1234
史密斯
凯文
1234
12案例34
')
;使用XMLNAMESPACES('http://tempuri.org/crimes.xsd'作为ns)
挑选
PersonID=XmlContent.value('(/View/ns:Criminal/ns:Person/ns:PersonID)[1],'int'),
FirstName=XmlContent.value('(/View/ns:Criminal/ns:Person/ns:FirstName)[1],'varchar(50)'),
LastName=XmlContent.value('(/View/ns:Criminal/ns:Person/ns:LastName)[1],'varchar(50)'
来自@table
其中ID=1
返回以下内容的输出:

关于问题的第二部分:是的,您定义了两个名称空间,但它们根本没有被使用,所以您基本上可以忽略它们:

INSERT INTO @table VALUES(2, '<MessageContent xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <Content>Content in here!!</Content>
   <Type>Empty</Type>
</MessageContent>')

SELECT
    Content = XmlContent.value('(/MessageContent/Content)[1]', 'varchar(50)'),
    Type = XmlContent.value('(/MessageContent/Type)[1]', 'varchar(50)')
FROM @table
WHERE ID = 2
插入@table value(2,'
内容在这里!!
空的
')
挑选
Content=XmlContent.value('(/MessageContent/Content)[1],'varchar(50)'),
Type=XmlContent.value('(/MessageContent/Type)[1],'varchar(50)'
来自@table
其中ID=2
返回:


Marc,这是很棒的东西!!!我们说话的时候,我正在把它拆开。现在也许我的头发会重新长起来!!谢谢