我有这个XML:
<Files>
<File>
<Name>pic1</Name>
<Description>Pics</Description>
<URL>URL1</URL>
<TypeText>jpg</TypeText>
</File>
<File>
<Name>pic2</Name>
<Description>Pics</Description>
<URL>URL2</URL>
<TypeText>jpg</TypeText>
</File>
<File>
<Name>pic3</Name>
<Description>Pics</Description>
<URL>URL3</URL>
<TypeText>jpg</TypeText>
</File>
</Files>
我想将它们插入SQL Server表中。我使用这段代码:
INSERT INTO #T
SELECT
XFiles.value('/Name', 'nvarchar(120)'),
XFiles.value('/Description', 'nvarchar(300)'),
XFiles.value('/URL', 'nvarchar(max)'),
XFiles.value('/TypeText', 'nvarchar(120)')
FROM @FilesXML.nodes('/Files/File')
AS XTbl(XFiles)
但它给了我错误。
XQuery [value()]: 'value()' requires a singleton (or empty sequence), found operand of type 'xdt:untypedAtomic *'
我认为我在jpath
部分犯了错误。是对还是错?
提前完成
答案 0 :(得分:3)
您需要更改您的选择查询:
SELECT
XFiles.value('Name[1]', 'nvarchar(120)') as Name,
XFiles.value('Description[1]', 'nvarchar(300)'),
XFiles.value('URL[1]', 'nvarchar(max)'),
XFiles.value('TypeText[1]', 'nvarchar(120)')
FROM @FilesXML.nodes('/Files/File') as XTbl(XFiles)
例如,如果您只选择Name
,那么XPath查询将返回Name
个节点的集合 - 即使只有一个子节点! - 因此你看到了错误。您必须确保XPath查询只返回一个内容,因此添加了[1]
索引器。