Почему я должен вводить так много одинарных кавычек, чтобы избежать кавычек в динамическом SQL? - PullRequest
1 голос
/ 14 февраля 2012

Может ли кто-нибудь объяснить, почему я должен был набрать 10 одинарных кавычек, просто чтобы сохранить их в столбце? Я пытаюсь понять логику этого ..

exec('UPDATE [SomeTable] SET [SomeColumn] = '''''''''''', [AnotherColumn] = Null ')

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

Ответы [ 3 ]

8 голосов
/ 14 февраля 2012

Вы всегда можете использовать эквивалент (CHAR(39)), если вы действительно хотите сохранить '' в базе данных без необходимости экранирования (хотя я не уверен, что вы намеревались сохранить пустую строку или на самом деле хранить две одинарные кавычки):

EXEC('
  DECLARE @x TABLE(x VARCHAR(10));
  INSERT @x SELECT CHAR(39) + CHAR(39);
  SELECT x FROM @x;
');

Обычно я делаю что-то подобное, чтобы избежать конкатенации и некрасивого вложения одинарных кавычек при построении динамического SQL:

DECLARE @sql NVARCHAR(MAX) = N'';

SET @sql = 'SELECT foo = $sq$bar$sq$;';

SET @sql = REPLACE(@sql, '$sq$', CHAR(39));

SELECT @sql;

EXEC sp_executesql @sql;

Нет, это не делает этот конкретный случай более понятным, конечно, но когда вы ссылаетесь на одну и ту же базу данных, таблицу или столбец несколько раз в большой строке, гораздо эффективнее заменить токены ($db$ , $table$ и т. Д.), Чем иметь дело со всем другим беспорядком объединения. ИМХО.

1 голос
/ 14 февраля 2012

Вам нужно / иметь двенадцать цитат. Каждая цитата в строке экранируется второй цитатой. Обычно вам нужно было бы сделать set column = '''''', но поскольку это само по себе находится внутри строки, каждая экранированная кавычка должна быть удвоена, в результате чего вы получите двенадцать кавычек.

1 голос
/ 14 февраля 2012

Код для вставки '' в таблицу будет выглядеть так:

UPDATE [SomeTable] SET [SomeColumn] = '''''', [AnotherColumn] = Null

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

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