Chevauchement, résultats inattenddus

Copper Contributor

Salut à tous,
je possède une table dans laquelle on se doit d'éviter les chevauchements d'intervalles de longueur [start,End] dans des trous spécifiques.
la trigger de contrôle est bien écrit et compris par sql server 2019 toutefois je me rends compte qu'il est impossible d'ajouter des données car il signale des chevauchements inexistants.
Afin d'être rassuré, j'ai recréé la table sous postgresql en insérant une contrainte de non overlapping ( CONSTRAINT "Overlappling_Check" EXCLUDE USING gist (
HoleID WITH =,
numrange("mFrom", "mTo") WITH &&) et il n'y a absoulment pas de chevauchement.
J'aimerais vraiment trouver une solution car je galère sur le sujet depuis une semaine. ci dessous la fonction et la table.

CREATE TABLE MyTable(

HoleID varchar(20),
mFrom numerci(5,2),
mTo numeric(5,2),
CONSTRAINT PK_MyTable PRIMARY KEY (HoleID, mFrom)
);


CREATE TRIGGER trg_CheckOverlap
ON MyTable
AFTER INSERT, UPDATE
AS

 IF NOT EXISTS (
SELECT 1
FROM Sakassou.DHGeology as g
INNER JOIN inserted as i
ON g.HoleID = i.HoleID
WHERE
(i.mFrom <= g.mTo AND i.mTo >= g.mFrom)
BEGIN
-- No overlap detected, the insertion/update is valid
RETURN;
END
-- Overlap detected, raise an error
DECLARE @ErrorMessage NVARCHAR(1000) = 'Chevauchement détecté. L''insertion/mise à jour est annulée.';
DECLARE @ErrorSeverity INT = 16;
DECLARE @ErrorState INT = 50000;
SELECT @ErrorMessage = 'Chevauchement détecté pour les champs HoleID: ' + i.HoleID
+ ', mFrom: ' + CONVERT(NVARCHAR(20), i.mFrom)
+ ', mTo: ' + CONVERT(NVARCHAR(20), i.mTo)
FROM inserted as i
WHERE EXISTS (
SELECT 1
FROM Sakassou.DHGeology as g
INNER JOIN inserted as i
ON g.HoleID = i.HoleID
WHERE
(i.mFrom <= g.mTo AND i.mTo >= g.mFrom)
);
THROW @ErrorState, @ErrorMessage, @ErrorSeverity;
ROLLBACK TRANSACTION;
END;

 

Pour l'insertion de mes données voici le script utilisé.

INSERT INTO MyTable (HoleID, mFrom, mTo) SELECT HoleID, mFrom, mTo FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;Database=D:\Test.xlsx', 'SELECT HoleID, mFrom,mTo FROM [Test$]') ORDER BY HoleID, mFrom;


et comme j'ai dit plus haut et après correction du trigger tel que tu me l'as suggéré, le message d'erreur est
Msg 50000, Level 16, State 16, Procedure trg_DHGeology_CheckOverlap, Line 33 [Batch Start Line 31]
Chevauchement détecté pour les champs HoleID: BERC-001, mFrom: 0.00, mTo: 1.00

0 Replies