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) 
+0

这太好了。谢谢。 –

+0

很高兴看到我可以帮助你...会很高兴投票,thx! – Shnugo

+0

我实际上认为,另一个问题有更准确的标题和问题描述,将来对其他人更有用。你介意改变你对这个问题的答案吗?我将从这里包含标题信息 –

这可能不是导致错误的电话号码中的括号,而是您认为出现语法错误的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) 
+0

此外,据我了解它的文档,value()应该一次只返回一个值,这意味着你可能需要将更多的XPath推入“from”部分,或者在XQuery的末尾添加一个[1],以便只取得第一个值等。 –

+0

这样做会给我一个空的数据集。我做了一些改变,我会问一个新问题并将其链接到此处。 –

+0

“ss” - 名称空间未绑定到“Row”或“Cell”,这是默认名称空间“xmlns”,必须使用XMLNAMESPACES作为默认名称空间声明... – Shnugo