如何将XML数据中引用的ID连接到SQL Server中另一个表中的相应ID?

时间:2015-08-28 03:57:39

标签: sql sql-server xml sql-server-2008

以下是数据库2中STUDIES表中XML数据的示例:

c="status_id" o="1009" n="1006" />

然而,它对用户来说并不是真的有用。 “什么是1009的状态?”

数据库1中有一个STATUSES表,它为此ID提供了一个值(1009 = DRAFT。)

如何对查询进行短语,以便输出是文本而不是ID或数字?因此,我需要John Smith和DRAFT,而不是USER_ID = 3和STATUS_ID = 1009。如上所述,这将需要跨越多个表和数据库,但在同一台服务器上。

如果我能提供更多信息,请告诉我。

编辑以便于8/30提问:

名为“dbrad”的数据库1有3个名为“STATUSES”,“STUDIES”和“USERS”的表。

另一个数据库名为“dbrad.audit”。它有一个名为“研究”的表。在此表中有4行: PK:这个数字是dbrad db的RESEARCH表中的研究ID USER ID:数字是此行是dbrad db的USERS表中的用户ID DT:这是动作发生的日期/时间。该值仅在此表中 数据:这是我原来的例子中发生的动作。所以,也许一项研究改变了状态或删除了统计数据。我真正关心的唯一数据是状态。此编号来自dbrad db。中的STATUS表。

所以它在dbrad.audit db中看起来像这样: PK USER_ID DT DATA

--- | ---------- | ----------- | -----

123 456 2015-08-30 c =“status_id”o =“1009”n =“1005”

我想要的是查询,它会自动将此数据与其他数据库中的相应表格相匹配,并以有意义的形式输出。所以我会得到:

PK USER_ID DT DATA

---- | ------------ | -------------- | -------

MR John 2015-08-30 o = Draft n = Read

如果有帮助,请告诉我

1 个答案:

答案 0 :(得分:0)

编辑:对ServerSurver在其编辑中提供的新信息做出反应:

首先:你的表达式`c =“status_id”o =“1009”n =“1006”/>没有有效的XML。 XML-Element具有元素名称,可以具有属性

<MyElement attribut1="1" Another="hello">

显然,您的表达式是XML Element的一些属性。这个元素是“单独的”还是更大结构的一部分?

您的桌子中有多少种不同的状态?

如果你想连接表(通常确实得到你想要的东西:ID值的标题)你必须加入它们。如果您确定所有值都存在于目录表(您的“状态”)中,那么它将是一个INNER JOIN,否则可能是一个LEFT JOIN。

此JOIN之后是“ON”,它通知SQL Server完成连接的值匹配。因此,您必须提供“左”中的一个字段和“右”表中的一个字段以及适合的数据类型。

我的例子不能完全适合您的数据。我不太了解......

首先,我宣布一个虚拟表@statuses。在SELECT中你必须用真实表替换它(可能是dbrad.dbo.STATUSES")。

我假设您的XML有一个root node,其元素名称为item。您必须按照与您相同的方式更改此设置。两个INNER JOIN通知SQL Server,属性o将映射到STATUSES,与attribut n相同。

SELECT本身可以使用此信息......

它看起来有点“手动”,因为我不知道你的数据......

declare @statuses TABLE(ID INT, caption VARCHAR(100));
insert into @statuses VALUES(1009,'DRAFT'),(1006,'another Status');

declare @x XML='<root><item c="status_id" o="1009" n="1006" /></root>';

SELECT item.x.value('@c','varchar(max)') AS ValueCaption
      ,item.x.value('@o','int') AS o_value
      ,o_st.caption AS o_Caption
      ,item.x.value('@n','int') AS n_value
      ,n_st.caption AS n_Caption
FROM @x.nodes('/root/item') AS item(x)
INNER JOIN @statuses AS o_st ON o_st.ID=item.x.value('@o','int')
INNER JOIN @statuses AS n_st ON n_st.ID=item.x.value('@n','int')

结果:status_id | 1009 |草稿| 1006 |另一个状态