2016-06-14 21 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 
;