DECLARE @tbl_XMLResult table
(
Status varchar(50),
Address varchar(100),
ListPrice varchar(25),
SoldPrice varchar(25),
YearBuilt varchar(25),
SF varchar(25),
Acres varchar(25),
OnMarkDate varchar(25),
PendDate varchar(25),
SaleDate varchar(25),
DOM varchar(25)
)
DECLARE @XMLRESULT xml
exec usp_ReportResults @query = "759,905,1048,170,725,80129", @ReportName = "GenReport", @XMLResult = @XMLRESULT OUTPUT
INSERT INTO @tbl_XMLResult(Status, Address, ListPrice, SoldPrice,
YearBuilt, SF, Acres, OnMarkDate, PendDate, SaleDate, DOM)
SELECT
Listing.value('(/ListingStatus/text())[1]', 'varchar(50)') AS Status,
ReportData.value('(/Listing_StreetAddress/text())[1]', 'varchar(50)') AS Address,
Listing.value('(/ListPrice/text())[1]', 'varchar(50)') AS ListPrice,
Listing.value('(/ClosePrice/text())[1]', 'varchar(50)')AS SoldPrice,
Listing.value('(/YearBuilt/text())[1]', 'varchar(50)') AS YearBuilt,
Listing.value('(/TotalLvSpace/text())[1]', 'varchar(50)') AS SF,
Listing.value('(/AcresApx/text())[1]', 'varchar(50)') AS Acres,
Listing.value('(/ListDate/text())[1]', 'varchar(50)') OnMarkDate,
Listing.value('(/PendingDate/text())[1]', 'varchar(50)') AS PendDate,
Listing.value('(/CloseDate/text())[1]', 'varchar(50)') AS SaleDate,
Listing.value('(/DaysOnMarket/text())[1]', 'varchar(50)') DOM
FROM
@XMLRESULT.nodes('/Results/Report/Listings/Listing') AS ListingTable(Listing),
@XMLRESULT.nodes('/Results/Report/Listings/Listing/PMCReportData') AS TempTable(ReportData)
SELECT *
FROM @tbl_XMLResult
私はxml形式のようにストアドプロシージャから結果を取得し、その結果を読み取ることにより、上記で作成した一時テーブルに結果を格納しようとしています。しかし、私はnull
として結果を取得し、現在のストアドプロシージャはxmlで6つのレコードのみを返しますが、null
値を持つ一時テーブルに36行を表示します。それを修正するには?
これはxml形式です。
value()
関数の先頭で_/
_を削除する必要があります。つまり、これは_Listing.value('(/
_です。ListingTable(Listing)
とTempTable(ReportData)
の間で古いスタイルのJOIN
構文を使用しているために発生する_CROSS JOIN
_も削除する必要があります。 PCMReportDataをわずかに異なる方法で参照することにより、これを行うことができます。XMLスキーマに基づいて、値を取得する必要があります。
_DECLARE @XMLRESULT XML;
SET @XMLRESULT = '<Results ReplyCode="0" ReplyText="Operation Successfull">
<Report PropertyType="ResidentialProperty">
<Listings>
<Listing>
<ListingID>759</ListingID>
<PCMReportData>
<Listing_StreetAddress>My Street Address</Listing_StreetAddress>
</PCMReportData>
</Listing>
<Listing>
<ListingID>852</ListingID>
</Listing>
</Listings>
</Report>
</Results>';
SELECT
Listing.value('(ListingID/text())[1]', 'varchar(50)') AS ListingID,
Listing.value('(PCMReportData/Listing_StreetAddress/text())[1]', 'varchar(50)') AS Address
FROM @XMLRESULT.nodes('/Results/Report/Listings/Listing') AS ListingTable(Listing);
_
ListingTable(Listing)
とTempTable(ReportData)
の間で_CROSS JOIN
_を実行しています。したがって、6つの結果に6つの内部結果を乗算すると、36になります。