Экранирование динамического количества экземпляров символа в SQL - PullRequest
0 голосов
/ 20 марта 2019

У меня есть SQLCMD ниже (он отлично работает), который я выполняю из командной строки для записи данных SQL в файл .csv.У меня возникла проблема с запятыми, которые находятся внутри значений базы данных (что разрушает разделение csv), приведя строковое поле к nvarchar (100), окруженному двойными кавычками, например:

SQLCMD -s"," -S servername -U username -d databasename -W -o 
"mydatafile.csv” -Q "SET NOCOUNT ON 
SELECT Account,'""' + cast ([ColDescription] as nvarchar(100)) + '""' as ColumnDescription" FROM myTable

.... столбец с экранированными двойными-двойными кавычками - это ColDescription, а исходное строковое поле на самом деле содержит 100 символов.Итак, это исправило мою проблему, но теперь я столкнулся с новой проблемой со значениями в моей базе данных, которые начинаются с кавычек.Для тех записей, где значение данных фактически начинается с кавычек, я предполагаю, что я хотел бы избежать с 3 экземплярами двойных кавычек (так, чтобы в строке результата были экранированы все двойные кавычки).

Но,Как я могу сказать SQL, чтобы избежать любого количества экземпляров двойных кавычек?Я не знаю, какие записи будут иметь двойные кавычки, или 2 двойные кавычки, или что.

Еще лучше, в идеале я хотел бы отобразить двойные кавычки в моем файле .csv, если они существуют вданные.Так что, возможно, мне вообще не нужно их избегать.Я не уверен, что я ищу правильные слова для этой проблемы.Я думаю, что я хочу избежать шаблона символов ... это звучит как вещь в стиле REGEX?Я не использовал REGEX в sql раньше, и мой инстинкт говорит мне, что это слишком сложно для проблемы, которая кажется распространенной и должна быть решена раньше.

РЕДАКТИРОВАТЬ: Я также попробовал новый подход, когда я комментировалниже.Я изменил свой SQLCMD на следующий (хотя это урезанная версия моего «реального» запроса).Но обратите внимание, я использовал функцию Replace, чтобы заменить все кавычки на 2 кавычки.Я думал, что, сделав четное количество кавычек, все они будут экранированы при экспорте в .csv.

SQLCMD -s"," -S servername -U username -d databasename -W -o 
"mydatafile.csv” -Q "SET NOCOUNT ON 
SELECT Account,'""' + Replace(cast ([ColDescription] as 
nvarchar(100)),'"','""') + '""' as ColumnDescription" FROM myTable

... Но теперь моя ошибка в командной строке - «Неожиданный аргумент».Я думаю, что «Заменить» - это ключевое слово, которое, возможно, мне также нужно было бы экранировать в Windows ...?Впрочем, новый оператор Select отлично работает прямо в SQL.Я просто больше не могу выполнять команду.

1 Ответ

0 голосов
/ 21 марта 2019

Я наконец нашел способ обойти свои проблемы. Если я использую функцию QUOTENAME вокруг моих столбцов описания SQL, которые могут содержать специальные символы, такие как запятые и двойные кавычки, то я могу экспортировать в файл CSV, и разделение запятыми будет работать правильно, а кавычки в полях данных также сохраняются. Мой новый оператор SQL / оператор SQLCMD:

SQLCMD -s"," -S servername -U username -d databasename -W -o 
"mydatafile.csv” -Q "SET NOCOUNT ON 
SELECT Account, QUOTENAME(cast ([ColDescription] as nvarchar(100)),'""') as ColumnDescription" FROM myTable

Я читал об этой функции QUOTENAME раньше, но не смог заставить ее работать, и я нашел пример использования QUOTENAME здесь:

Экспорт данных CSV с использованием SQLCMD.EXE

Но мне пришлось немного изменить это решение (оно снова выдало мне ошибку CMD, например, «Неожиданный аргумент пресс? Для помощи»). Как вы можете видеть выше, я теперь использую 2 двойные кавычки вместо одной в функции QUOTENAME. Это все исправило.

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