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 ответа:
Вы задавали очень похожие вопросы. Я взял информацию из обоих и построил этот рабочий пример. Помните о пространстве имен 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)