Problema con un ciclo while e cursore

giovedì 19 marzo 2009 - 11.52

perla0279 Profilo | Senior Member

Quanto mi piacerebbe essere brava con sql ............. invece ho appena iniziato e ci perdo un sacco di tempo
:-(


Uso sql 2005

Devo costruirmi una stringa di valori..........
vi faccio un esempio :

select slave from gt_vw_master_slave
WHERE master = '751312'

Mi torna questo
Master Slave Master2 i
751312 742439 742439 S
751312 751358 751358 S
751312 751359 751359 S

dovrei crearmi una stringa che dalla select indicata mi crei questa:
742439 - 751358 - 751359

Cioè una stringa contenente tutti gli slave trovati dato un determinato codice master.



Io ho provato a scrivere stà schifezza............ che non funziona

Declare @S as nvarchar (50)
Declare @M as nvarchar (50)

Declare @Aggiorna as nvarchar (max)

DECLARE curs CURSOR FOR
SELECT master, slave
FROM gt_vw_master_slave
WHERE master = '751312'

OPEN curs
FETCH curs into @M , @S

WHILE @@FETCH_STATUS = 0
BEGIN

if exists (select slave from #pippo where slave = @S)
print 0;

else
Declare @slave as nvarchar (max)
select @slave = slave from #pippo
set @Slave = @slave + ' - ' + @S
--print @aggiorna
--print @s
update #pippo set slave = @slave
--insert into #pippo (slave) values (@aggiorna)


FETCH NEXT FROM curs
INTO @aggiorna , @S
END

CLOSE curs
DEALLOCATE curs

select * from #pippo

drop table #pippo

alx_81 Profilo | Guru

>Cioè una stringa contenente tutti gli slave trovati dato un determinato
>codice master.
Evitando i cursori ti allego un esempio al volo:

CREATE TABLE #MasterSlave ( IDMaster int , IDSlave int ) GO INSERT INTO #MasterSlave (IDMaster, IDSlave) VALUES (1,1) INSERT INTO #MasterSlave (IDMaster, IDSlave) VALUES (1,2) INSERT INTO #MasterSlave (IDMaster, IDSlave) VALUES (1,3) INSERT INTO #MasterSlave (IDMaster, IDSlave) VALUES (2,1) INSERT INTO #MasterSlave (IDMaster, IDSlave) VALUES (2,2) INSERT INTO #MasterSlave (IDMaster, IDSlave) VALUES (3,1) GO declare @stringa varchar(MAX) select @stringa = COALESCE(@stringa, '') + CAST(IDSlave AS varchar(10)) + ',' from #MasterSlave where IDMaster = 1 SET @stringa = LEFT(@stringa,LEN(@stringa)-1) SELECT @stringa DROP TABLE #MasterSlave GO

Ciao!
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

perla0279 Profilo | Senior Member

Ho provato come mi hai postato tu:

CREATE TABLE #MasterSlave
(
IDMaster int
, IDSlave int
)
GO

INSERT INTO #MasterSlave (IDMaster, IDSlave)
select master, slave from gt_vw_master_slave WHERE master = '751312'
GO

declare @stringa varchar(MAX)

select @stringa = COALESCE(@stringa, '') + CAST(IDSlave AS varchar(10)) + ','
from #MasterSlave
where IDMaster = 1

SET @stringa = LEFT(@stringa,LEN(@stringa)-1)

SELECT @stringa


--DROP TABLE #MasterSlave

dentro la tabella ho i valori coretti:
751312 742439
751312 751358
751312 751359

ma poi la select @stringa mi torna un campo NULL, capitava anche con il cursore incasinattisimo che avevo fatto io.

Preferisco molto questo metodo, molto più veloce ma il non capisco perchè mi torna il valore vuoto

alx_81 Profilo | Guru

>ma poi la select @stringa mi torna un campo NULL, capitava anche
>con il cursore incasinattisimo che avevo fatto io.
facciamo così, postami il risultato della select come insert e la create della tabella, così posso provare il caso reale, ok?

>Preferisco molto questo metodo, molto più veloce ma il non capisco
>perchè mi torna il valore vuoto
Ma soprattutto, lascia perdere i cursori

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

perla0279 Profilo | Senior Member

allora vediamo se ho capito bene:

Tabella origine dati ti posto un create, poi sotto ti ho riportato i dati:
CREATE TABLE [dbo].[gt_vw_master_slave](
[master] [nvarchar](6) NULL,
[slave] [nvarchar](6) NULL,
[master2] [nvarchar](6) NULL,
[varauto] [nvarchar](1) NULL
) ON [PRIMARY]



CREATE TABLE #MasterSlave
(
IDMaster int
, IDSlave int
)

Va bene una provissoria perchè devo creare una funzione che crea il giro per ogni codice master.

Farò l'insert per ogni codice, ce ne sono alcuni che ne hanno 1 , 2 , 3 o addiruttura 0
Ho Riportato un esempio che ne ha 3 uno dei più complessi.

INSERT INTO #MasterSlave (IDMaster, IDSlave)
select master, slave from gt_vw_master_slave WHERE master = '751312'

Tabella origine :
Maser Slave Master2 I
751312 742439 742439 S
751312 751358 751358 S
751312 751359 751359 S

Inserisco con l'inser questi valori:
IDmaster Idslave
751312 742439
751312 751358
751312 751359

Questo è un caso reale con dati veri dati.
Spero ti sia sufficiente le informazioni postate altrimenti chiedi che integro i dati mancanti .........

alx_81 Profilo | Guru

>allora vediamo se ho capito bene:
>Questo è un caso reale con dati veri dati.
ok, tira via dal tuo codice WHERE master = 1
e poi, per le parole chiave (come proprio master) usa le [] per racchiudere i nomi:

SELECT [master], slave from Tabella

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

perla0279 Profilo | Senior Member



Diciamo
1° Che so proprio sema
come ho fatto a non accorgermi del where........... sono stata tutto il giorno a lavorare su questa procedura che è lunghissima e complicatissima.... ormai sono fusa

2° sono entusiasta del fatto che si possa fare senza creare un cursore.... ci ho pensato tanto e alla fine non avevo trovato altra alternativa ............
invece così è molto più veloce ed anche più leggibile :-)


grazie mille
spero di diventare presto brava anch'io come voi

alx_81 Profilo | Guru

>invece così è molto più veloce ed anche più leggibile :-)
e i cursori NO, MAI, a meno che non siano l'unicissima e l'ultimissima soluzione..

>grazie mille
>spero di diventare presto brava anch'io come voi
ma sì dai, come me ci vuole poco.. Studia i Books On Line e usa sql server tanto e approfonditamente
PS: Accetta la risposta così chiudiamo il thread

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
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