问题描述
对不起,我没有完全解释我在寻找什么。这是我正在使用的:
该表包含以下格式的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 |
+----+-----+--------------+---------------+