Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

sp_executesql con l'istruzione 'IN'

Il motivo per cui non funziona è perché @P1 viene trattato come un unico valore.

per esempio. quando @Code è X101, B202, la query viene semplicemente eseguita come:SELECT * FROM Table WHERE RegionCode IN ('X101, B202') Quindi, sta cercando un RegionCode con il valore contenuto con @P1. Anche quando includi virgolette singole, tutto ciò significa che il valore che cerca in RegionCode dovrebbe contenere quelle virgolette singole.

Dovresti effettivamente concatenare la variabile @Code nel testo del comando @Cmd sql affinché funzioni nel modo in cui stai pensando:

SET @Code = '''X101'',''B202'''
SET @Cmd = 'SELECT * FROM Table WHERE RegionCode IN (' + @Code + ')'
EXECUTE (@Cmd)

Ovviamente, però, questo ti apre solo all'iniezione di SQL, quindi dovresti stare molto attento se hai adottato questo approccio per assicurarti di proteggerti da quello.

Esistono modi alternativi per affrontare questa situazione in cui si desidera passare un elenco dinamico di valori da cercare.

Dai un'occhiata agli esempi su il mio blog per 2 approcci che potresti usare con SQL Server 2005. Uno prevede il passaggio di un elenco CSV nel modulo "Valore1, Valore2, Valore3" che poi suddividi in una variabile TABLE usando una funzione definita dall'utente (ci sono molte menzioni di questo approccio se fai una rapida ricerca su Google o su questo sito). Una volta diviso, quindi unisci quella TABLE var alla tua query principale. Il secondo approccio consiste nel passare un BLOB XML contenente i valori e utilizzare la funzionalità XML incorporata di SQL Server. Entrambi questi approcci sono dimostrati con le metriche delle prestazioni in quel collegamento e non richiedono SQL dinamico.

Se stavi utilizzando SQL Server 2008, Table Value Parameters sarebbe la strada da percorrere:questo è il terzo approccio che mostro in quel collegamento che risulta migliore.