[onsiglio] sql server e stored procedure con apici

mercoledì 26 novembre 2008 - 20.34

Amodio Profilo | Expert

salve a tutti
avendo una stored procedure in sql server 2005
essa ha 10 parametri che fungono da filtro, essa concatena solo il campo che risulta validato,
il problema è che se nel programma invio un apice nella text, facendo il like nella SP, da errore

dove mi consigliate di gestire gli apici?
nella SP oppure da programma asp.net in modo da duplicarli?
opure esiste un'altro modo di gestire gli apici facendo il LIKE in sql server 2005?

rossimarko Profilo | Guru

Ciao,

come gestisci la select nella stored procedure? E' una query dinamica?
Di solito per fare le like con parametri con apice basta raddoppiare il carattere, ti riporto un esempio:

declare @filtro varchar(10) set @filtro = '''' -- Tabella di prova DECLARE @tmp TABLE (CampoStringa varchar(50)) INSERT INTO @tmp (CampoStringa) VALUES ('pippo') INSERT INTO @tmp (CampoStringa) VALUES ('pluto') INSERT INTO @tmp (CampoStringa) VALUES ('Prova dell''apice') -- Filtro con apice select * from @tmp where CampoStringa like '%' + @filtro + '%'

Tu come passi i parametri alla stored procedure?
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

Amodio Profilo | Expert

man mano che i parametri sono valorizzati li concateno alla stringa SQL:
SET @sSQL1='' SET @sSQL2='' BEGIN SET @sSQL='SELECT TOP ' + @N_QUA_REC + ' * FROM QLST_TRN' SET @sSQL1=' WHERE 1=1' IF NOT @C_COD_STS_TRN IS NULL SET @sSQL1=' AND C_DES_STS_TRN=''' + @C_COD_STS_TRN + '''' IF NOT @N_COD_SMU IS NULL SET @sSQL1=@sSQL1 + ' AND N_COD_SMU=' + convert(varchar (4), @N_COD_SMU) IF NOT @N_COD_PRF IS NULL SET @sSQL1=@sSQL1 + ' AND N_COD_GRP_SMU='+ convert(varchar(20),@N_COD_PRF)

come mi consigli di gestire il tutto?

rossimarko Profilo | Guru

Utilizzi la sp_executesql (http://msdn.microsoft.com/it-it/library/ms175170.aspx) per lanciare la query giusto?

Invece che concatenare tutti i parametri nella stringa, definiscili e poi passa i valori alla sp_executesql quando la esegui. Trovi un esempio anche nella documentazione:

DECLARE @IntVariable INT; DECLARE @SQLString NVARCHAR(500); DECLARE @ParmDefinition NVARCHAR(500); /* Build the SQL string one time. */ SET @SQLString = N'SELECT * FROM AdventureWorks.Sales.Store WHERE SalesPersonID = @SalesID'; /* Specify the parameter format one time. */ SET @ParmDefinition = N'@SalesID int'; /* Execute the string with the first parameter value. */ SET @IntVariable = 275; EXECUTE sp_executesql @SQLString, @ParmDefinition, @SalesID = @IntVariable; /* Execute the same string with the second parameter value. */ SET @IntVariable = 276; EXECUTE sp_executesql @SQLString, @ParmDefinition, @SalesID = @IntVariable;
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

Amodio Profilo | Expert

perfetto grazie dell0aiuto
solo un piccolo problemino: è che i parametri sono tutti facoltativi
quindi come hai notato dal codice iniziale che ho postato faccio tante if

come mi consigli di proseguire?

rossimarko Profilo | Guru

Hai due modi di procedere. Il primo è più lineare ovvero:
- inserisci le condizioni nella query sql solo dove necessario, come stai facendo adesso con gli IF
- definisci tutti i parametri nella stringa di definizione (anche se non saranno usati)
- passi i valori di tutti i parametri alla sp_executesql

Qui un esempio di definizione di un parametro che non viene usato:
DECLARE @IntVariable INT; DECLARE @SQLString NVARCHAR(500); DECLARE @ParmDefinition NVARCHAR(500); /* Build the SQL string one time. */ SET @SQLString = N'SELECT * FROM AdventureWorks.Sales.Store WHERE SalesPersonID = @SalesID'; /* Specify the parameter format one time. */ SET @ParmDefinition = N'@SalesID int, @ParametroProva int'; /* Execute the string with the first parameter value. */ SET @IntVariable = 275; EXECUTE sp_executesql @SQLString, @ParmDefinition, @SalesID = @IntVariable,@ParametroProva = NULL; /* Execute the same string with the second parameter value. */ SET @IntVariable = 276; EXECUTE sp_executesql @SQLString, @ParmDefinition, @SalesID = @IntVariable,@ParametroProva = NULL;

Il secondo modo di procedere consiste nel definire parametri e stringa sql dentro all'if (quindi i parametri definiti saranno solo quelli usati) e poi usare le condizioni sull'if anche per richiamare la sp_executesql, quindi definire tante chiamate quante sono gli if. Questo secondo caso però è un po' meno leggibile.
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

Amodio Profilo | Expert

ciao
mi sono un po perso nel tuo esempio
mi pare che dichiari una sola variabile e gli cambi 2 volte il valore e lo mandi in pasto a EXECUTE sp_executesql

quindi nel tuoi esempio ci sono 2 parametri entrambi facoltativi?

rossimarko Profilo | Guru

Ho semplicemente aggiunto un parametro che poi non viene mai usato, per farti vedere che si può mandare in esecuzione tranquillamente anche con parametri non usati nella query.

Nel tuo caso specifico sarebbe più opportuno fare così:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Quindi con l'if costruisci la query sql, ma poi la definizione dei parametri della sp_executesql rimane comune:
SET @ParmDefinition = N'@SalesID int, @ParametroProva int';
e allo stesso modo l'esecuzione:
EXECUTE sp_executesql @SQLString, @ParmDefinition, @SalesID = @IntVariable,@ParametroProva = @ParametroProvaValore;
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5