Je ne pense pas qu'il soit possible de le faire de manière déclarative.
S'il est garanti que toutes les insertions passent par la procédure stockée et que SaleValue n'est pas mise à jour une fois insérée, les éléments suivants devraient fonctionner (j'ai créé des noms de table et de colonne car ils n'étaient pas fournis dans la question initiale)
DECLARE @SumSaleValue MONEY
BEGIN TRAN
SELECT @SumSaleValue = SUM(SaleValue)
FROM dbo.Orders WITH (UPDLOCK, HOLDLOCK)
WHERE TransactionId = @TransactionId
IF @SumSaleValue > 1000
BEGIN
RAISERROR('Cannot do insert as total would exceed order limit',16,1);
ROLLBACK;
RETURN;
END
/*Code for INSERT goes here*/
COMMIT
Le HOLDLOCK
donne une sémantique sérialisable et verrouille toute la plage correspondant au TransactionId
et le UPDLOCK
empêche deux transactions simultanées de verrouiller la même plage, réduisant ainsi le risque de blocages.
Un index sur TransactionId,SaleValue
serait préférable de prendre en charge cette requête.