SQL XML导入:XQuery [值()]:“)”预计
我想从XML数据插入到SQL表中的数据。SQL XML导入:XQuery [值()]:“)”预计
<?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">
我使用这个查询来分析它:
;WITH XMLNAMESPACES ('urn:schemas-microsoft-com:office:spreadsheet' as ss)
select X.value('(ss:Row/ss:Cell/ss:@Data)','varchar(max)')
from @allUsers.nodes('Workbook/Worksheet/Table') as T(X)
,它解析为约半秒,然后给我的XML文件是从Microsoft Excel中,这使得它这个头创建这个错误:
XQuery [value()]: ")" was expected.
在XML中的数据正在分析包含电话号码,其中一些含有(
和)
例如:
<Row ss:AutoFitHeight="0" ss:Height="30">
<Cell ss:StyleID="s22"/>
<Cell ss:StyleID="s24"><Data ss:Type="String">JohnSmith</Data></Cell>
<Cell ss:StyleID="s24"><Data ss:Type="String">JohnSmith</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>
但我不认为在一个开放的括号会导致一个问题。
我的问题是,有其他人之前遇到过这个错误,因为我似乎无法通过在线搜索找到任何帮助?
编辑 我想我可能在这种情况下走错了方向。我在这里发布了一个新问题: Separating XML values with the same tags into different rows SQL Server
你问非常类似的问题。我从两者中获取信息并构建了这个工作示例。注意必须声明为“DEFAULT”的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)
这可能不是导致错误的电话号码中的括号,而是您认为出现语法错误的XQuery查询。
@不在正确的位置,也可能需要去,因为数据不是属性而是元素。你可以尝试改变
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)
此外,据我了解它的文档,value()应该一次只返回一个值,这意味着你可能需要将更多的XPath推入“from”部分,或者在XQuery的末尾添加一个[1],以便只取得第一个值等。 –
这样做会给我一个空的数据集。我做了一些改变,我会问一个新问题并将其链接到此处。 –
“ss” - 名称空间未绑定到“Row”或“Cell”,这是默认名称空间“xmlns”,必须使用XMLNAMESPACES作为默认名称空间声明... – Shnugo
这太好了。谢谢。 –
很高兴看到我可以帮助你...会很高兴投票,thx! – Shnugo
我实际上认为,另一个问题有更准确的标题和问题描述,将来对其他人更有用。你介意改变你对这个问题的答案吗?我将从这里包含标题信息 –