2015-10-20 2 views
2

Я пытаюсь вставить данные в таблицу в SQL из данных XML. Файл XML был создан из Microsoft Excel, которая дает ему этот заголовок:SQL XML Import: 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) 

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

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> 

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

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

EDIT Я думаю, что в этом случае я, возможно, шел в неправильном направлении. Я разместил здесь новый вопрос: Separating XML values with the same tags into different rows SQL Server

ответ

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

Это замечательно. Благодарю. –

+0

Рад прочитать, что я могу вам помочь ... Было бы неплохо проголосовать, THX! – Shnugo

+0

На самом деле я думаю, что другой вопрос имеет более точное название и описание проблемы и будет более полезен для других в будущем. Не могли бы вы изменить свой ответ на этот вопрос? Я собираюсь включить информацию заголовка отсюда –

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

Кроме того, насколько я понимаю из документации , значение() должно возвращать только одно значение за раз, что означает, что вам может понадобиться либо нажать еще одну часть XPath в часть «from», либо добавить [1] в конце вашего XQuery, чтобы взять только первое значение и т. д. –

+0

Это дает мне пустой набор данных. Я внес некоторые изменения, и я собираюсь задать новый вопрос и связать его здесь. –

+0

«ss» -namespace не привязано к «Row» или «Cell», это пространство имен по умолчанию «xmlns», которое должно быть объявлено с XMLNAMESPACES как пространство имен по умолчанию ... – Shnugo

Смежные вопросы