Controllo prima di un insert

giovedì 31 agosto 2006 - 13.52

bluland Profilo | Guru

salve,

Ho la seguente tabella

CREATE TABLE [tabella1] (
[id] [decimal](18, 0) IDENTITY (1, 1) NOT FOR REPLICATION NOT NULL ,
[In_Order] [nvarchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[Out_Order] [nvarchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
CONSTRAINT [PK_tabella1] PRIMARY KEY CLUSTERED
(
[id]
) ON [PRIMARY]
) ON [PRIMARY]
GO

al momento che faccio un nuovo inserimento di dati vorrei controllare se il record che inserisco e' gia esistente negli ultimi 5 inserimenti, se e' gia presente mi dovrebbe restituire un valore che me lo fa capire (per un eventuale possibilita di inserirlo comunque lato applicazione).

idee?

Saluti
ENzo

lbenaglia Profilo | Guru

>al momento che faccio un nuovo inserimento di dati vorrei controllare
>se il record che inserisco e' gia esistente negli ultimi 5 inserimenti,
>se e' gia presente mi dovrebbe restituire un valore che me lo
>fa capire (per un eventuale possibilita di inserirlo comunque
>lato applicazione).
>
>idee?

Si, non ho capito niente
Cosa significa "già esistente negli ultimi 5 inserimenti"?
Che significa "se e' gia presente mi dovrebbe restituire un valore che me lo fa capire"? Che valore vuoi?
Che significa "(per un eventuale possibilita di inserirlo comunque lato applicazione)"?

Prepara un esempio completo di dati (istruzioni di INSERT) e spiega in modo MOLTO più dettagliato che risultati vuoi ottenere.

Ciao!

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

bluland Profilo | Guru

>Si, non ho capito niente

1.

>Cosa significa "già esistente negli ultimi 5 inserimenti"?

2. cioe' vado a fare il confronto con gli ultimi 5 inserimenti

>Che significa "se e' gia presente mi dovrebbe restituire un valore che me lo fa capire"? Che valore vuoi?

3. nel caso il confronto risultasse positivo, vorrei ricevere un valore tipo 1 o altro di modo da capire che e' gia presente il record che stavo inserendo.

>Che significa "(per un eventuale possibilita di inserirlo comunque lato applicazione)"?

4. una volta ricevuto il valore o il messaggio al punto 3. vorrei gestirlo in qualche modo!, ma forse questo gia' lo posso fare poiche nel momento che l'inserimento non e' avvenuto avro' numero di righe affect 0.

>Prepara un esempio completo di dati (istruzioni di INSERT) e spiega in modo MOLTO più dettagliato che risultati vuoi ottenere.
5.

CREATE TABLE [tabella1] (
[id] [decimal](18, 0) IDENTITY (1, 1) NOT FOR REPLICATION NOT NULL ,
[In_Order] [nvarchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[Out_Order] [nvarchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
CONSTRAINT [PK_tabella1] PRIMARY KEY CLUSTERED
(
[id]
) ON [PRIMARY]
) ON [PRIMARY]
GO

INSERT INTO [IAIA].[dbo].[Tabella1]([In_Order], [Out_Order])
VALUES(58362,'395260')


SELECT *
FROM dbo.Tabella1
WHERE [ID]
BETWEEN (SELECT MAX([ID]-4)
FROM dbo.Tabella1)
AND
(SELECT MAX([ID])
FROM dbo.Tabella1)



(1 row(s) affected)

id In_order Out_order
-------------------- -------------------------------------------------- ------
280 31322 323222
281 31322 323200
282 38322 393200
283 68322 393260
284 58362 395260

(5 row(s) affected)



ora se faccio quest'altro insert:

INSERT INTO [IAIA].[dbo].[Tabella1]([In_Order], [Out_Order])
VALUES(31322 ,'323222')

UGUALE A id 280

vorrei che mi scattasse l'evento che mi restituisse (forse un flag), un qualcosa che mi fa capire che gia' esiste un record simile, magari poi da applicativo posso decidere di inserirlo o meno comunque.


saluti

Enzo

ps fammi sapere se sono stato chiaro

lbenaglia Profilo | Guru

>vorrei che mi scattasse l'evento che mi restituisse (forse un
>flag), un qualcosa che mi fa capire che gia' esiste un record
>simile, magari poi da applicativo posso decidere di inserirlo
>o meno comunque.

Enzo,

quando si posta un esempio occorre prima testarlo in modo che sia sintatticamente corretto e che tutti possano ricreare la situazione.
Hai scritto una istruzione di INSERT (tra l'altro errata) ma la SELECT restituisce 5 righe, fai riferimento al db IAIA che noi non abbiamo...

Come effettui l'inserimento? Con un comando di INSERT o con una stored procedure?
Nel primo caso l'ideale sarebbe definire un trigger di INSERT che scateni una eccezione nel caso esista già la riga tra le ultime 5, ma non puoi forzare l'inserimento a meno di disabilitarlo; a questo punto rimane la strada della stored procedure.

USE tempdb; GO CREATE TABLE dbo.Tabella1( [id] decimal(18, 0) IDENTITY NOT NULL , In_Order nvarchar(50) NULL , Out_Order nvarchar(50) NULL , CONSTRAINT PK_tabella1 PRIMARY KEY CLUSTERED ([id]) ); GO INSERT INTO dbo.Tabella1 VALUES('11111', '111111'); INSERT INTO dbo.Tabella1 VALUES('22222', '222222'); INSERT INTO dbo.Tabella1 VALUES('31322', '323222'); INSERT INTO dbo.Tabella1 VALUES('31322', '323200'); INSERT INTO dbo.Tabella1 VALUES('38322', '393200'); INSERT INTO dbo.Tabella1 VALUES('68322', '393260'); INSERT INTO dbo.Tabella1 VALUES('58362', '395260'); GO CREATE PROCEDURE dbo.up_AddRow( @In_Order nvarchar(50), @Out_Order nvarchar(50) ) AS SET NOCOUNT ON; /* Dichiaro una variabile di tipo TABLE ** dove inserirò la riga che vuoi aggiungere */ DECLARE @NewRow TABLE( In_Order nvarchar(50) NULL , Out_Order nvarchar(50) NULL ); /* Popolo la tabella */ INSERT @NewRow VALUES(@In_Order, @Out_Order); SET NOCOUNT OFF; /* Controllo */ IF EXISTS( SELECT * FROM @NewRow AS NR JOIN ( SELECT TOP 5 In_Order, Out_Order FROM dbo.tabella1 ORDER BY [id] DESC ) AS T ON NR.In_Order = T.In_Order AND NR.Out_Order = T.Out_Order ) -- Esiste RETURN 1 ELSE BEGIN -- Non esiste INSERT INTO dbo.Tabella1 VALUES(@In_Order, @Out_Order) RETURN 0 END GO /* Provo ad inserire un valore non valido */ DECLARE @RC int; EXEC @RC = dbo.up_AddRow '31322', '323222'; SELECT @RC AS Esito; GO /* Output: Esito ----------- 1 (1 row(s) affected) */ /* Provo ad inserire un valore valido */ DECLARE @RC int; EXEC @RC = dbo.up_AddRow '33333', '333333'; SELECT @RC AS Esito; GO /* Output: (1 row(s) affected) Esito ----------- 0 (1 row(s) affected) */ /* Verifica */ SELECT * FROM dbo.Tabella1; GO /* Output: id In_Order Out_Order ---- --------- ---------- 1 11111 111111 2 22222 222222 3 31322 323222 4 31322 323200 5 38322 393200 6 68322 393260 7 58362 395260 8 33333 333333 (8 row(s) affected) */ /* Pulizia */ DROP PROCEDURE dbo.up_AddRow; DROP TABLE dbo.Tabella1;

Ciao!

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

bluland Profilo | Guru

>quando si posta un esempio occorre prima testarlo in modo che sia sintatticamente corretto e che tutti possano >ricreare la situazione.
>Hai scritto una istruzione di INSERT (tra l'altro errata) ma la SELECT restituisce 5 righe, fai riferimento al db IAIA che >noi non abbiamo...

HAI ragione la prossima volta saro' + preciso

grazie funziona benissimo!!

nella tua stored procedure controlli i primi 5 ma se volessi controllare gli ultimi 5 faccio :

WHERE [ID]
BETWEEN (SELECT MAX([ID]-4)
FROM dbo.OSM_Ord)
AND
(SELECT MAX([ID])
FROM dbo.OSM_Ord)

inoltre ma se controllassi tutti i record ad ogni inserimento, calcolando che vengono fatti tipo 200 inserimenti al giorno prestazionalmente inciderebbe molto? che ne dici secondo te fino a che quantita' di record conviene che io faccia il controllo??

saluti e grazie ancora

Enzo

lbenaglia Profilo | Guru

>nella tua stored procedure controlli i primi 5 ma se volessi
>controllare gli ultimi 5 faccio :
Controllo gli ultimi (ORDER BY...DESC).

>inoltre ma se controllassi tutti i record ad ogni inserimento,
>calcolando che vengono fatti tipo 200 inserimenti al giorno prestazionalmente
>inciderebbe molto?
200 inserimenti al giorno sono il nulla

>che ne dici secondo te fino a che quantita'
>di record conviene che io faccia il controllo??
Questo lo sai solo tu e dipende dalle esigenze che hai.

>saluti e grazie ancora
Prego.

Ciao!

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org
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