Ciclare dei valori su una tabella senza usare i cursori

venerdì 09 novembre 2007 - 13.56

M@LKAV Profilo | Junior Member

PARDON STO PARLANDO DI SQLSERVER 2005 dimenticato di mettere nel titolo




Ciao a tuti ho un piccolo problema!!

Ho la necessita di ciclare i dati di una select prendere il volore delle righe una alla volta e fare un operazione!!!

Diciamo il classico

For Each!!!

Vorrei evitare di usare i cursori
1. mi fanno sclerare
2. non riesco a farlo funzionare nel senso che invece di restituirmi i due (al max 10 righe) della mia select mi tira fuori record infiniti

Accetto qualsiasi consiglio aiuto .... se ce da sacrificare qualcosa o qualcuno ditelo....!! Non ce la faccio piu e unas ettimana che ci sto dietro!!!

Scleri a parte scrivo l'esempio!!

SELECT * FROM CLIENTI WHERE NAME = @NAME

per ogni riga che tira fuori devo buttare il valore di name in un altra tabella


AIIIIIUTTTTOOOO!!!!!!

Grazie
Malkav

lbenaglia Profilo | Guru

>Scleri a parte scrivo l'esempio!!
>
>SELECT * FROM CLIENTI WHERE NAME = @NAME
>
>per ogni riga che tira fuori devo buttare il valore di name in
>un altra tabella

Ciao Malkav,

cosa intendi con "il valore di name"?!
Posta i comandi DDL delle tabelle (CREATE TABLE), alcune righe di prova (INSERT INTO) ed il risultato che vuoi ottenere.

>Grazie
Prego.

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

M@LKAV Profilo | Junior Member

ok ti posto un po nello specifico quello che ho e che devo ottenere


Tabella Clienti
CLIENT_ID varchr(16)
NAME varchar(16) NOTNULL
SURNAME varchar(16) NOTNULL
STATUS (1) NOTNULL


"Gli status possibili sono solamente due O (open) L (locked)

Tabella ILLOGINS
LOGIN_ID varchar(16) = e il client_id della tabella CLIENTI
PSW varchar(16)
STATUS varchar(1)


queste sono le tabelle che devo usare.

La stored che devo creare deve prendere tutti i clienti dalla tabella CLIENTI con status = L

e per ogni CLIENT_ID che trova aggiornare lo stato sulla TABELLA ILLOGINS

quindi

ALTER PROCEDURE [dbo].[ALLINEA_CLIENTI]

AS
BEGIN

select * from clienti where status = 'L'

/*per ogni riga che trova deve AGGIORNARE il campo status della TABELLA ILLOGINS dove il CLIENT_ID = LOGIN_ID*/
/*e qua mi perdo..-........*/



end


Teech Profilo | Expert

Puoi fare un join fra la tabella Clienti e quella ILLOGINS e con un'unica query di UPDATE riesci ad aggiornare tutti i dati senza bisogno di ciclarli...
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

M@LKAV Profilo | Junior Member

??????

puoi spiegarti meglio???


ok le metto in join e poi???

alx_81 Profilo | Guru

>??????
>
>puoi spiegarti meglio???
>
>
>ok le metto in join e poi???
quello che Teech sta dicendo, e trovo che sia la soluzione migliore è di utilizzare la sintassi della UPDATE FROM. Ti allego un esempio per farti vedere come funziona:
USE tempdb; GO CREATE TABLE Clienti ( Client_ID int IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED, [Name] varchar(30) NOT NULL, Surname varchar(30) NOT NULL, [Status] char(1) NOT NULL ) GO CREATE TABLE ILLogins ( Login_ID varchar(16) NOT NULL PRIMARY KEY CLUSTERED, Psw varchar(16) NOT NULL, [Status] char(1) NOT NULL ) GO -- popolamento dati di prova INSERT Clienti SELECT 'Alessandro', 'Alpi', 'O' INSERT Clienti SELECT 'Mike', 'Denny', 'L' INSERT Clienti SELECT 'Matteo', 'Celaschi', 'L' INSERT Clienti SELECT 'Marco', 'Rossi', 'O' INSERT Clienti SELECT 'Daniele', 'Zanella', 'L' GO INSERT ILLogins SELECT 1, 'psw1', 'O' INSERT ILLogins SELECT 2, 'psw2', 'O' INSERT ILLogins SELECT 3, 'psw3', 'O' INSERT ILLogins SELECT 4, 'psw4', 'O' INSERT ILLogins SELECT 5, 'psw5', 'O' GO SELECT * FROM Clienti ORDER BY Client_ID SELECT * FROM ILLogins ORDER BY Login_ID -- eseguo l'aggiornamento UPDATE L SET [Status] = C.[Status] FROM ILLogins L JOIN Clienti C ON C.Client_ID = L.Login_ID WHERE C.[Status] = 'L' SELECT * FROM ILLogins ORDER BY Login_ID -- disalloco DROP TABLE Clienti DROP TABLE ILLogins GO

Come puoi vedere alla fine la tabella ILLogins ha il campo status aggiornato in base alla join

Alx81 =)

http://blogs.dotnethell.it/suxstellino
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-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5