SQL XML Import: XQuery [value ()]:") " ожидалось


Я пытаюсь вставить данные в таблицу в SQL из XML-данных. 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">

Я использую этот запрос для его разбора:

;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)

Который разбирает примерно полсекунды, а затем выдает мне эту ошибку:

XQuery [value ()]:") " ожидалось.

Данные в анализируемом 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>

Но я этого не делаю. подумайте, что открытые скобки внутри вызовут проблему.

Мой вопрос в том, сталкивался ли кто-нибудь с этой ошибкой раньше, так как я не могу найти никакой помощи через онлайн-поиск?

EDIT Я думаю, что в этом случае я, возможно, шел в неправильном направлении. Я разместил здесь новый вопрос: разделение XML-значений с одинаковыми тегами на разные строки SQL Server

2 2

2 ответа:

Вы задавали очень похожие вопросы. Я взял информацию из обоих и построил этот рабочий пример. Помните о пространстве имен xmlns, которое должно быть объявлено как "DEFAULT":

Упростил 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)