Strore Procedure Microsoft SQL Server 2005

martedì 20 febbraio 2007 - 10.34

melmar20 Profilo | Junior Member

Ciao a tutti sto utilizzando Microsoft SQL Server 2005 e vorrei creare una procedura che ogni qualvolta viene richiamata mi calcoli il valore massimo di un campo di tipo intero della mia tabella e me lo incrementi di una unità...

è fattibile una cosa simile?

Grazie
Ciao!

alx_81 Profilo | Guru

>Ciao a tutti sto utilizzando Microsoft SQL Server 2005 e vorrei
>creare una procedura che ogni qualvolta viene richiamata mi calcoli
>il valore massimo di un campo di tipo intero della mia tabella
>e me lo incrementi di una unità...
>
>è fattibile una cosa simile?
Io farei una funzione scalare


prendiamo come esempio questa tabella:

IF EXISTS (SELECT * FROM sys.tables WHERE object_id = object_id('Interi')) DROP TABLE Interi CREATE TABLE Interi ( id int, descrizione varchar(15) ) -- popolo la tabella INSERT Interi SELECT 1,'DATO UNO' INSERT Interi SELECT 2,'DATO DUE' INSERT Interi SELECT 5,'DATO TRE' INSERT Interi SELECT 10,'DATO QUATTRO'


poi creiamo la seguente funzione:

CREATE FUNCTION dbo.ufn_TornaValore() RETURNS int AS BEGIN DECLARE @MaxVal int SELECT @MaxVal = ISNULL(MAX(id),0) + 1 FROM Interi RETURN @MaxVal END

infine, per ricavare il massimo id + 1 basta richiamare la funzione:

SELECT dbo.ufn_TornaValore() -- oppure DECLARE @MioVal int SELECT @MioVal = dbo.ufn_TornaValore()
>
>Grazie
Di nulla!
>Ciao!
Ciao!
Alx81 =)

http://blogs.dotnethell.it/suxstellino

melmar20 Profilo | Junior Member

Correggimmi se sbaglio ma nella prima procedura il valore incrementato mi viene restituito,mentre io vorrei incrementarlo e memorizzarlo nel Database....

Faccio un esempio:

Questa è la mia tabella:

CREATE TABLE [dbo].[Tabella](
[ContatoreClick] [int] NOT NULL,
CONSTRAINT [PK_Tabella] PRIMARY KEY CLUSTERED
(
[ContatoreClick] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

ora se inizializzo il campo Contatoreclick a zero vorrei che quando vado a richiamare la funzione mi venga ricavato il valore massimo presente nel campo ContatoreClick (in questo caso o),me lo incrementi e mi scivi in un altro record il valore 1 e così via discorrendo...Non ho bisogno che mi venga restituito il MAX+1


Nella seconda procedura invece avrei bisogno che mi venga restituito il MAX

alx_81 Profilo | Guru

>Correggimmi se sbaglio ma nella prima procedura il valore incrementato
>mi viene restituito,mentre io vorrei incrementarlo e memorizzarlo
>nel Database....
>ora se inizializzo il campo Contatoreclick a zero vorrei che
>quando vado a richiamare la funzione mi venga ricavato il valore
>massimo presente nel campo ContatoreClick (in questo caso o),me
>lo incrementi e mi scivi in un altro record il valore 1 e così
>via discorrendo...Non ho bisogno che mi venga restituito il MAX+1
>
Allora non ti basta fare la insert nella tabella del valore tornato dalla mia funzione?
e sei a posto..
Alx81 =)

http://blogs.dotnethell.it/suxstellino

melmar20 Profilo | Junior Member

declare @cont int

set @cont = (select max(ContatoreClick) from Tabella)

set @cont = @cont +1

ho scritto queste codice dici che può andare bene ugualmente?

alx_81 Profilo | Guru

>declare @cont int
>
>set @cont = (select max(ContatoreClick) from Tabella)
>
>set @cont = @cont +1
>
>ho scritto queste codice dici che può andare bene ugualmente?

Come preferisci.. lo hai messo in una stored procedure?
essendo uno scalare, io direi di usare la mia funzione che fa già tutto..
ma se preferisci una soluzione come questa, vedi tu..
manca però la insert nella tabella..

quindi alla fine con la funzione avevi già tutto pronto.. fai quasi la stessa cosa..

Alx81 =)

http://blogs.dotnethell.it/suxstellino

melmar20 Profilo | Junior Member

Per inserire il volre massimo + 1 nel Database potrei modificare la tua funzione in questa ?

CREATE FUNCTION dbo.InseriscMAx+1()

AS
BEGIN

DECLARE @MaxVal int

SELECT @MaxVal = ISNULL(MAX(id),0) + 1 FROM Interi

Insert into Tabella
Values @MaxVal

END

alx_81 Profilo | Guru

>Per inserire il volre massimo + 1 nel Database potrei modificare
>la tua funzione in questa ?
>
>CREATE FUNCTION dbo.InseriscMAx+1()
Non mettere simboli speciali nel nome

>
>AS
>BEGIN
>
> DECLARE @MaxVal int
>
> SELECT @MaxVal = ISNULL(MAX(id),0) + 1 FROM Interi
>
---------------------------------
> Insert into Tabella
>Values @MaxVal

Magari.. ma dalle funzioni non puoi fare DML, quindi niente insert update delete..
devi fare la insert partendo dalla funzione che già ho illustrato all'inizio..
al massimo, se vuoi, puoi fare una stored che fa la insert passando per la funzione.. come ti ho illustrato all'inizio.

>
>END

Alx81 =)

http://blogs.dotnethell.it/suxstellino

melmar20 Profilo | Junior Member

scusami ma non riesco a capire come faccio a fare l'INSERT nella funzione che mi hai passato

cioè io vorrei creare una Store dove oltre a fare ciò che fà la tua funzione memorizzi il nuovo dato incrementato nella tabella...

alx_81 Profilo | Guru

>scusami ma non riesco a capire come faccio a fare l'INSERT nella
>funzione che mi hai passato
>
>cioè io vorrei creare una Store dove oltre a fare ciò che fà
>la tua funzione memorizzi il nuovo dato incrementato nella tabella...

Esempio:

CREATE PROCEDURE InserisciClick AS BEGIN -- inserisco ricavando il dato dalla funzione INSERT INTO Tabella (ContatoreClick) SELECT dbo.ufn_TornaValore() END

tutto qui

Alx81 =)

http://blogs.dotnethell.it/suxstellino

melmar20 Profilo | Junior Member

Ciao Alx....

per fare eseguire la funzione sql e la procedura associata posso richiamarla da codice scritto in Vb.Net in questo modo? :

Dim objConn As New SqlConnection("StringaDiConnessione") ' apro la connessione objConn.Open() ' questo comando lancia la funzione per l'incremento del MAX valore Dim objCmd As New SqlCommand("NomeFinzione", objConn) objCmd.CommandType = CommandType.StoredProcedure ' questo comando lancia la procedura per l'inserimento del valore MAX+1 Dim objCmd As New SqlCommand("NomeProcedura", objConn) objCmd.CommandType = CommandType.StoredProcedure ' chiudo la connessione (non mi serve più) objConn.Close()

Questo per incrementare il valore Max e poi inserirlo

alx_81 Profilo | Guru

>Ciao Alx....
>
>per fare eseguire la funzione sql e la procedura associata posso
>richiamarla da codice scritto in Vb.Net in questo modo? :

ci stiamo perdendo..
la stored procedure che ti ho passato nel precedente post fa già l'inserimento del MAX + 1..
basta lanciare la stored solamente..
Alx81 =)

http://blogs.dotnethell.it/suxstellino

melmar20 Profilo | Junior Member

ok scusami tanto.....

ho scritto questo:

Dim objConn As New SqlConnection("Stringa di connessione") ' apro la connessione objConn.Open() ' questo comando lancia la procedura per incrementare il contatore Dim objCmd As New SqlCommand("InserisciClick", objConn) objCmd.CommandType = CommandType.StoredProcedure ' chiudo la connessione (non mi serve più) objConn.Close()

però non mi incrementa il contatore....

pensavo fosse perchè alla prima chiamata il campo Contatore fosse null...poi ho visto che nella tua funzione c'è questa istruzione ISNULL(MAX(ContatoreClick),0) quindi non dovrebbe essere per quello...

alx_81 Profilo | Guru

>ok scusami tanto.....
ma di che?

>
>ho scritto questo:
>
>
>
>Dim objConn As New SqlConnection("Stringa di connessione")
>
> ' apro la connessione
> objConn.Open()
>
>' questo comando lancia la procedura per incrementare il contatore
>Dim objCmd As New SqlCommand("InserisciClick", objConn)
>objCmd.CommandType = CommandType.StoredProcedure
>
> ' chiudo la connessione (non mi serve più)
> objConn.Close()
>
>
>
>però non mi incrementa il contatore....
>
>pensavo fosse perchè alla prima chiamata il campo Contatore fosse
>null...poi ho visto che nella tua funzione c'è questa istruzione
>ISNULL(MAX(ContatoreClick),0) quindi non dovrebbe essere per
>quello...
beh.. devi eseguire la stored altrimenti non gira
Aggiungi, dopo l'impostazione del CommandType, questa riga:

objCmd.ExecuteNonQuery()

ciao!
Alx81 =)

http://blogs.dotnethell.it/suxstellino

melmar20 Profilo | Junior Member

Grazie mille veramente....non sò come ringraziarti....

Sei veramente Bravissimo e gentilissimo...

Ciaooo!!

alx_81 Profilo | Guru

>Grazie mille veramente....non sò come ringraziarti....
non preoccuparti.. è un piacere..
>
>Sei veramente Bravissimo e gentilissimo...
grazie..
>
>Ciaooo!!
ciao!

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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5