我試圖在使用FOR XML AUTO返回時,在我的SQL結果中理解一些異常。奇怪的是,我在XML中得到了不同的結果。總之,機構計數應該永遠是603,但XML數據讓我在這套片斷顯示3次不同的總計: 與正常的行集相比,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應用程序遍歷(算上「標誌」)的一個片段:
您的屏幕截圖顯示了一些數字。他們如何生成/計數?你把生成的XML手動分析了嗎?可能是,這不是來自查詢的所有... – Shnugo