Sottoquery

mercoledì 30 maggio 2007 - 10.28

erongis Profilo | Junior Member

Salve a tutti, ho questo problemino. Vorrei inserire un record in una tavola dove il campo codice è un long progressivo senza identità: insomma non voglio usare il contatore automatico, ma voglio controllarlo di persona.
Ho pensato di scrivere la query da inserimento in questo modo:
"INSERT INTO fatture
(numReg,Anno,Dataregistrazione, Cliente,....)
VALUES
((SELECT MAX(numreg) + 1 FROM fatture),@Anno,@DataRegistrazione,@Codcli,........ ) "

l'SQL mi diche che non è consentito eseguire sottoquery del genere in questo contesto o una cosa simile.
Sapete perchè? E soprattutto sapete come fare per evitare il rischio di numeri doppi, visto che con ADO.NET non si può più bloccare la tabella?

Grazie

alx_81 Profilo | Guru

>Salve a tutti,
Ciao

>ho questo problemino. Vorrei inserire un record
>in una tavola dove il campo codice è un long progressivo senza
>identità: insomma non voglio usare il contatore automatico, ma
>voglio controllarlo di persona.
>Ho pensato di scrivere la query da inserimento in questo modo:
>"INSERT INTO fatture
>(numReg,Anno,Dataregistrazione, Cliente,....)
>VALUES
>((SELECT MAX(numreg) + 1 FROM fatture),@Anno,@DataRegistrazione,@Codcli,........
>) "
>
>l'SQL mi diche che non è consentito eseguire sottoquery del genere
>in questo contesto o una cosa simile.
Se utilizzi SQL Server, puoi scrivere una stored procedure che al suo interno fa la insert del record come ti serve. Qui di seguito un esempio:

USE tempdb; -- tabella di prova CREATE TABLE Fatture ( IDFattura bigint NOT NULL, Data datetime NOT NULL, CONSTRAINT PK_Fatture PRIMARY KEY CLUSTERED ( IDFattura ) ) GO -- stored procedure per la gestione dell'inserimento CREATE PROCEDURE InsertFatture @Data datetime AS BEGIN SET NOCOUNT ON; -- ricavo il massimo record già inserito DECLARE @IDFattura bigint SELECT @IDFattura = COALESCE(MAX(IDFattura),0) + 1 FROM Fatture -- inserisco i dati INSERT INTO Fatture (IDFattura, Data) VALUES (@IDFattura, @Data) END GO -- eseguo la stored procedure EXEC InsertFatture '20070525 10:30' EXEC InsertFatture '20070527 12:30' EXEC InsertFatture '20070530 15:30' -- record inseriti SELECT IDFattura, Data FROM Fatture -- pulizia DROP TABLE Fatture; DROP PROCEDURE InsertFatture

A questo punto, una volta creata sul tuo database la stored procedure, da asp.net è sufficiente richiamarla e passarle i parametri.
Nell'esempio ho messo solamente la data.. ovviamente mancano tutte le tue info, prendilo come un esempio da cui prendere spunto se dovesse tornarti utile.
Ciao!

Alx81 =)

http://blogs.dotnethell.it/suxstellino

erongis Profilo | Junior Member

Grazie, ma il mio problema è che non sono sicuro che nell'azienda il db non venga modificato e con esso, anche le stored procedures. Non c'è possibilità di farlo passandogli un comando direttamente dal codice dell'applicazione sul client?

alx_81 Profilo | Guru

>Grazie, ma il mio problema è che non sono sicuro che nell'azienda
>il db non venga modificato e con esso, anche le stored procedures.
>Non c'è possibilità di farlo passandogli un comando direttamente
>dal codice dell'applicazione sul client?
Allora, premetto che non sono d'accordo sul fatto di usare codice dall'applicazione.. e poi comunque le query vengono eseguite lato server.. non lato client e il codice vb o c# che produci è rigorosamente lato server.
Se devi proprio farlo, basta replicare il codice della stored procedure sul tuo comando.. nulla di più.. solo che il tipo del comando è Text, non StoredProcedure. Vedi tu..

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