Newsgroup: it.comp.software.database
Titolo: ciclo in stored procedure sql server

ciao a tutti, sono nuova di questo newsgroup....ho un problema da
sottoporvi!!!!
devo creare una stored procedure che fa questo:
-select materiali from [tabella] where codice=3
poiche' il codice non e' in chiave primaria univoca mi ritornano piu'
record che hanno lo stesso codice!!!!
devo scorrere i record trovati e creare una stringa che mi prenda il
materiale del primo record + il materiale del secondo record + il
materiale del terzo record ecc.........
come posso fare il ciclo che mi scorre i record trovati dalla select??
grazie a tutti e buon lavoro
--------------------------------
Inviato via 
http://usenet.libero.it

 come posso fare il ciclo che mi scorre i record trovati dalla select??
Ciao Kika,
se la select e' molto semplice puoi fare semplicemente
una cosa simile a questa:
-- CUT HERE --
USE pubs
GO
DECLARE @ListaAutori varchar(8000)
SET @ListaAutori = ''
SELECT @ListaAutori = @ListaAutori +
  au_lname
FROM dbo.authors
PRINT @ListaAutori
-- CUT HERE --
Se la select inizia ad essere piu' complessa possono
verificarsi problemi (risultati completamente sbagliati).
Dai un occhiata a questo demo:
-- CUT HERE --
/*
** (aggregate concatenation)
** esempi di concatenazione automatica di stringhe in variabili
** locali, pratica non supportata e spesso imprevedibile
**
** problema documentato nel documento della KB Q287515
** 
http://support.microsoft.com/default.aspx?scid=kb;EN-US;q287515
** in realta' il documento fa' riferimento solo all'utilizzo
** di clausole ORDER BY
*/
/*
** preparazione dati di test
*/
USE tempdb
GO
IF OBJECT_ID('dbo.test') IS NOT NULL DROP TABLE dbo.test
GO
CREATE TABLE dbo.test(
 col1 char(2)
)
GO
INSERT dbo.test VALUES('aa')
INSERT dbo.test VALUES('cc')
INSERT dbo.test VALUES('bb')
GO
/*
** concatenazione di stringhe, risultato corretto
*/
DECLARE @concat varchar(10)
SET @concat = 'xx'
SELECT @concat = @concat + col1
FROM dbo.test
SELECT @concat
GO
/*
** concatenazione di stringhe con clausola ORDER BY e funzione
** UPPER. risultato previsto xxaabbcc risultato reale ...
*/
DECLARE @concat varchar(10)
SET @concat = 'xx'
SELECT @concat = @concat + col1
FROM dbo.test
ORDER BY
 UPPER(col1)
SELECT @concat
GO
/*
** Altro esempio con tabella authors, concatenazione corretta
** senza ORDER BY UPPER(...)
*/
DECLARE @AuthorsList varchar(8000)
SET @AuthorsList = ''
SELECT @AuthorsList = @AuthorsList
 + au_lname + ', '
FROM pubs.dbo.authors
PRINT @AuthorsList
GO
/*
** Concatenazione errata con ORDER BY UPPER(...)
*/
DECLARE @AuthorsList varchar(8000)
SET @AuthorsList = ''
SELECT @AuthorsList = @AuthorsList
 + au_lname + ', '
FROM pubs.dbo.authors
ORDER BY
 UPPER(au_lname)
PRINT @AuthorsList
GO
/*
** Esempio 3
*/
-- corretto
DECLARE @x varchar( 8000 ),
 @i int
SET @x = ''
SELECT @x = @x + au_id + ','
FROM pubs.dbo.authors
PRINT @x
GO
--errato
DECLARE @x varchar( 8000 ),
 @i int
SET @x = ''
SELECT @x = @x + au_id + ','
FROM pubs.dbo.authors
ORDER BY
 au_id + ','
PRINT @x
GO
/*
** Esempio 4
*/
-- corretto
DECLARE @x varchar(8000)
SET @x = ''
SELECT @x = @x + table_name + ','
FROM information_schema.columns
PRINT @x
GO
-- errato
DECLARE @x varchar(8000)
SET @x = ''
SELECT DISTINCT
 @x = @x + table_name + ','
FROM information_schema.columns
PRINT @x
GO
/*
** Esempio 5
*/
DECLARE @x varchar(8000)
DECLARE @y varchar(8000)
SET @x = ''
SET @y = ''
SELECT @x = @x + au_id + ',' ,
 @y = @y + LEFT(@x , 1) + ','
FROM pubs.dbo.authors
PRINT @X
PRINT @Y
GO
/*
** Funziona anche per i numerici
*/
DECLARE @PriceSum money
SET @priceSum = 0
SELECT @priceSum = @priceSum +
 UnitPrice
FROM Northwind.dbo.Products
PRINT CAST(@PriceSum AS varchar)
GO
/*
** metodo caonico: per i numeri SUM()
*/
DECLARE @PriceSum money
SELECT @priceSum = SUM(UnitPrice)
FROM Northwind.dbo.Products
PRINT CAST(@PriceSum AS varchar)
GO
/*
** per le stringhe cursore
*/
DECLARE @AuthorsList varchar(8000)
DECLARE @AuthorLName varchar(40)
DECLARE #AuthorsCursor CURSOR FOR
SELECT au_lname
FROM pubs.dbo.authors
ORDER BY
 au_lname
OPEN #AuthorsCursor
FETCH NEXT FROM #AuthorsCursor
INTO @AuthorsList
WHILE @@FETCH_STATUS = 0
BEGIN
 FETCH NEXT FROM #AuthorsCursor
 INTO @AuthorLName
 SET @AuthorsList = @AuthorsList + ', ' + @AuthorLName
END
CLOSE #AuthorsCursor
DEALLOCATE #AuthorsCursor
PRINT @AuthorsList
GO
/*
** oppure tabella temporanea simulando un array
*/
SELECT IDENTITY(int, 1, 1) AS FakeRow,
 au_lname
INTO #Authors
FROM pubs.dbo.authors
ORDER BY
 au_lname
DECLARE @AuthorsList varchar(8000),
 @CurrentAuthor int,
 @MaxAuthorsRow int
SELECT @CurrentAuthor = MIN(FakeRow),
 @MaxAuthorsRow = MAX(FakeRow)
FROM #Authors
SET @AuthorsList = ''
WHILE (@CurrentAuthor <= @MaxAuthorsRow)
BEGIN
 SELECT @AuthorsList = @AuthorsList +
  au_lname + ', '
 FROM #Authors
 WHERE FakeRow = @CurrentAuthor
 SET @CurrentAuthor = @CurrentAuthor +1
END
PRINT @AuthorsList
DROP TABLE #Authors
GO
-- CUT HERE --
Ciao,
--
Gianluca Hotz
Backoffice MVP (SQL Server) MCP SQL Server and MCP Windows
Vice-President of the Italian User Group for SQL Server
Founding Member of the Italian User Group for .NET
http://www.ghotz.com
http://www.ugiss.org

 PRINT @ListaAutori
--------------------------------
Inviato via 
http://usenet.libero.it

 -----------------------------------------------------------
--------------------------------
Inviato via 
http://usenet.libero.it