SQL Server BULK INSERT - экранирование зарезервированных символов - PullRequest
5 голосов
/ 14 августа 2011

Существует очень мало документации по экранированию символов в файлах SQL Server BULK INSERT.

В документации для BULK INSERT говорится, что в операторе есть только два параметра форматирования: FIELDTERMINATOR и ROWTERMINATOR, однако в нем не говорится, как вы должны экранировать эти символы, если они появляются в значении поля строки.

Например, если у меня есть эта таблица:

CREATE TABLE People ( name varchar(MAX), notes varchar(MAX) )

и этот единственный ряд данных:

"Foo, \Bar", "he has a\r\nvery strange name\r\nlol"

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

Foo,\Bar,he has a
very strange name
lol

SQL Server говорит, что поддерживает \r и \n, но не говорит, что обратные слэши избегают самих себя, и при этом не упоминается разграничение значений полей (например, двойными кавычками или экранирование двойных кавычек). ) поэтому я немного озадачен этой областью.

Ответы [ 3 ]

4 голосов
/ 01 октября 2011

Я обошел эту проблему, используя \ 0 в качестве разделителя строк и \ t в качестве разделителя полей, так как ни один символ не появился в качестве значения поля и оба поддерживаются как разделители в BULK INSERT.Я удивлен, что MSSQL не обеспечивает большей гибкости при импорте / экспорте.Для создания первоклассного парсера CSV / TSV не потребовалось бы слишком много усилий.

1 голос
/ 01 мая 2018

Поиск следующего человека:

Я использовал "\ 0 \ t" в качестве разделителя полей и "\ 0 \ n" для разделителя конца строки в последнем поле. Использование "\ 0 \ r \ n" также будет приемлемо, если вы хотите сделать вид, что файлы имеют соглашения DOS EOL.

Для тех, кто не знаком с обозначением \ x, \ 0 - это CHAR (0), \ t - это CHAR (9), \ n - это CHAR (10), а \ r - это CHAR (13). Замените функцию CHAR () на то, что ваш язык предлагает для преобразования числа в назначенный символ.

При этой комбинации все экземпляры \ t и \ n (и \ r) становятся допустимыми символами в файле данных. В конце концов, слабость системы массовой загрузки заключается в том, что символы табуляции и перевода строки часто являются допустимыми символами в текстовых строках, тогда как другие символы с низким ASCII, такие как CHAR (0), CHAR (1) и CHAR (2), не являются легальным текстом - даже появляется в UTF-8.

Единственный символ, который вы не можете использовать в своих данных, это \ 0 - ЕСЛИ вы не можете гарантировать, что за ним никогда не последует \ t или \ n (или \ r)

Если ваш язык испытывает проблемы, когда вы используете \ 0 в строках (но в зависимости от того, как вы кодируете, вы все равно сможете избежать этой проблемы) - И если вы знаете, что ваши данные не будут иметь CHAR (1) или CHAR (2) в нем (то есть без двоичного кода) затем используют эти символы вместо этого. Эти младшие символы можно найти только тогда, когда вы пытаетесь сохранить произвольные двоичные данные в строках.

Обратите внимание, что вы найдете байты 0, 1, 2 в UTF-16, UCS-2 и UTF-32 (он же UCS-4) - НО - представление CHAR в 2 или 4 байта (0, 1 или 2) все еще приемлемо и отличается от любого легального текста в юникоде. Просто убедитесь, что вы выбрали правильную настройку кодовой страницы в файле формата, соответствующую вашему выбору варианта UTF или UCS.

0 голосов
/ 14 августа 2011

Массовая вставка должна иметь соответствующие поля и количество полей для каждой строки. Ваш пример немного грубоват, так как это не структурированные данные. Что касается символов, он будет интерпретировать их буквально, без использования escape-символов (ваша строка будет такой же, как в файле.

Что касается двойных кавычек, заключающих в себе каждое поле, вам просто нужно будет использовать их как терминаторы полей и строк. Так что теперь вы должны иметь:

Fieldterminator = '","', Rowterminator = '"\ n'

Это имеет смысл? Затем, после массовой вставки, вам понадобится извлечь двойную кавычку префикса с чем-то вроде:

Обновление вашей таблицы установить yourfirstcolumn = right (yourfirstcolumn, len (yourfirstcolumn) - 1)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...