Удаление одиночной кавычки в SQL Server - программирование
Подтвердить что ты не робот

Удаление одиночной кавычки в SQL Server

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

declare @year varchar(max)
set @year = '111,11';
exec ('SELECT * FROM SplitValues(' + @year + ','','')');

Я даже пытался использовать char(39) вместо кавычек:

declare @year varchar(max)
set @year = '111,11';
exec ('SELECT * FROM SplitValues(' + @year + ',' + char(39) + ',' + char(39) + ')');

Но это не помогло. Это единственные два решения, которые я нашел на этом сайте. Любая помощь?

Это упрощенный запрос для выяснения всех ваших вопросов:

declare @year varchar(max)
set @year = '111,11';
SELECT * FROM SplitValues(@year , ',')

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

4b9b3361

Ответ 1

Слово совета. При тестировании динамического script сначала просто отобразите его вместо его выполнения. Таким образом, вы сможете увидеть его точно так, как это было бы видно в инструкции EXEC.

Теперь о проблеме. Вы должны иметь в виду, что вы не передаете переменную в SplitValues, а вместо этого объединяете значение переменной в script. Поскольку значение varchar, оно должно быть конкатенировано с кавычками вокруг него. Отсутствие их - единственная проблема на самом деле.

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

  • повторение кавычки:

    DECLARE @year varchar(max), @sql varchar(max);
    SET @year = '111,11';
    SET @sql = 'SELECT * FROM SplitValues(''' + @year + ''','','')';
    SELECT @sql;
    
  • с помощью CHAR(39):

    DECLARE @year varchar(max), @sql varchar(max);
    SET @year = '111,11';
    SET @sql = 'SELECT * FROM SplitValues(' + CHAR(39) + @year + CHAR(39) + ',' + CHAR(39) + ',' + CHAR(39) + ')';
    SELECT @sql;
    

Очевидно, что первый метод более компактный, но, как я уже сказал, оба хорошо работают, поскольку эта демонстрация SQL Fiddle ясно показывает.

Обратите внимание, однако, что вы могли бы легко избежать этой проблемы в первую очередь, если вы прощаете каламбур. Вместо EXEC () вы можете использовать EXEC sp_executesql, который позволяет использовать параметры. Здесь же script переписан для использования sp_executesql:

DECLARE @year varchar(max), @delim char(1);
SET @year = '111,11';
SET @delim = ',';
EXEC sp_executesql
  N'SELECT * FROM SplitValues(@year_param,@delim_param)',
  N'@year_param varchar(max), @delim_param char(1)',
  @year,@delim;

Как вы можете видеть, не нужно беспокоиться о том, чтобы избежать кавычек: SQL Server не может заменить значения правильно, а не вы.

Ответ 2

Просто введите одиночную кавычку два раза:

select 'that' it'

Ответ 3

Хорошо... вы хотите взять эту строку:

SELECT * FROM SplitValues(@year , ',')

И сделайте строку такой:

'SELECT * FROM SplitValues('111,11' , '','')'

Итак, ваш окончательный код:

declare @year varchar(max), @sql varchar(max)
set @year = '111,11';
set @sql = 'SELECT * FROM SplitValues(''' + @year + ''' , '''','''')'

select @sql

На самом деле, наконец, выберете вместо этого exec(). Однако вы действительно должны использовать sp_sqlexecute для таких вещей, поскольку вы можете использовать параметризованные запросы.