以下是数据库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
如果有帮助,请告诉我
答案 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 |另一个状态