2017-02-10 17 views
4

我試圖在使用FOR XML AUTO返回時,在我的SQL結果中理解一些異常。奇怪的是,我在XML中得到了不同的結果。總之,機構計數應該永遠是603,但XML數據讓我在這套片斷顯示3次不同的總計: XML returned for web application與正常的行集相比,FOR XML AUTO子句可以提供意外的結果嗎?

的ORDER BY下面簡單地通過選擇訂購的結果。爲了進行調試,我手動運行了存儲過程(註釋掉FOR XML子句並創建了3個後綴爲SORT參數後綴的「調試」表(當沒有使用FOR XML AUTO時,每個結果集包含603行)。 。

希望,現已清楚地示出的問題這裏是存儲過程(底部邏輯其中@Sort值確定ORDER BY是最相關的我認爲):

ALTER Procedure [dbo].[FLAS2_List_Awards_V4] 

-- EXECUTE FLAS2_List_Awards_V4 2,0 
(
    @Sort int = 1 
        -- 1 = descending order on TotalAmount 
        -- 2 = descending order on TotalAwards 
        -- 3 = ascending order on Institution 
    ,@Range int = 0 
        -- 0 = no filtering 
        -- 1 = < $1 million 
        -- 2 = < $5 million 
        -- 3 = < $10 million 
        -- 4 = < $15 million 
        -- 5 = < $20 million 
        -- 6 = > $20 million 
) 
As 

CREATE TABLE #TempMarkers 
(
    ID   nchar(6) NOT NULL 
, Institution nvarchar(255) NOT NULL 
, Street  nvarchar(255) NULL 
, City  nvarchar(255) NULL 
, State  nvarchar(255) NULL 
, Zip   nvarchar(255) NULL 
, Latitude decimal (28, 18) NULL 
, Longitude decimal (28, 18) NULL 
, TotalAwards decimal (16, 0) NULL 
, TotalAmount decimal (16, 0) NULL 
) 
INSERT INTO #TempMarkers 
(
    ID   
, Institution 
, Street  
, City 
, State  
, Zip 
, Latitude 
, Longitude  
, TotalAwards 
, TotalAmount 
) 
SELECT DISTINCT 
     C.ID 
     , C.InstitutionName 
     , NULL AS street 
     , NULL AS city 
     , NULL AS state 
     , NULL AS zip 
     , NULL As Latitude 
     , NULL As Longitude 
     , NULL As TotalAwards 
     , NULL As TotalAmount 
    FROM dbo.FLAS2_Schools2 C 
-- where c.ID in (135717,434584) 
UPDATE #TempMarkers 
    SET  Street  = x.street 
      ,City  = x.city 
      ,State  = x.state 
      ,Zip  = x.zip   
    FROM dbo.FLAS2_Schools2 X 
    WHERE X.ID = #TempMarkers.ID 
    AND 
    X.InstitutionName = #TempMarkers.Institution 
UPDATE #TempMarkers 
    SET  Latitude = Z.lat 
      ,Longitude = Z.Long 
    FROM dbo.ZipCodesPreferred Z       
    WHERE Z.ZipCode = #TempMarkers.Zip 
CREATE TABLE #TempGrants 
(
    ID   nchar(6) NOT NULL 
, TotalAwards decimal (16, 0) NULL 
, TotalAmount decimal (16, 0) NULL 
) 

EXECUTE dbo.FLAS2_List_Awards_V3_PrepAwards @Range 

CREATE TABLE #FinalMarkers 
(
    ID   nchar(6) NOT NULL 
, Institution nvarchar(255) NOT NULL 
, Street  nvarchar(255) NULL 
, City  nvarchar(255) NULL 
, State  nvarchar(255) NULL 
, Zip   nvarchar(255) NULL 
, Latitude decimal (28, 18) NULL 
, Longitude decimal (28, 18) NULL 
, TotalAwards decimal (16, 0) NULL 
, TotalAmount decimal (16, 0) NULL 
) 
INSERT INTO #FinalMarkers 
(
    ID   
, Institution 
, Street  
, City 
, State  
, Zip 
, Latitude 
, Longitude  
, TotalAwards 
, TotalAmount 
) 
select 
    t1.ID   
, Institution 
, Street  
, City 
, State  
, Zip 
, Latitude 
, Longitude  
, t2.TotalAwards 
, t2.TotalAmount 
FROM #TempMarkers t1 
join #TempGrants t2 
on t1.id = t2.id 

--SELECT * FROM #FinalMarkers 

IF @Sort = 1 
BEGIN 
SELECT Marker.ID 
     ,Marker.Institution 
     ,Marker.Street 
     ,Marker.City 
     ,Marker.State 
     ,Marker.Zip 
     ,Marker.Latitude 
     ,Marker.Longitude 
     ,Marker.TotalAmount 
     ,Marker.TotalAwards 
     ,Award.GrantNumber as GrantNumber 
     ,Award.TotalObligatedAmount as GrantAmount 
FROM #FinalMarkers Marker  
    LEFT JOIN dbo.FLAS2_Grants Award 
     ON Marker.ID = Award.ID 
order by Marker.TotalAmount DESC, Marker.Institution, GrantAmount DESC 
for xml auto, root('root') 
END 
IF @Sort = 2 
BEGIN 
SELECT Marker.ID 
     ,Marker.Institution 
     ,Marker.Street 
     ,Marker.City 
     ,Marker.State 
     ,Marker.Zip 
     ,Marker.Latitude 
     ,Marker.Longitude  
     ,Marker.TotalAmount 
     ,Marker.TotalAwards 
     ,Award.GrantNumber as GrantNumber 
     ,Award.TotalObligatedAmount as GrantAmount 
FROM #FinalMarkers Marker  
    LEFT JOIN dbo.FLAS2_Grants Award 
     ON Marker.ID = Award.ID 
order by Marker.TotalAwards DESC, Marker.Institution ,GrantAmount DESC 
for xml auto, root('root') 
END 
IF @Sort = 3 
BEGIN 
SELECT Marker.ID 
     ,Marker.Institution 
     ,Marker.Street 
     ,Marker.City 
     ,Marker.State 
     ,Marker.Zip 
     ,Marker.Latitude 
     ,Marker.Longitude  
     ,Marker.TotalAmount 
     ,Marker.TotalAwards 
     ,Award.GrantNumber as GrantNumber 
     ,Award.TotalObligatedAmount as GrantAmount 
FROM #FinalMarkers Marker  
    LEFT JOIN dbo.FLAS2_Grants Award 
     ON Marker.ID = Award.ID 
order by Marker.Institution ,Marker.Street, GrantAmount DESC 
for xml auto, root('root') 
END 

順便提及,每個無論在使用INTO子句創建期間的順序如何,「DEBUG」表都有1117行。

最後,這裏是怎樣的Web應用程序遍歷(算上「標誌」)的一個片段: enter image description here

+0

您的屏幕截圖顯示了一些數字。他們如何生成/計數?你把生成的XML手動分析了嗎?可能是,這不是來自查詢的所有... – Shnugo

回答

-1

爲您提供的片段中,爲ID#140652,它顯示了兩個獎項的子元素。在您的查詢中,由於左連接,它會爲此記錄顯示兩個單獨的訂單項。你會看到603條記錄。但是,您擁有較少的唯一ID。 XML Auto將這些記錄分組成單個記錄。盡我所見,它將這些記錄計爲一個單獨的記錄,這將導致< 603。根據文檔,「ORDER BY是必需的,以將所有的孩子歸入一個父母之下......因此,第一個元素被創建,然後子元素添加到它「我會檢查XML Auto msdn頁面,看看這些事情是哪些影響你,但AUTO可能不是你最好的選擇。最簡單的就是在你的xml中找到每種排序的層次結構。 https://msdn.microsoft.com/en-us/library/ms188273.aspx

+0

謝謝你的嘗試。在賞金之後,唯一另一個跳到這裏的人完全沒有幫助,實際上是無禮的。這對我來說很困難,我懷疑FOR XML AUTO引起了它,但最終它只是我需要調整SELECT子句的數據怪癖。 –

+1

Interesing,因爲你上面說過,所有3個結果集都有603行,你的xml例子清楚地顯示了一個XML自動化的元素分組,它會影響你的計數。我想看看您更改了哪些數據,因爲我很可能懷疑您做了某些事情來避免XML Auto元素分組。 – kubasnack

0

對我來說這是一個困難的問題(爲什麼我給了一個賞金),但我收到的幫助沒有什麼幫助。

我自己解決了這個問題。問題的要點是需要添加GROUP BY並通過添加Marker.Street來加強ORDER BY子句(請參見下面的代碼片段)。順便說一句,FOR XML AUTO非常適合在標記元素中創建Award元素。

IF @Sort = 2 
BEGIN 
SELECT Marker.ID 
     ,Marker.Institution 
     ,Marker.Street 
     ,Marker.City 
     ,Marker.State 
     ,Marker.Zip 
     ,Marker.Latitude 
     ,Marker.Longitude  
     ,Marker.TotalAmount 
     ,Marker.TotalAwards 
     ,Award.GrantNumber as GrantNumber 
     ,Award.TotalObligatedAmount as GrantAmount 
FROM #FinalMarkers Marker  
    LEFT JOIN dbo.FLAS2_Grants Award 
     ON Marker.ID = Award.ID 
GROUP BY Marker.ID 
     ,Marker.Institution 
     ,Marker.Street 
     ,Marker.City 
     ,Marker.State 
     ,Marker.Zip 
     ,Marker.Latitude 
     ,Marker.Longitude 
     ,Marker.TotalAmount 
     ,Marker.TotalAwards 
     ,Award.GrantNumber 
     ,Award.TotalObligatedAmount   
order BY Marker.TotalAwards DESC 
     ,Marker.ID 
     ,Marker.Institution 
     ,Marker.Street 
     ,GrantAmount DESC 
for xml auto, root('root') 
END 

的GROUP BY加入到基於@Sort值的每個代碼塊,但是否則就在OP代碼沒有變化。