T-SQL如何提取示例数据库中中的XML内容

怪众生太美丽 怪众生太美丽 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
如题,我想提取AdventureWorks示例数据库表Individual下的Demographics列字段中的各个节点值,我先获取表内一条数据
放入XML变量中进行测试;如下:

USE AdventureWorks
GO

DECLARE @TEST XML
SET @TEST=(SELECT TOP 1 Demographics FROM Sales.Individual)
PRINT CONVERT(NVARCHAR(MAX),@TEST)


得到的XML文件内容如下:

<IndividualSurvey xmlns="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/IndividualSurvey">
<TotalPurchaseYTD>8248.99</TotalPurchaseYTD>
<DateFirstPurchase>2001-07-22Z</DateFirstPurchase>
<BirthDate>1966-04-08Z</BirthDate>
<MaritalStatus>M</MaritalStatus>
<YearlyIncome>75001-100000</YearlyIncome>
<Gender>M</Gender>
<TotalChildren>2</TotalChildren>
<NumberChildrenAtHome>0</NumberChildrenAtHome>
<Education>Bachelors </Education>
<Occupation>Professional</Occupation>
<HomeOwnerFlag>1</HomeOwnerFlag>
<NumberCarsOwned>0</NumberCarsOwned>
<CommuteDistance>1-2 Miles</CommuteDistance>
</IndividualSurvey>


----
我如下提取为何提取到的都是空值:

DECLARE @TEST XML
SET @TEST=(SELECT TOP 1 Demographics FROM Sales.Individual)
PRINT CONVERT(NVARCHAR(MAX),@TEST)
--SELECT TotalPurchaseYTD=T.C.value('/TotalPurchaseYTD.[1]','nvarchar(20)')
--FROM @TEST.nodes('/IndividualSurvey') T(C)

SELECT TotalPurchaseYTD =
@TEST.value('(/IndividualSurvey/TotalPurchaseYTD)[1]', 'nvarchar(20)'),
BirthDate=@TEST.value('(/IndividualSurvey/BirthDate)[1]', 'DATETIME'),
MaritalStatus=@TEST.value('(/IndividualSurvey/MaritalStatus)[1]', 'nvarchar(2)')

--取得的都是空值

如上 取得的都是空值,是我写法错了?还是XML执行了XML架构 命名空间等的原因?
刚刚学习XML数据类型的操作,了解很少,求帮助。

--帮助文档内的方法都是可行的呀,如下:

DECLARE @myDoc xml
SET @myDoc = '<Root>
<ProductDescription ProductID="1" ProductName="Road Bike">
<Features>
<Warranty>1 year parts and labor</Warranty>
<Maintenance>3 year parts and labor extended maintenance is available</Maintenance>
</Features>
</ProductDescription>
</Root>'

SELECT ProdID = @myDoc.value('(/Root/ProductDescription/@ProductID)[1]', 'int' ),
ProductName=@myDoc.value('(/Root/ProductDescription/@ProductName)[1]', 'nvarchar(20)' ),
XX=@myDoc.value('(/Root/ProductDescription/Features/Warranty)[1]', 'nvarchar(20)' )

--结果如下:
ProdID ProductName XX
----------- -------------------- --------------------
1 Road Bike 1 year parts and lab

(1 行受影响)
...全文
评论 5
收藏 已收藏
分享
返回顶部
怪众生太美丽
MS-SQL Server 34,876 成员 254,635 内容