我是XML操作的新手,请看下面的代码 .
我有一个像下面的代码
注意:我通过添加@ m = '2'使用了与13个UNION相同的代码,
@ m = '3',@ m = '4',@ m = '5',.........,@ m = '13' . 在每个连续的代码块中 .
有没有办法如何使用CROSS APPLY或任何其他简化方法简化此代码?
以下是此表的模式,其中包含db <>小提琴中的实际数据:here
SELECT
RECID as Branch,
XMLRECORD.value('(/row/c2/text())[1]', 'nvarchar(10)') as UpdateDate,
XMLRECORD.value('(/row/c3[@m="2"]/text())[1]', 'nvarchar(10)') as Currency,
XMLRECORD.value('(/row/c6[@m="2"]/text())[1]', 'nvarchar(10)') as [MidRevealRate_CCY_Market-CASH],
XMLRECORD.value('(/row/c8[@m="2"]/text())[1]', 'nvarchar(10)') as [BuyRate_CCY_Market-IFT],
XMLRECORD.value('(/row/c8[@m="2"][@s="2"]/text())[1]', 'nvarchar(10)') as [BuyRate_CCY_Market-CASH],
XMLRECORD.value('(/row/c9[@m="2"]/text())[1]', 'nvarchar(10)') as [SellRate_CCY_Market-CASH]
FROM [FBNK_PT_CURRENCY]
WHERE RECID in ('VU0010002')
UNION
SELECT
RECID as Branch,
XMLRECORD.value('(/row/c2/text())[1]', 'nvarchar(10)') as UpdateDate,
XMLRECORD.value('(/row/c3[@m="3"]/text())[1]', 'nvarchar(10)') as Currency,
XMLRECORD.value('(/row/c6[@m="3"]/text())[1]', 'nvarchar(10)') as [MidRevealRate_CCY_Market-CASH],
XMLRECORD.value('(/row/c8[@m="3"]/text())[1]', 'nvarchar(10)') as [BuyRate_CCY_Market-IFT],
XMLRECORD.value('(/row/c8[@m="3"][@s="2"]/text())[1]', 'nvarchar(10)') as [BuyRate_CCY_Market-CASH],
XMLRECORD.value('(/row/c9[@m="3"]/text())[1]', 'nvarchar(10)') as [SellRate_CCY_Market-CASH]
FROM [FBNK_PT_CURRENCY]
WHERE RECID in ('VU0010002')
UNION
SELECT
RECID as Branch,
XMLRECORD.value('(/row/c2/text())[1]', 'nvarchar(10)') as UpdateDate,
XMLRECORD.value('(/row/c3[@m="4"]/text())[1]', 'nvarchar(10)') as Currency,
XMLRECORD.value('(/row/c6[@m="4"]/text())[1]', 'nvarchar(10)') as [MidRevealRate_CCY_Market-CASH],
XMLRECORD.value('(/row/c8[@m="4"]/text())[1]', 'nvarchar(10)') as [BuyRate_CCY_Market-IFT],
XMLRECORD.value('(/row/c8[@m="4"][@s="2"]/text())[1]', 'nvarchar(10)') as [BuyRate_CCY_Market-CASH],
XMLRECORD.value('(/row/c9[@m="4"]/text())[1]', 'nvarchar(10)') as [SellRate_CCY_Market-CASH]
FROM [FBNK_PT_CURRENCY]
WHERE RECID in ('VU0010002')
有人可以提供一种方法来支持这些代码吗?提前致谢!
2 回答
对不起,但是这个XML的结构非常糟糕......在我完全回答你的问题之前,你必须帮助我解决背后的业务逻辑 .
您的XML看起来像这样
这个
XQuery / FLWOR
方法将把它变成一个 - 希望 - 正确的结构:(我的假设:没有属性的元素
m
以某种方式开始一个部分)结果
并通过这样的查询
...你会得到整体和一切(由于限制为30.000个字符而不得不削减它):
好吧,我的第一次尝试过于复杂......所以我以非常务实的方式提出了第二个答案:
我们可以添加一个计数表(即时创建),
CROSS JOIN
(为了获得每个记录的多行),并使用sql:column()
来使用此值代替您的值,而不是仅使用"m"的不同值来合并多个查询m
的硬编码值 .结果