>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