2013-04-30 13 views
15

OK, quindi devo questa riga di codice in una ricerca stored procedure:Un modo più elegante di sfuggire all'SQL dinamico?

SET @where = 'job_code = ''' + REPLACE(@job_code, '''', '''''') + '''' 

e ci sono fondamentalmente due operazioni che vorrei semplificare - il primo essere che circonda il valore concatenato tra apici . Ovviamente, nella dichiarazione di cui sopra, sto sfuggire un ' usando due '' e poi terminare la stringa con un ' così posso concatenare il valore effettivo. Deve esserci un modo migliore!

Il secondo delle operazioni sarebbe il REPLACE(@job_code, '''', '''''') in cui sono in grado di sfuggire le singole virgolette che potrebbero esistere nel campo.

Non c'è un modo molto più elegante di scrivere questa riga di codice nel suo complesso?

Ho pensato che fosse la parola chiave ESCAPE ma che è strettamente legata alla dichiarazione LIKE, quindi non andare lì.

+0

Avete considerato di passare direttamente come variabile al vostro SQL dinamico invece di concatenarlo? So che andare con il valore di hardcoded è migliore per evitare problemi di snifing dei parametri, ma a seconda del carico di lavoro questa potrebbe essere un'opzione più semplice. –

+0

@ Love2Learn, non è qualcosa che ho considerato, ma dopo averci pensato sono abbastanza sicuro di volerne evitare perché voglio mantenere la procedura memorizzata in modo che possa essere utilizzata da qualsiasi utente. Aggiungere quel tipo di ipotesi renderebbe più difficile mantenerlo consumabile. –

+3

L'uso di una variabile per '' lo renderà leggermente più leggibile, ma non è un miglioramento enorme. –

risposta

26

Non sono sicuro di come si esegue la query SQL, se si utilizza sp_executesql , potrebbe essere qualcosa di simile

EXECUTE sp_executesql 
      N'SELECT * FROM YouTable WHERE job_code = @job_code', 
      N'@job_code varchar(100)', 
      @job_code = @job_code; 
+0

Ora questa è un'opzione interessante, perché gestisce un paio di scenari interessanti. Posso scrivere il mio SQL per gestire i valori 'nullo' molto più facilmente in questo modo, ci sono meno diramazioni quando si tratta di istruzioni' if', e allo stesso tempo non devo sfuggire a nulla. Interessante amico mio! –

+2

+1: Questa è la soluzione che stavo immaginando e la cosa bella è che puoi popolare @job_code in qualsiasi modo tu voglia senza preoccuparti di fuggire. –

+4

I bonus aggiunti ti consentono di riutilizzare il piano e ridurre il numero di cache del piano. – StrayCatDBA

2

Si potrebbe dichiarare costanti:

declare @SQ as char(1) = '''' 

SET @where = 'job_code = ' + @SQ + REPLACE(@job_code, @SQ, @SQ + @SQ) + @SQ 
+0

+1 per una soluzione che non avevo ancora considerato.Non sono sicuro di volerlo fare in questo modo, perché non sono sicuro che sia meglio (** parlando personalmente **) di quello che sto usando ora -ma quanto meno un +1! –

+0

Sì, non so se lo farei anch'io - ancora non è così facile da leggere, ma è un'opzione. –

+0

Scusa se sembro severo, ma questo è un rossetto su un maiale. La risposta di ErikZ è la soluzione più pulita ed è il modo in cui MS intende generare SQL dinamico, anche in SQL Server 2000. http://msdn.microsoft.com/en-us/library/aa172445%28v=sql.80% 29.aspx – DeanOC

2

è possibile definire una funzione che gestisce gli scenari tipici, qualcosa di simile:

create function WrapAndReplaceQuotes (@input as varchar(max)) 
returns varchar(max) 
as 
begin 
    return '''' + replace(@input, '''', '''''') + '''' 
end 

SET @where = 'job_code = ' + WrapAndReplaceQuotes(@job_code) 
+0

Ciò renderebbe sicuramente l'istruzione 'SET' molto più elegante, lasciatemi considerare questo per un po '. –

5

La risposta query con parametri è prob abilmente la vera "risposta giusta", ma per rispondere alla tua domanda iniziale, quello che vuoi è QUOTENAME(). Più in particolare, la versione single-citazione:

SET @where = 'job_code = ' + QUOTENAME(@job_code, '''') 

si noti il ​​limite di lunghezza su questo (ingresso è un sysname, che significa 128 caratteri), anche se, come si intende citare i nomi di oggetti di database e non come un meccanismo generale.

Problemi correlati