我已阅读了数十篇帖子并尝试了大量的SQL查询来尝试解决这个问题。遗憾的是,我不是SQL专家(甚至不是新手),也不是XML专家。我理解SQL的基本查询,并且主要理解XML标签。
我正在尝试查询数据库表,并让数据显示包含XML的列的值列表。我会给你一个数据的例子。我不会为你所做的一切负担。
以下是我需要的列内部字段的示例。所以这只是一行,我需要查询整个表以获取我需要的所有数据。
当我从[表名]中选择*时,它返回数百行,当我在一行中双击“文档”的列名时,我得到了我需要的信息。
看起来像这样:
<code_set xmlns="">
<name>ExampleCodeTable</name>
<last_updated>2010-08-30T17:49:58.7919453Z</last_updated>
<code id="1" last_updated="2010-01-20T17:46:35.1658253-07:00"
start_date="1998-12-31T17:00:00-07:00"
end_date="9999-12-31T16:59:59.9999999-07:00">
<entry locale="en-US" name="T" description="Test1" />
</code>
<code id="2" last_updated="2010-01-20T17:46:35.1658253-07:00"
start_date="1998-12-31T17:00:00-07:00"
end_date="9999-12-31T16:59:59.9999999-07:00">
<entry locale="en-US" name="Z" description="Test2" />
</code>
<displayExpression>[Code] + ' - ' + [Description]</displayExpression>
<sortColumn>[Description]</sortColumn>
</code_set>
理想情况下,我会编写它,以便在表上运行查询并生成如下结果:
Code Description
--------------------
(Data) (Data)
有什么想法吗?它甚至可能吗?我尝试过的很多东西总是以堆栈的形式发布,要么返回Nulls要么失败。
感谢您的帮助
答案 0 :(得分:1)
尝试这样的事情:
SELECT
CodeSetId = xc.value('@id', 'int'),
Description = xc.value('(entry/@description)[1]', 'varchar(50)')
FROM
dbo.YourTableNameHere
CROSS APPLY
YourXmlColumn.nodes('/code_set/code') AS XT(XC)
这基本上使用内置的XQuery来获取内存中的#34;表(XT
)包含一个列(XC
),每个列包含一个XML片段,代表<code>
根节点中的每个<code_set>
节点。
一旦拥有了这些XML片段,就可以使用.value()
XQuery运算符来&#34;到达&#34;并从中获取一些信息,例如它的@id
(id
的名称属性)或所包含的@description
子元素的<entry>
属性。
答案 1 :(得分:0)
以下查询将读取每行中的xml字段,然后将某些值分解为表格结果集。
SELECT
-- get attribute [attribute name] from the parent node
parent.value('./@attribute name','varchar(max)') as ParentAttributeValue,
-- get the text value of the first child node
child.value('./text()', 'varchar(max)') as ChildNodeValueFromFirstChild,
-- get attribute attribute [attribute name] from the first child node
child.value('./@attribute name', 'varchar(max)') as ChildAttributeValueFromFirstChild
FROM
[table name]
CROSS APPLY
-- create a handle named parent that references that <parent node> in each row
[xml field name].nodes('//xpath to parent name') AS ParentName(parent)
CROSS APPLY
-- create a handle named child that references first <child node> in each row
parent.nodes('(xpath from parent/to child)[0]') AS FirstChildNode(child)
GO
请提供您希望从XML中粉碎的确切值,以获得更精确的答案。