Replace in sql

martedì 03 luglio 2007 - 10.50

trinity Profilo | Guru

Salve ragazzi,
io ho creato una stored in sql server 2005 che mi effettua una select su un campo string.
In questo campo però possono esserci dei nomi con l'apice e pertanto quando eseguo questa stored in vb mi esce l'errore.
Dovrei inserire un replace tipo replace(nomecampo," ' "," ' ' ") o almeno in vb faccio così
E' possibile farlo in una stored sql?

Secondo è possibile aggiornare le stored senza dover ripristinare il database visto che in quest'ultimo sono presenti dei dati nelle tabelle?
Se si come posso fare?

Ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

lbenaglia Profilo | Guru

>io ho creato una stored in sql server 2005 che mi effettua una
>select su un campo string.
>In questo campo però possono esserci dei nomi con l'apice e pertanto
>quando eseguo questa stored in vb mi esce l'errore.
>Dovrei inserire un replace tipo replace(nomecampo," ' "," ' '
>") o almeno in vb faccio così
>E' possibile farlo in una stored sql?
Puoi fare un esempio?
Se la query è parametrica non è necessario raddoppiare gli apici.

>Secondo è possibile aggiornare le stored senza dover ripristinare
>il database visto che in quest'ultimo sono presenti dei dati
>nelle tabelle?
>Se si come posso fare?
ALTER PROCEDURE....

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

trinity Profilo | Guru

io devo replace sulla colonna comune di questa select:

ALTER PROCEDURE [dbo].[GetComune] ( @Comune Varchar(250)=NULL ) AS BEGIN IF @Comune IS NULL OR LEN(@Comune) = 0 SELECT codcomune,comune,prov FROM dbo.Comuni WHERE 1 = 0 ELSE SELECT codcomune,comune,prov FROM dbo.Comuni WHERE comune LIKE @Comune + N'%' END


cioè nel senso che nella colonna comune del database c'è un nome " L'AQUILA " utilizzando il codice sopra descritto in quale punto devo fare il replace?

Ciao

Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

lbenaglia Profilo | Guru

>cioè nel senso che nella colonna comune del database c'è un nome
>" L'AQUILA " utilizzando il codice sopra descritto in quale punto
>devo fare il replace?
Non devi farlo.
Inoltre non ho capito per quale motivo hai specificato che il carattere '%' debba essere UNICODE dato che i data type del parametro @Comune e della colonna Comune sono varchar.
Osserva il seguente esempio:

USE tempdb; CREATE TABLE dbo.Comuni( codcomune int NOT NULL PRIMARY KEY, comune varchar(25) NOT NULL, prov char(2) NOT NULL ); INSERT dbo.Comuni VALUES(1, 'Milano', 'MI'); INSERT dbo.Comuni VALUES(2, 'Roma', 'RM'); INSERT dbo.Comuni VALUES(3, 'Cava de'' Tirreni', 'SA'); GO CREATE PROCEDURE dbo.up_GetComune( @Comune varchar(25) = NULL ) AS IF @Comune IS NULL OR LEN(@Comune) = 0 SELECT codcomune,comune,prov FROM dbo.Comuni WHERE 1 = 0 ELSE SELECT codcomune,comune,prov FROM dbo.Comuni WHERE comune LIKE @Comune + '%' GO EXEC dbo.up_GetComune; /* Output: codcomune comune prov ----------- ------------------------- ---- (0 row(s) affected) */ EXEC dbo.up_GetComune 'Milano'; /* Output: codcomune comune prov ----------- ------------------------- ---- 1 Milano MI (1 row(s) affected) */ EXEC dbo.up_GetComune 'Cava de'' Tirreni'; /* Output: codcomune comune prov ----------- ------------------------- ---- 3 Cava de' Tirreni SA (1 row(s) affected) */ EXEC dbo.up_GetComune 'Cava de'; /* Output: codcomune comune prov ----------- ------------------------- ---- 3 Cava de' Tirreni SA (1 row(s) affected) */ EXEC dbo.up_GetComune 'Cava de'''; /* Output: codcomune comune prov ----------- ------------------------- ---- 3 Cava de' Tirreni SA (1 row(s) affected) */ DROP PROCEDURE dbo.up_GetComune; DROP TABLE dbo.Comuni;

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

trinity Profilo | Guru

>>cioè nel senso che nella colonna comune del database c'è un nome
>>" L'AQUILA " utilizzando il codice sopra descritto in quale punto
>>devo fare il replace?
>Non devi farlo.
>Inoltre non ho capito per quale motivo hai specificato che il
>carattere '%' debba essere UNICODE dato che i data type del parametro
>@Comune e della colonna Comune sono varchar.
>Osserva il seguente esempio:
>
>USE tempdb;
>
>CREATE TABLE dbo.Comuni(
>codcomune int NOT NULL PRIMARY KEY,
>comune varchar(25) NOT NULL,
>prov char(2) NOT NULL
>);
>

ok ma ci sono anche record di questo tipo

>INSERT dbo.Comuni VALUES(1, 'Milano', 'MI');
>INSERT dbo.Comuni VALUES(2, 'Roma', 'RM');
>INSERT dbo.Comuni VALUES(3, 'Cava de'' Tirreni', 'SA');
INSERT dbo.Comuni VALUES(4, 'L'Aquila', 'LT');

in questo caso se dovessi prendere l'aquila con la stored non mi funziona perchè c'è l'apice dopo la lettera L, e poi non ho capito il discorso dell % non devo metterla?

>GO
>
>CREATE PROCEDURE dbo.up_GetComune(
>@Comune varchar(25) = NULL
>)
>AS
>IF @Comune IS NULL OR LEN(@Comune) = 0
> SELECT codcomune,comune,prov
> FROM dbo.Comuni
> WHERE 1 = 0
>ELSE
> SELECT codcomune,comune,prov
> FROM dbo.Comuni
> WHERE comune LIKE @Comune + '%'
>GO
>
>EXEC dbo.up_GetComune;
>
>/* Output:
>
>codcomune comune prov
>----------- ------------------------- ----
>
>(0 row(s) affected)
>
>*/
>
>EXEC dbo.up_GetComune 'Milano';
>
>/* Output:
>
>codcomune comune prov
>----------- ------------------------- ----
>1 Milano MI
>
>(1 row(s) affected)
>
>*/
>
>EXEC dbo.up_GetComune 'Cava de'' Tirreni';
>
>/* Output:
>
>codcomune comune prov
>----------- ------------------------- ----
>3 Cava de' Tirreni SA
>
>(1 row(s) affected)
>
>*/
>
>EXEC dbo.up_GetComune 'Cava de';
>
>/* Output:
>
>codcomune comune prov
>----------- ------------------------- ----
>3 Cava de' Tirreni SA
>
>(1 row(s) affected)
>
>*/
>
>EXEC dbo.up_GetComune 'Cava de''';
>
>/* Output:
>
>codcomune comune prov
>----------- ------------------------- ----
>3 Cava de' Tirreni SA
>
>(1 row(s) affected)
>
>*/
>
>DROP PROCEDURE dbo.up_GetComune;
>DROP TABLE dbo.Comuni;
>
>Ciao!

la modifica devo farla sulla stored non posso farla sul codice vb della mia applicazione
>--
>Lorenzo Benaglia
>Microsoft MVP - SQL Server
>http://blogs.dotnethell.it/lorenzo/
>http://italy.mvps.org

Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

lbenaglia Profilo | Guru

>ok ma ci sono anche record di questo tipo
>
>>INSERT dbo.Comuni VALUES(1, 'Milano', 'MI');
>>INSERT dbo.Comuni VALUES(2, 'Roma', 'RM');
>>INSERT dbo.Comuni VALUES(3, 'Cava de'' Tirreni', 'SA');
>INSERT dbo.Comuni VALUES(4, 'L'Aquila', 'LT');

Mi spieghi che differenza c'è tra le ultime 2 righe?!
(tra l'altro la tua è sbagliata dato che devi raddoppiare l'apice in fase di insert...)

>in questo caso se dovessi prendere l'aquila con la stored non
>mi funziona perchè c'è l'apice dopo la lettera L
Ti funziona eccome!

>, e poi non ho
>capito il discorso dell % non devo metterla?
Non devi mettere la N di UNICODE.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

trinity Profilo | Guru

ho cambiato così:


ALTER PROCEDURE [dbo].[GetComune]
(
@Comune Varchar(250)=NULL
)
AS
BEGIN
IF @Comune IS NULL OR LEN(@Comune) = 0
SELECT codcomune,comune,prov
FROM dbo.Comuni
WHERE 1 = 0
ELSE
SELECT codcomune,comune,prov
FROM dbo.Comuni
WHERE comune LIKE @Comune + '%'
END

quando eseguo la stored in sql server management 2005 per fare il test eseguo questo:
EXECUTE @RC = [c59onlineFR].[dbo].[GetComune]
@Comune='L'AQUILA'

mi da errore..ho scritto così perchè nella winform la gente per la ricerca scrive l'aquila e pertanto ho simulato un esempio reale

invece se scrivo così:

EXECUTE @RC = [c59onlineFR].[dbo].[GetComune]
@Comune='L''AQUILA'

mi funziona ma il problema è che nella windows form io passo il valore L'AQUILA e non posso modificare il codice sorgente ecco perchè volevo fare il replace nella stored perchè modificando ques'ultima mi aggiorna tutti i programmi in automatico dei miei clienti.

Ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

lbenaglia Profilo | Guru

>quando eseguo la stored in sql server management 2005 per fare
>il test eseguo questo:
>EXECUTE @RC = [c59onlineFR].[dbo].[GetComune]
> @Comune='L'AQUILA'
>
>mi da errore..ho scritto così perchè nella winform la gente per
>la ricerca scrive l'aquila e pertanto ho simulato un esempio
>reale

L'errore è nella winform dato che per richiamare una sp parametrica dovresti utilizzare l'oggetto sqlCommand specificando ogni singolo parametro.
Ora se proprio non puoi/vuoi apportare quella modifica, devi eseguire il raddoppio dell'apice LATO CLIENT nella tua winform!!

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

trinity Profilo | Guru

Hai ragione allora modifico la winform

senti un'ultima cosa molto importante.
Sempre in questa stored:

ALTER PROCEDURE [dbo].[GetComune]
(
@Comune Varchar(250)=NULL
)
AS
BEGIN
IF @Comune IS NULL OR LEN(@Comune) = 0
SELECT codcomune,comune,prov
FROM dbo.Comuni
WHERE 1 = 0
ELSE
SELECT codcomune,comune,prov
FROM dbo.Comuni
WHERE comune LIKE @Comune + '%'
END

può capitare che nel mio database dei comuni ci siano comuni che hanno lo stesso nome ma provincia diversa, a questo punto io dovrei fare in modo che se digitano un comune e nell'archivio c'è solo 1 allora mi deve uscire un solo risultato, mentre se ce ne sono due mi deve riportare due risultati in modo tale da far uscire nella winform una finestra e far scegliere al cliente quale comune deve scegliere.

esempio supponiamo che abbiamo i seguenti dati:

INSERT dbo.Comuni VALUES(1, 'Milano', 'MI');
INSERT dbo.Comuni VALUES(2, 'CROTONE', 'CZ');
INSERT dbo.Comuni VALUES(3, 'CROTONE', 'KR');

allora se un utente digita Milano in automatico nel campo della provincia apparirà MI in quanto c'è un solo record ed è corretto,
nel caso in cui dovesse digitare Crotone la stored dovrebbe rilevare che ci sono due record con nome Crotone pertanto avendo 2 record io gestirei il tutto con una finestra che farebbe visualizzare i due record e poi l'operatore sceglierebbe il giusto comune.

Si può fare e se si come?

Ciao

Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

lbenaglia Profilo | Guru

>allora se un utente digita Milano in automatico nel campo della
>provincia apparirà MI in quanto c'è un solo record ed è corretto,
>nel caso in cui dovesse digitare Crotone la stored dovrebbe rilevare
>che ci sono due record con nome Crotone pertanto avendo 2 record
>io gestirei il tutto con una finestra che farebbe visualizzare
>i due record e poi l'operatore sceglierebbe il giusto comune.
>
>Si può fare e se si come?

La stored procedure eseguirà una normalissima SELECT, quindi avrai un result set di 0, 1 o più righe (a proposito per quale motivo fai la prima SELECT con WHERE 1 = 0? ).
Lato client questo result set verrà inserito in un oggetto Recordset che puoi ciclare in un normalissimo ciclo:

Do Until rs.EOF ' Elaboro la riga corrente ... ' Mi sposto sulla riga successiva rs.MoveNext Loop

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

trinity Profilo | Guru

>>allora se un utente digita Milano in automatico nel campo della
>>provincia apparirà MI in quanto c'è un solo record ed è corretto,
>>nel caso in cui dovesse digitare Crotone la stored dovrebbe rilevare
>>che ci sono due record con nome Crotone pertanto avendo 2 record
>>io gestirei il tutto con una finestra che farebbe visualizzare
>>i due record e poi l'operatore sceglierebbe il giusto comune.
>>
>>Si può fare e se si come?
>
>La stored procedure eseguirà una normalissima SELECT, quindi
>avrai un result set di 0, 1 o più righe (a proposito per quale
>motivo fai la prima SELECT con WHERE 1 = 0? ).

perchè potrei toglierlo e quindi togliere anche la where?
>Lato client questo result set verrà inserito in un oggetto Recordset
>che puoi ciclare in un normalissimo ciclo:
>
>Do Until rs.EOF
> ' Elaboro la riga corrente
> ...
>
> ' Mi sposto sulla riga successiva
> rs.MoveNext
>Loop
>
>Ciao!
>--
>Lorenzo Benaglia
>Microsoft MVP - SQL Server
>http://blogs.dotnethell.it/lorenzo/
>http://italy.mvps.org

Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

lbenaglia Profilo | Guru

>perchè potrei toglierlo e quindi togliere anche la where?
Io direi di si se non ti serve avere un Recordset di 0 righe
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org
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