2009-09-17 8 views
34

У меня есть эта функция в SQL Server для замены одинарных кавычек.Заменить одинарные кавычки в SQL Server

Но когда я вставить одну цитату он выдает ошибку на Replace(@strip,''','')):

Create Function [dbo].[fn_stripsingleQuote] 
    (@strStrip varchar(Max)) 
    returns varchar 
as 
begin 
    declare @CleanString varchar(Max) 
    SET @var=(Replace(@strip,'','')) 

    return @var 
end 

ответ

81

Вы должны удвоить свои одиночные кавычки следующим образом:

REPLACE(@strip, '''', '') 
+0

. Я столкнулся с одной и той же проблемой, но используя вашу технику, я получаю ** синтаксическую ошибку, неожиданную ' '' (T_CONSTANT_ENCAPSED_STRING) '** –

0

Чередование/замена/scaping отдельных цитат из пользовательского ввода (input sanitation), должно быть сделано перед тем SQL, оператор достигает базы данных.

+0

Это также можно сделать на вставках, поэтому администратор не только на dba –

+0

, это подразумевает, что sprocs open to sql injection одобрены. Я не согласен с этим. –

+0

Что делать, если кодер, взаимодействующий с экземпляром сервера, пытается сознательно создать атаку SQL-инъекций? Там также должна быть какая-то проверка/санитария на конце T-SQL/базы данных, особенно для хранимых процедур, как это подразумевается в @JohnDhom – mpag

19

Попробуйте REPLACE(@strip,'''','')

SQL использует две кавычки, чтобы представить один в строке.

1

Попробуйте уйти от одного цитаты с одной цитатой:

Replace(@strip, '''', '') 
0

Кроме необходимости избежать кавычек (используя двойные кавычки), вы также путаете имена переменных: вы используете @var и @strip, а не @CleanString и @strStrip ...

13

Если вы действительно должны полностью отключить сингл е котировки вы можете сделать это:

Replace(@strip, '''', '') 

Однако, обычно вы бы заменить 'с „“ и это сделает SQL Server счастливым, когда запросы к базе данных. Трюк с любой из встроенных функций SQL (например, замена) заключается в том, что они также требуют, чтобы вы удвоили свои одиночные кавычки.

Так, чтобы заменить 'с „“ в коде вы могли бы сделать это:

Replace(@strip, '''', '''''') 

... Конечно, в некоторых ситуациях вы можете избежать того, чтобы сделать это полностью, если вы используете параметры при запросе базы данных , Предположим, что вы запрашиваете базу данных из приложения .NET, тогда вы должны использовать SqlParameter class для подачи параметров SqlCommand для запроса, и все эти операции с одной цитатой будут учтены автоматически. Обычно это предпочтительный метод, поскольку параметры SQL также помогут предотвратить атаки SQL injection.

4

Похоже, вы пытаетесь дублировать функциональность QUOTENAME. Эта встроенная функция может использоваться для добавления разделителей и правильного исключения разделителей внутри строк и распознает как одиночные ', так и двойные " цитаты в качестве разделителей, а также скобки [ и ].

+0

QUOTENAME предназначен для идентификаторов T-SQL. К сожалению, не подходит для данных. – Suncat2000

0

Я думаю, что это самый короткий SQL заявление для этого:

CREATE FUNCTION [dbo].[fn_stripsingleQuote] (@strStrip varchar(Max)) 
    RETURNS varchar(Max) 
AS 
BEGIN  
    RETURN (Replace(@strStrip ,'''','')) 
END 

Я надеюсь, что это помогает!

0

Если вы не используете одну цитату с другой отдельной цитатой (например, она не для одного из моих недавних запросов REPLACE()), вы можете использовать SET QUOTED_IDENTIFIER OFF перед вашим запросом, затем SET QUOTED_IDENTIFIER ON после.

Например

SET QUOTED_IDENTIFIER OFF; 

UPDATE TABLE SET NAME = REPLACE(NAME, "'S", "S"); 

SET QUOTED_IDENTIFIER OFF; 
+0

Похоже, что OP не понимает, почему включение одной кавычки внутри одиночных кавычек не работает. Изменение способа идентификации идентификаторов вряд ли поможет исправить это. Кроме того, этот вопрос составляет 3 года ... –

+0

ОП сказал, что целью его функции было заменить одну цитату. Мое решение действительно является действительным подходом к этой функции. Кроме того, если другие пользователи считают, что ответы на этот вопрос не помогают с REPLACE(), как и в моем случае, это решение действительно может быть полезно. Короче говоря, мой ответ может быть полезен другим, если не обязательно OP. И какова разница в возрасте вопроса, если он полезен для сообщества? –

1

Вы можете использовать символ (39)

insert into my_table values('hi, my name'+char(39)+'s tim.') 
1

Я побежал в странную аномалию, которая будет применяться здесь. Используя API Google и получая ответ в формате XML, он не смог преобразовать в тип данных XML из-за одинарных кавычек.

Заменить (@Strip, '' '', '')

не работает, потому что единственная цитата символов ASCII 146 вместо 39. Так что я использовал:

Заменить (@Strip, char (146), '')

, который также работает для обычных одинарных кавычек char (39) и любого другого специального символа.

+0

Нет символа ASCII 146. Расширенный ASCII определяет другие символы, например, некоторые международные символы, графику и символы. 'char (146)' соответствует латинице Æ в этом наборе символов. Если это выражение работает, оно не соответствует чему-либо, что имеет смысл. – Suncat2000

Смежные вопросы