SQL XML导入:应为“XQuery[值()]:”)
我正在尝试从XML数据向SQL中的表中插入数据。XML文件是从Microsoft Excel创建的,该文件的标题如下:SQL XML导入:应为“XQuery[值()]:”),sql,xml,sql-server-2008,tsql,xquery,Sql,Xml,Sql Server 2008,Tsql,Xquery,我正在尝试从XML数据向SQL中的表中插入数据。XML文件是从Microsoft Excel创建的,该文件的标题如下: <?xml version="1.0"?> <?mso-application progid="Excel.Sheet"?> <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office
<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:html="http://www.w3.org/TR/REC-html40">
它解析了大约半秒,然后给了我这个错误:
XQuery[值]:应为
正在解析的XML中的数据包含电话号码,其中一些包含和,例如:
但我不认为在中使用括号会引起问题
我的问题是,以前有没有人遇到过这个错误,因为我似乎无法通过在线搜索找到任何帮助
编辑
我想我在这件事上可能走错了方向。我在这里发布了一个新问题:
导致错误的可能不是电话号码中的括号,而是您的XQuery查询,我认为它有语法错误 @不在正确的位置,可能还需要转到,因为数据不是属性而是元素。你可以试着改变
select X.value('(ss:Row/ss:Cell/ss:@Data)','varchar(max)')
from @allUsers.nodes('Workbook/Worksheet/Table') as T(X)
到
你问了非常相似的问题。我从两者中获取了信息,并构建了这个工作示例。请注意必须声明为默认的xmlns命名空间: 简化了XML,但这个想法应该没问题
DECLARE @allUsers XML=
'<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:html="http://www.w3.org/TR/REC-html40">
<Worksheet>
<Table>
<Row ss:AutoFitHeight="0" ss:Height="30">
<Cell ss:StyleID="s22"/>
<Cell ss:StyleID="s24"><Data ss:Type="String">Jane Doe</Data></Cell>
<Cell ss:StyleID="s24"><Data ss:Type="String">JaneDoe</Data></Cell>
<Cell ss:StyleID="s24"><Data ss:Type="String">XYZ</Data></Cell>
<Cell ss:StyleID="s24"><Data ss:Type="String">(555) 555-5555</Data></Cell>
<Cell ss:StyleID="s22"/>
</Row>
</Table>
</Worksheet>
</Workbook>';
;WITH XMLNAMESPACES ('urn:schemas-microsoft-com:office:spreadsheet' as ss
,DEFAULT 'urn:schemas-microsoft-com:office:spreadsheet')
SELECT T.X.value('Cell[1]/Data[1]','varchar(max)') AS DontKnow1
,T.X.value('Cell[2]/Data[1]','varchar(max)') AS Name
,T.X.value('Cell[3]/Data[1]','varchar(max)') AS UserName
,T.X.value('Cell[4]/Data[1]','varchar(max)') AS DontKnow2
,T.X.value('Cell[5]/Data[1]','varchar(max)') AS Telephone
,T.X.value('Cell[6]/Data[1]','varchar(max)') AS DontKnow3
FROM @allUsers.nodes('/Workbook/Worksheet/Table/Row') as T(X)
另外,据我从文档中了解,value一次只能返回一个值,这意味着您可能需要将更多的XPath推送到from部分,或者在XQuery末尾添加一个[1]以只获取第一个值,等等。这样做会给我一个空数据集。我做了一些更改,我将提出一个新问题,并将其链接到此处。ss名称空间未绑定到行或单元格这是默认名称空间xmlns,必须使用XMLNAMESPACES作为默认名称空间进行声明…实际上,使用的前缀或不使用前缀都不相关,由于QNames仅在名称空间和本地名称方面进行比较,因此前缀只是名称空间的代理-当然,除非SQL Server具有不同的语义,这会让我感到惊讶。但是,您的答案确实解决了独立返回每个值、在行上迭代的问题,我认为这就是它的优点。查看原始查询,工作簿/工作表/表没有ss前缀,并且由于也没有声明默认名称空间,因此它们与文档不匹配。这就是为什么什么也不归还。好的双接雪纳哥!我对你的答案投了赞成票,太好了。谢谢。很高兴看到我能帮助你。。。很高兴投赞成票,谢谢!事实上,我认为另一个问题的标题和描述更准确,将来对其他人更有用。你介意把你的答案改成这个吗?我将把标题信息包括在这里,我将把它复制到你另一个问题的第二个答案中。这取决于你决定你要投票和接受哪一个。这样行吗?
select X.value('(ss:Row/ss:Cell/ss:@Data)','varchar(max)')
from @allUsers.nodes('Workbook/Worksheet/Table') as T(X)
select X.value('(ss:Row/ss:Cell/ss:Data)[1]','varchar(max)')
from @allUsers.nodes('ss:Workbook/ss:Worksheet/ss:Table') as T(X)
DECLARE @allUsers XML=
'<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:html="http://www.w3.org/TR/REC-html40">
<Worksheet>
<Table>
<Row ss:AutoFitHeight="0" ss:Height="30">
<Cell ss:StyleID="s22"/>
<Cell ss:StyleID="s24"><Data ss:Type="String">Jane Doe</Data></Cell>
<Cell ss:StyleID="s24"><Data ss:Type="String">JaneDoe</Data></Cell>
<Cell ss:StyleID="s24"><Data ss:Type="String">XYZ</Data></Cell>
<Cell ss:StyleID="s24"><Data ss:Type="String">(555) 555-5555</Data></Cell>
<Cell ss:StyleID="s22"/>
</Row>
</Table>
</Worksheet>
</Workbook>';
;WITH XMLNAMESPACES ('urn:schemas-microsoft-com:office:spreadsheet' as ss
,DEFAULT 'urn:schemas-microsoft-com:office:spreadsheet')
SELECT T.X.value('Cell[1]/Data[1]','varchar(max)') AS DontKnow1
,T.X.value('Cell[2]/Data[1]','varchar(max)') AS Name
,T.X.value('Cell[3]/Data[1]','varchar(max)') AS UserName
,T.X.value('Cell[4]/Data[1]','varchar(max)') AS DontKnow2
,T.X.value('Cell[5]/Data[1]','varchar(max)') AS Telephone
,T.X.value('Cell[6]/Data[1]','varchar(max)') AS DontKnow3
FROM @allUsers.nodes('/Workbook/Worksheet/Table/Row') as T(X)