2016-06-14 69 views
1

我有以下的表结构(部分排除问题的清晰度):在MS SQL Management Studio中使用GROUP BY子句时返回XML字段?

lowFareResponse

表有时接收两个lowFareRQ和被认为lowFareRS到只有一个BookingNumber下预订。然后将预订处理成票,其中每个预订号码总是具有相同的TicketRQ和TicketRS(如果用户继续预订)。 TicketRS包含第三方参考号码。

我现在想要显示所有活动的预订给用户,以便允许用户取消预订,如果他想。

所以我很自然地想要检索每个具有活动状态的预订号码以及TicketRS xml数据以获得第三方参考号。

这里是SQL查询我开始:

SELECT TOP 100 
    [BookingNumber] 
    ,[Status] 
    ,[TicketRS] 
FROM [VTResDB].[dbo].[LowFareRS] 
GROUP BY [BookingNumber],[Status],[TicketRS] 
ORDER BY [recID] desc 
与MS SQL Management Studio中

现在你必须到现场[TicketRS]添加到“GROUP BY”,如果你想拥有它“选择'字段列表...但在'GROUP BY'列表中不能有一个XML字段。 The XML data type cannot be compared or sorted, except when using the IS NULL operator.

我知道,如果我改变表结构这个问题可以解决没有任何问题,但我想避免改变表结构,因为我只是完成软件,不想重写现有的代码。

在MS SQL Management Studio中使用GROUP BY子句时,是否有办法返回XML字段?

+0

请不要判断我的标签le设计,因为我自己没有创建它 - 混合上下骆驼案例,使用'Status'作为字段名称,而不是正常化它在需要的地方。 – Nightwolf

回答

1

嗯,这看起来脏兮兮,如果你是个XML组内相同,你可以尝试这样的事:

DECLARE @tbl TABLE(ID INT IDENTITY,Col1 VARCHAR(100),SomeValue INT,SomeXML XML); 
INSERT INTO @tbl(col1,SomeValue,SomeXML) VALUES 
('testA',1,'<root><a>testA</a></root>') 
,('testA',2,'<root><a>testA</a></root>') 
,('testB',3,'<root><a>testB</a></root>') 
,('testB',4,'<root><a>testB</a></root>'); 

WITH GroupedSource AS 
(
    SELECT SUM(SomeValue) AS SumColumn 
      ,CAST(SomeXml AS NVARCHAR(MAX)) AS XmlColumn 
    FROM @tbl AS tbl 
    GROUP BY Col1,CAST(SomeXml AS NVARCHAR(MAX)) 
) 
SELECT SumColumn 
     ,CAST(XmlColumn AS XML) AS ReCasted 
FROM GroupedSource 

另一种方法是这

WITH GroupedSource AS 
(
    SELECT SUM(SomeValue) AS SumColumn 
      ,MIN(ID) AS FirstID 
    FROM @tbl AS tbl 
    GROUP BY Col1 
) 
SELECT SumColumn 
     ,(SELECT SomeXML FROM @tbl WHERE ID=FirstID) AS ReTaken 
FROM GroupedSource 
+0

考虑到您的解决方案需要子查询,它仍然不是最佳的性能。现在我只是使用代码来嵌套查询(我知道更糟糕),以便我可以在重写之前(从不以商业术语来说)重新开始工作。 – Nightwolf

+0

@Nightwolf,如果有一个idexed键,第二种方法应该表现得相当好......来回投掷 - 当然 - 更多的开销...... – Shnugo

0

将它转换为nvarchar(max)和背部

with t(xc,val) as (
    select xc=cast(N'<x><y>txt</y></x>' as xml), val = 5 
    union all  
    select xc=cast(N'<x><y>txt</y></x>' as xml), val = 6 
) 
select xc = cast(xc as XML), val 
from (
    select xc = cast(xc as nvarchar(max)), val = sum(val) 
    from t 
    group by cast(xc as nvarchar(max)) 
    ) tt 
;