2009-09-17 21 views
34

Ho questa funzione in SQL Server per sostituire le virgolette singole.Sostituisci virgolette singole in SQL Server

Ma quando inserisco un apostrofo si genera un errore sulla 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 

risposta

81

È necessario raddoppiare i tuoi virgolette singole come segue:

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

Sto affrontando lo stesso problema ma usando la vostra tecnica ottengo ** 'errore di sintassi, inaspettata '' '' (T_CONSTANT_ENCAPSED_STRING) '** –

0

Lo striping/sostituzione/scaping di singole citazioni da input dell'utente (input sanitation), deve essere fatto prima SQL la dichiarazione raggiunge il database.

+0

si può fare sugli inserti entrava, così l'amministratore non è solo sul dba –

+0

questo implica sprocs aperti a SQL injection sono ok. non sono d'accordo con questa implicazione. –

+0

Che cosa succede se il codificatore che interagisce con l'istanza del server sta cercando di creare deliberatamente un attacco SQL injection? Ci dovrebbe essere un po 'di validazione/igiene fatto sul T-SQL/database di finire così, soprattutto per le stored procedure come sottintende @JohnDhom – mpag

19

Prova REPLACE(@strip,'''','')

SQL utilizza due citazioni a rappresentare uno in una stringa.

1

Prova sfuggire alla sola offerta con una sola citazione:

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

Oltre la necessità di sfuggire alla citazione (utilizzando le virgolette doppie), hai anche confuso i nomi delle variabili: stai usando @var e @strip, invece di @CleanString e @strStrip ...

13

Se davvero devi assolutamente eliminare il singl e cita si può fare questo:

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

Tuttavia, di solito si dovrebbe sostituire 'con '' e questo renderà SQL Server felici quando interrogare il database. Il trucco con una qualsiasi delle funzioni SQL integrate (come la sostituzione) è che anch'essi richiedono di raddoppiare le virgolette singole.

Quindi, per sostituire il 'con '' nel codice faresti questo:

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

Naturalmente ... in alcune situazioni si può evitare di dover fare questo del tutto se si utilizzano i parametri quando interrogare il database . Supponiamo che stai interrogando il database da un'applicazione .NET, quindi utilizzerai lo SqlParameter class per alimentare i parametri SqlCommand per la query e tutta questa attività di preventivo singolo verrà gestita automaticamente. Questo è solitamente il metodo preferito in quanto i parametri SQL aiuteranno anche a prevenire gli attacchi SQL injection.

4

Sembra che tu stia cercando di duplicare la funzionalità QUOTENAME. Questa funzione incorporata può essere utilizzata per aggiungere delimitatori e per evitare correttamente i delimitatori all'interno delle stringhe e riconosce sia le singole ' sia le doppie virgolette " come delimitatori, nonché le parentesi [ e ].

+0

QUOTENAME è per gli identificatori T-SQL. Sfortunatamente non è appropriato per i dati. – Suncat2000

0

penso che questo sia l'istruzione SQL più breve per questo:

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

Spero che questo aiuta!

0

Se l'escape dell'opzione singola con un'altra quota singola non funziona per te (come non è stato per una delle mie query REPLACE() recenti, puoi utilizzare SET QUOTED_IDENTIFIER OFF prima della query, quindi SET QUOTED_IDENTIFIER ON dopo.

Per esempio

SET QUOTED_IDENTIFIER OFF; 

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

SET QUOTED_IDENTIFIER OFF; 
+0

Sembra che l'OP non stia capendo perché non inserire una citazione tra virgolette singole. Cambiare il modo in cui vengono citati gli identificatori è improbabile che risolverlo. Inoltre, questa domanda ha 3 anni ... –

+0

L'OP ha dichiarato che lo scopo della sua funzione era quello di sostituire una singola citazione. La mia soluzione è davvero un approccio valido a quella funzione. Inoltre, se altri utenti riscontrano che le risposte a questa domanda non sono di aiuto con REPLACE(), come nel mio caso, questa soluzione potrebbe essere utile. In breve, la mia risposta potrebbe essere utile per gli altri, se non necessariamente per l'OP. E che differenza fa l'età di una domanda se è utile alla comunità? –

1

Si potrebbe utilizzare char (39)

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

mi sono imbattuto in una strana anomalia che si applica qui. Utilizzando l'API di Google e ottenendo la risposta in formato XML, non riusciva a convertire in tipo di dati XML a causa di virgolette singole.

Sostituire (@Strip, '' '', '')

non funzionava perché il singolo apice era di caratteri ASCII 146 invece di 39. Così ho usato:

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

che funziona anche per le virgolette singole normali char (39) e qualsiasi altro carattere speciale.

+0

Non v'è alcun carattere ASCII 146. ASCII esteso definisce altri personaggi, come alcuni internazionali personaggi, grafica e simboli. 'char (146)' corrisponde ad un latino Æ in quel set di caratteri. Se quell'espressione funziona, non corrisponde a nulla che abbia senso. – Suncat2000

Problemi correlati