Problema con ciclo all'interno di un altro ciclo in sql server

martedì 07 giugno 2005 - 12.46

s_dimaio Profilo | Junior Member

Sto lavorando ad una SP che deve riempire una tabella in queta maniera:

Campo 1..................Campo 2
0...........................0
0...........................1
0...........................2
1...........................0
1...........................1
1...........................2
2...........................0
2...........................1
2...........................2

per farlo ho creato un cliclo con il while in questa maniera:




SET @x = 0
SET @y = 0

WHILE @y <= @assey
BEGIN

WHILE @x <= @assex
BEGIN
INSERT INTO Tabella1 VALUES (@y, @x)
SET @x = @x + 1
END

SET @y = @y + 1
END


dove @assey e @assex sono due variabili int che passo alla mia sp (nell'esempio 2 e 2).

Solo non funziona: fa il secondo ciclo ma ignora il primo. In altre parole il risultato è:

Campo 1..................Campo 2
0...........................0
0...........................1
0...........................2

e si ferma qui. Qualche consiglio?

Ciao e grazie

lbenaglia Profilo | Guru

> Solo non funziona: fa il secondo ciclo ma ignora il primo.

Ciao s_dimaio,

Il tuo codice non è corretto, in quanto dopo il terzo loop nel ciclo più interno, ti dimentichi di azzerare la variabile @x, pertanto ai cicli successivi di quello esterno, non entrerai più in quello interno, e quindi non verrà eseguita l'INSERT.
Per risolvere il problema, ho semplicemente spostato l'inizializzazione a 0 della variabile @x all'interno del ciclo più esterno.


USE tempdb
GO

/* Definisco la tabella dbo.Tabella1 */
CREATE TABLE dbo.Tabella1(
Campo1 int NOT NULL,
Campo2 int NOT NULL
)
GO

/* Definisco la stored procedure dbo.up_FillTable */
CREATE PROCEDURE dbo.up_FillTable(
@assex int,
@assey int
)
AS
DECLARE @x int, @y int

SET @y = 0

WHILE @y <= @assey
BEGIN
SET @x = 0

WHILE @x <= @assex
BEGIN
INSERT INTO Tabella1 VALUES (@y, @x)
SET @x = @x + 1
END

SET @y = @y + 1
END
GO

/* La eseguo */
EXEC dbo.up_FillTable 2, 2
GO

/* Vediamo... */
SELECT *
FROM dbo.Tabella1
GO

/* Output:

Campo1 Campo2
----------- -----------
0 0
0 1
0 2
1 0
1 1
1 2
2 0
2 1
2 2

(9 row(s) affected)

*/

/* Pulizia */
DROP PROCEDURE dbo.up_FillTable
DROP TABLE dbo.Tabella1


Ciao!

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://mvp.support.microsoft.com
http://italy.mvps.org

s_dimaio Profilo | Junior Member

Grandissimo, ora funziona!!! Grazie
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