Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL XML导入:应为“XQuery[值()]:”)_Sql_Xml_Sql Server 2008_Tsql_Xquery - Fatal编程技术网

SQL XML导入:应为“XQuery[值()]:”)

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数据向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"
 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)