Поиск записей с предложением where, имеющим одинарные кавычки

У меня есть столбец таблицы (тип nvarchar), который содержит запись «XYZ INT'ABC», и я использую этот столбец в хранимой процедуре в предложении where. Поэтому при добавлении условия в предложение where проверка должна выполняться, как показано ниже:

select * from tableName where ColumnName = 'XYZ INT''ABC';

При передаче параметра в SP из кода VB.net параметр передается правильно, как показано в запросе выбора выше. Но SP ищет, используя приведенный ниже запрос, из-за которого я не получаю желаемого результата для упомянутого предложения where.

select * from tableName where ColumnName = 'XYZ INT''''ABC';

Пожалуйста помоги. Заранее спасибо.


person Che    schedule 25.01.2018    source источник
comment
Пожалуйста, покажите код VB.NET   -  person Steve    schedule 25.01.2018
comment
Я передаю правильное значение параметра процедуры в коде Vb.net. Но когда я проверил с помощью профилировщика SQL, в операторе выполнения хранимой процедуры передается неправильное значение (XYZ INT ''''ABC).   -  person Che    schedule 25.01.2018
comment
В вашем коде VB вам не нужно экранировать одинарную кавычку, поэтому ваша строка VB должна выглядеть "XYZ INT'ABC", она будет удваиваться при передаче на сервер sql, чтобы избежать одинарной кавычки, и вы получите 'XYZ INT''ABC' на сервере sql   -  person M.Ali    schedule 25.01.2018
comment
Кажется, вы передаете свою строку с уже удвоенной кавычкой, передаете ее как есть   -  person sepupic    schedule 25.01.2018
comment
да... Я преобразовываю строку из XYZ INT'ABC в XYZ INT''ABC, прежде чем назначать ее значению параметра в коде Vb.net. Попробую предложенное решение.   -  person Che    schedule 25.01.2018


Ответы (1)


У вас уже есть предложения в комментариях. Просто некоторое объяснение:

Двойные кавычки на самом деле не являются частью строки

DECLARE @SomeString VARCHAR(100) = 'With one quote''!';

Строка, которую вы найдете в своей переменной, будет With one quote'!. Двойные кавычки — это просто специальность синтаксиса, позволяющая синтаксическому анализатору операторов видеть, завершает ли кавычка строку или нет. Что-то вроде

DECLARE @SomeString VARCHAR(100) = 'With one quote'!'; --wrong!

...неверно, потому что строка заканчивается после quote, а !' внезапно является синтаксической ошибкой.

Это нужно только в тех случаях, когда одинарная кавычка является маркером строки. В VB.Net у вас будет та же проблема, если вы захотите поместить двойную кавычку " в свою строку, но это будет работать в SQL, как здесь:

DECLARE @SomeString VARCHAR(100) = 'With one double quote"!';

Вы должны мыслить двояко

  • Как вы присваиваете значение? (в зависимости от вашей IDE и синтаксического анализатора операторов)
  • Какое фактическое значение хранится в переменной (это будет использоваться во время выполнения)

Связанный и более очевидный пример:

Очень часто вы видите такой код (присваивание)

string SomeString = "Some text/nwith a line-break";

что переводится в (фактическое значение)

Some text
with a line-break
person Shnugo    schedule 25.01.2018