2009-09-17 74 views
34

Tengo esta función en SQL Server para reemplazar comillas simples.Reemplazar comillas simples en SQL Server

Pero cuando inserto una comilla simple que arroja un error en 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 

Respuesta

81

Es necesario duplicar sus comillas simples de la siguiente manera:

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

. Estoy enfrentando el mismo problema pero usando su técnica obtengo ** 'error de sintaxis, inesperado '' '' (T_CONSTANT_ENCAPSED_STRING) '** –

0

La creación de bandas/reemplazo/scaping de comillas simples de la entrada del usuario (input sanitation), se tiene que hacer antes el SQL declaración llega a la base de datos.

+0

También se puede hacer en las inserciones, por lo que el administrador no está solo en el dba –

+0

, esto implica que las aplicaciones abiertas a inyección sql están bien. No estoy de acuerdo con esta implicación. –

+0

¿Qué sucede si el codificador que interactúa con la instancia del servidor intenta crear deliberadamente un ataque de inyección SQL? También debería haber alguna validación/sanitización en el extremo de T-SQL/base de datos, especialmente para procs almacenados como lo implica @JohnDhom – mpag

19

Trate REPLACE(@strip,'''','')

SQL utiliza dos citas para representar una en una cadena.

1

Intenta escapar de la comilla simple con una sola frase:

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

Además de necesitar para escapar de la cita (utilizando comillas dobles), también ha confundido los nombres de las variables: está utilizando @var y @strip, en lugar de @CleanString y @strStrip ...

13

Si realmente debe quitar completamente el singl e cita se puede hacer esto:

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

Sin embargo, normalmente se habría reemplazar 'con '' y esto hará que feliz de SQL Server cuando se consulta la base de datos. El truco con cualquiera de las funciones SQL incorporadas (como reemplazar) es que también requieren que dupliques tus comillas simples.

Así reemplazar 'con '' en el código que haría esto:

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

... Por supuesto, en algunas situaciones puede evitar tener que hacer esto en su totalidad si se utiliza parámetros cuando se consulta la base de datos . Digamos que está consultando la base de datos desde una aplicación .NET, luego usaría el SqlParameter class para alimentar los parámetros de SqlCommand para la consulta y todo este negocio de presupuesto único se encargará automáticamente. Este suele ser el método preferido, ya que los parámetros de SQL también ayudarán a prevenir los ataques SQL injection.

4

Parece que está intentando duplicar la funcionalidad QUOTENAME. Esta función incorporada se puede usar para agregar delimitadores y delimitadores de escape dentro de cadenas y reconoce las comillas simples ' y dobles " como delimitadores, así como los corchetes [ y ].

+0

QUOTENAME es para identificadores T-SQL. Desafortunadamente no es apropiado para los datos. – Suncat2000

0

Creo que esta es la instrucción SQL más corto para que:

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

espero que esto ayude!

0

Si el hecho de evitar el presupuesto único con otro presupuesto no funciona para usted (como no sucedió en una de mis consultas REEMPLAZARSE recientemente), puede usar SET QUOTED_IDENTIFIER OFF antes de su consulta, luego ESTABLECER QUOTED_IDENTIFIER ON después.

Por ejemplo

SET QUOTED_IDENTIFIER OFF; 

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

SET QUOTED_IDENTIFIER OFF; 
+0

Parece que el OP no entiende por qué poner una sola comilla dentro de comillas simples no funciona. Cambiar el modo en que se citan los identificadores es poco probable que lo solucione. Además, esta pregunta tiene 3 años ... –

+0

El OP dijo que el propósito de su función era reemplazar una sola cita. Mi solución es de hecho un enfoque válido para esa función. Además, si otros usuarios consideran que las respuestas a esta pregunta no ayudan con REPLACE(), como en mi caso, esta solución puede ser útil. En resumen, mi respuesta puede ser útil para otros, si no necesariamente para el OP. ¿Y qué diferencia tiene la edad de una pregunta si es útil para la comunidad? –

1

Se puede usar carbón (39)

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

me encontré con una extraña anomalía que se aplicaría aquí. Al utilizar la API de Google y obtener la respuesta en formato XML, no se pudo convertir al tipo de datos XML debido a comillas simples.

Reemplazar (@Strip, '' '', '')

no estaba funcionando debido a la comilla simple era el carácter ASCII 146 en lugar de 39. Así que utilicé:

Reemplazar (@Strip, char (146), '')

que también funciona para comillas simples comunes char (39) y cualquier otro carácter especial.

+0

No hay carácter ASCII 146. ASCII extendido define otros caracteres, como algunos caracteres internacionales, gráficos y símbolos. 'char (146)' corresponde a un latín Æ en ese juego de caracteres. Si esa expresión funciona, no corresponde a nada que tenga sentido. – Suncat2000

Cuestiones relacionadas