Discussione:
Sostuituire l'ultimo carattere di una stringa
(troppo vecchio per rispondere)
Nina
2006-05-26 09:25:21 UTC
Permalink
Ciao a tutti,
grazie alla ricerca su questo ng ho impostato una funzione che mi
restituisce i valori di un campo in diversi record come un'unica stringa. La
funzione è la seguente:

ALTER Function ufn_Autori(@IdRisorsa int)
RETURNS Varchar(8000) as
BEGIN
DECLARE @Out Varchar(8000)
DECLARE @lenAutori as varchar(8000)
SET @OUT=''
SELECT @Out=@Out+Convert(Varchar(255),Isnull(Autore,0))+'; '
FROM AutoriRisorse Inner Join Autori On
AutoriRisorse.IdAutore=Autori.IdAutore
WHERE IdRisorsa=@IdRisorsa
set @lenAutori = len(@out)
return @Out + @lenAutori
END

A questo punto vorrei sostituire l'ultimo punto e virgola della stringa (se
presente, cioè se la stringa non ha lunghezza zero) con un punto
es: "minnie; pippo; pluto;" vorrei che diventasse "minnie; pippo; pluto."
Ho provato con le funzioni stringa che conosco (vba), ma anche quando hanno
una corrispondenza in sqlServer, non riesco ad applicarle.

Qualcuno può darmi una mano?

Grazie mille
Ciao
--
Nina
AlessandroD
2006-05-26 09:39:59 UTC
Permalink
Post by Nina
[...]
Ho provato con le funzioni stringa che conosco (vba), ma anche quando hanno
una corrispondenza in sqlServer, non riesco ad applicarle.
Invece di sostituire l'ultimo ; con un . puoi vederla come prendere tutti i
caratteri eccetto l'ultimo (usando quindi la funzione left()) e poi
concatenarci il .
Otterrai lo stesso risultato con il vantaggio che è più facile da
implementare, tu stessa già calcoli ora la lunghezza della stringa che hai
composto, quindi fare una left usando quel valore - 1 è una cosa
praticamente già scritta.
Post by Nina
Qualcuno può darmi una mano?
Puoi spiegare la return della tua funzione? Perché concateni la stringa con
la sua lunghezza?
Ciao, Alessandro
Nina
2006-05-26 09:54:23 UTC
Permalink
Post by AlessandroD
Post by Nina
[...]
Ho provato con le funzioni stringa che conosco (vba), ma anche quando
hanno
Post by Nina
una corrispondenza in sqlServer, non riesco ad applicarle.
Invece di sostituire l'ultimo ; con un . puoi vederla come prendere tutti i
caratteri eccetto l'ultimo (usando quindi la funzione left()) e poi
concatenarci il .
Otterrai lo stesso risultato con il vantaggio che è più facile da
implementare, tu stessa già calcoli ora la lunghezza della stringa che hai
composto, quindi fare una left usando quel valore - 1 è una cosa
praticamente già scritta.
Post by Nina
Qualcuno può darmi una mano?
Puoi spiegare la return della tua funzione? Perché concateni la stringa con
la sua lunghezza?
Ciao, Alessandro
Scusa, ho inviato il codice su cui già stavo facendo delle prove, senza
ripulirlo a dovere.
Avevo già provato la soluzione che tu proponi, ma quando inserisco nel
codice la parte:
SET @out= left(@out, @lenAutori-1) mi da errore se @lenAutori è zero
(giustamente!)
Non riesco ad inserire la funzione Iif o anche l'If, perchè continua a darmi
errore di sintassi. Comunque riprovo

Grazie mille

Ciao

Nina
AlessandroD
2006-05-26 10:04:46 UTC
Permalink
Post by Nina
[...]
Avevo già provato la soluzione che tu proponi, ma quando inserisco nel
(giustamente!)
Non riesco ad inserire la funzione Iif o anche l'If, perchè continua a darmi
errore di sintassi. Comunque riprovo
Mhh, forse stai facendo confusione con la sintassi VBA e quella T-SQL, i due
costrutti IF sono diversi.
In T-SQL te la cavi con un veloce:
IF @lenAutori > 0 SET @out= left(@out, @lenAutori-1)

Ciao, Alessandro
Nina
2006-05-26 10:14:17 UTC
Permalink
Post by AlessandroD
Post by Nina
[...]
Avevo già provato la soluzione che tu proponi, ma quando inserisco nel
(giustamente!)
Non riesco ad inserire la funzione Iif o anche l'If, perchè continua a
darmi
Post by Nina
errore di sintassi. Comunque riprovo
Mhh, forse stai facendo confusione con la sintassi VBA e quella T-SQL,
Si, è vero, faccio un pò di confusione, dopo anni di utilizzo del VBA e del
QBE di Access :), però cerco di aiutarmi con la guida e sto cercando di
usare il più possibile Query Analizer anziché creare query con interfaccia
grafica (ma che fatica!).
Post by AlessandroD
i due costrutti IF sono diversi.
Ebbene sì, continuavo ad inserire il Then, che poi ho eliminato, ma
aggiungevo l'end finale e mi dava errore.
Ho utilizzato alla fine la formula di Marcello, ma mi hai dato un grande
aiuto anche tu
Post by AlessandroD
Ciao, Alessandro
Ciao e grazie ancora

Nina

Marcello
2006-05-26 09:42:00 UTC
Permalink
Post by Nina
Ciao a tutti,
Ciao Nina,
Post by Nina
grazie alla ricerca su questo ng ho impostato una funzione che mi
restituisce i valori di un campo in diversi record come un'unica stringa. La
funzione è la seguente: [CUT]
A questo punto vorrei sostituire l'ultimo punto e virgola della stringa (se
presente, cioè se la stringa non ha lunghezza zero) con un punto
es: "minnie; pippo; pluto;" vorrei che diventasse "minnie; pippo; pluto."
Ho provato con le funzioni stringa che conosco (vba), ma anche quando hanno
una corrispondenza in sqlServer, non riesco ad applicarle.
Sui BOL ll voce "fFunzioni per i valori stringa" trovi tutte le funzioni
ordinate, dagli un occhio.

nel tuo caso potresti fare un cosa del tipo:
left(@x,len(@x)-1)+'.'

che però potrebbe richiedere controlli sui valori nulli o vuoti. In
alternativa potresti giocare a monte con i valori nulli, osserva questa
variante della tua funzione:

use tempdb
go
create table Autori(IdAutore int identity,Autore varchar(100))
create table AutoriRisorse(IDRisorsa int,IdAutore int)

insert into Autori values('Pippo')
insert into Autori values('Pluto')
insert into Autori values('Paperino')

insert into AutoriRisorse values(1,1)
insert into AutoriRisorse values(1,2)
insert into AutoriRisorse values(1,3)
go
create Function ufn_Autori(@IdRisorsa int)
RETURNS Varchar(8000) as
BEGIN
DECLARE @Out Varchar(8000)
SELECT @Out=isnull(@Out+';','')+Convert(Varchar(255),Isnull(Autore,0))
FROM AutoriRisorse Inner Join Autori On
AutoriRisorse.IdAutore=Autori.IdAutore
WHERE IdRisorsa=@IdRisorsa
return @Out + '.'
END
go
select dbo.ufn_Autori(1)
go
drop table Autori,AutoriRisorse
drop function ufn_Autori
Post by Nina
Qualcuno può darmi una mano?
Grazie mille
Ciao
marc.
--
Marcello Poletti
Dingo&Epomops
http://www.epomops.it
http://blogs.dotnethell.it/epomops/
Nina
2006-05-26 09:57:47 UTC
Permalink
Post by Marcello
Post by Nina
Ciao a tutti,
Ciao Nina,
CUT
Sui BOL ll voce "fFunzioni per i valori stringa" trovi tutte le funzioni
ordinate, dagli un occhio.
che però potrebbe richiedere controlli sui valori nulli o vuoti. In
alternativa potresti giocare a monte con i valori nulli, osserva questa
use tempdb
go
create table Autori(IdAutore int identity,Autore varchar(100))
create table AutoriRisorse(IDRisorsa int,IdAutore int)
insert into Autori values('Pippo')
insert into Autori values('Pluto')
insert into Autori values('Paperino')
insert into AutoriRisorse values(1,1)
insert into AutoriRisorse values(1,2)
insert into AutoriRisorse values(1,3)
go
RETURNS Varchar(8000) as
BEGIN
FROM AutoriRisorse Inner Join Autori On
AutoriRisorse.IdAutore=Autori.IdAutore
END
go
select dbo.ufn_Autori(1)
go
drop table Autori,AutoriRisorse
drop function ufn_Autori
Post by Nina
Qualcuno può darmi una mano?
Grazie mille
Ciao
marc.
--
Marcello Poletti
Dingo&Epomops
http://www.epomops.it
http://blogs.dotnethell.it/epomops/
Grazie Marcello, è proprio ciò che mi serviva.
Ciao

Nina
Loading...