我从table中将值插入xml中,如下所示:
DECLARE @XMLRESULT XML
DECLARE @tbl_XMLResult TABLE
(
RowID INT IDENTITY(1,1),
Status VARCHAR(50),
Address VARCHAR(250),
ListPrice INT,
SoldPrice INT,
YearBuilt INT
)
EXEC usp_GetReportResult @query = @query, @ReportName = @ReportName, @XMLResult = @XMLRESULT OUTPUT
INSERT INTO @tbl_XMLResult
(
Status,
Address,
ListPrice,
SoldPrice,
YearBuilt
)
SELECT
L.value('(ListingStatus/text())[1]','VARCHAR(50)') AS Status,
L.value('(PMCReportData/Listing_StreetAddress/text())[1]','VARCHAR(250)') AS Address,
L.value('(ListPrice/text())[1]','INT') AS ListPrice,
L.value('(ClosePrice/text())[1]','INT')AS SoldPrice,
L.value('(YearBuilt/text())[1]','INT')AS YearBuilt
FROM @XMLRESULT.nodes('/Results/Report/Listings/Listing')AS Result(L)但是,如上面所示,对于YearBuilt列,数据类型是int,我们在其中存储的只是构建属性的year。并相应地完成后续的calculations。但是,有时YearBuilt的值来自xml,如format中的
但是,当YearBuilt的上述结果出现在xml中时,我们就得到了conversion error。需要从上述结果中获得值,就好像YearBuilt是:
如何将适当的结果存储到@tbl_xmlResult中?
发布于 2016-03-10 13:33:01
将XML中的值作为字符串获取,并在case语句中执行一些字符串操作。
使用简化XML的示例:
declare @X xml = '
<YearBuilt>2017</YearBuilt>
<YearBuilt>New</YearBuilt>
<YearBuilt>0-5 Yrs</YearBuilt>
<YearBuilt>70+</YearBuilt>
';
select case
when T.Value = 'New' then year(getdate())
when T.Value like '%Yrs' then year(getdate()) - cast(replace(stuff(T.Value, 1, charindex('-', T.Value), ''), 'Yrs', '') as int)
when T.Value like '%+' then cast(left(T.Value, charindex('+', T.Value) - 1) as int)
else cast(T.Value as int)
end
from @X.nodes('/YearBuilt') as Y(X)
cross apply (
select Y.X.value('text()[1]', 'varchar(10)')
) as T(Value);https://dba.stackexchange.com/questions/131827
复制相似问题