将表中存储的xml数据转换为存储为不同表sql中的记录的单个名称/值对

问题描述

对不起,我没有完全解释我在寻找什么。这是我正在使用的:

该表包含以下格式的xml”

<row>
  <POLICYNUMBER>IFH6000258-04</POLICYNUMBER>
  <POLICY_NO>CFH6000258</POLICY_NO>
  <POLICY_MOD>03</POLICY_MOD>
 </row>

declare @mystuff xml;
set @mystuff = (select top 1 * from TMP_APP for xml path)
INSERT INTO [dbo].[FredTest]
(       
  [xmlstuff]
)
VALUES
(
  @mystuff
 )


    DECLARE @hldit table (ID int not null,xmldata xml)
  * set @hldit = (select xmlstuff from FredTest)
    Select   entr.value('local-name(.)','VARCHAR(50)') as nme,entr.value('(.)[1]','varchar(50)') dta
    From @hldit
    Cross apply
             XmlData.nodes('/root/row/*') as xt(entr)

我在电视机上出现错误(请参阅*)。我似乎无法填充表格。

我想将输出插入到具有“名称”和“值”两列的表中,并且每对都有单独的记录。

输出应如下所示;

         Name                  Value
record 1 Policynumber          IFH6000258-04
record 2 Policy_no             CFH6000258
record 3 Policy_mod.           03

我觉得我已经接近了。一切正常,但我无法填充@hldit表。我希望这可以解释我的问题。 谢谢

我是XML的新手。我必须提取记录,将它们存储在另一个表中的xml数据字段中,然后提取xml数据并将名称/值对存储在另一个表中。我可以创建XML数据。我不知道的是如何从表中获取原始xml,如何使用存储为单独记录的名称/值对创建表。我已经看过并尝试了所有东西,但现在仍然很幸运。我希望新表中的最后几行看起来像:

name      value
--------------------------
firstname Fred
lastname  jones
address   123 here street

而不是这样:

firstname="fred" lastname="jones address="123 here street"

我什至会采用xml PATH格式而不是RAW。

感谢您提供的任何帮助。

解决方法

看来我知道你在追求什么。 请尝试以下概念示例。

它将在MS SQL Server 2005及更高版本中运行。

SQL#1,基于属性

-- DDL and sample data population,start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY,xmldata XML);
INSERT INTO @tbl (xmldata) VALUES
(N'<root>
    <r firstname="fred" lastname="jones" address="123 here street"/>    
    <r firstname="Laura" lastname="Bush" address="257 somewhere street"/>
</root>');
-- DDL and sample data population,end

SELECT c.value('local-name(.)','VARCHAR(30)') AS [Column],c.value('.','VARCHAR(100)') AS [Value]
FROM @tbl
    CROSS APPLY xmldata.nodes('/root/r/@*') AS t(c);

输出

+-----------+----------------------+
|  Column   |        Value         |
+-----------+----------------------+
| firstname | fred                 |
| lastname  | jones                |
| address   | 123 here street      |
| firstname | Laura                |
| lastname  | Bush                 |
| address   | 257 somewhere street |
+-----------+----------------------+

SQL#2,基于元素

-- DDL and sample data population,start
DECLARE @destination TABLE (ID INT,pos INT,[Name] VARCHAR(30),[Value] VARCHAR(100));

DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY,xmldata XML);
INSERT INTO @tbl (xmldata) VALUES
(N'<row>
  <POLICYNUMBER>IFH6000258-04</POLICYNUMBER>
  <POLICY_NO>CFH6000258</POLICY_NO>
  <POLICY_MOD>03</POLICY_MOD>
 </row>');
-- DDL and sample data population,end

INSERT INTO @destination (ID,pos,[Name],[Value])
SELECT ID,c.value('let $n := . return count(../*[. << $n])+1','INT') AS pos,c.value('local-name(.)','VARCHAR(30)') AS [Name],'VARCHAR(100)') AS [Value]
FROM @tbl
    CROSS APPLY xmldata.nodes('/row/*') AS t(c);

-- test
SELECT * FROM @destination;

输出

+----+-----+--------------+---------------+
| ID | pos |     Name     |     Value     |
+----+-----+--------------+---------------+
|  1 |   1 | POLICYNUMBER | IFH6000258-04 |
|  1 |   2 | POLICY_NO    | CFH6000258    |
|  1 |   3 | POLICY_MOD   | 03            |
+----+-----+--------------+---------------+