Eu não acho que é possível fazer isso declarativamente.
Se todas as inserções forem garantidas para passar pelo procedimento armazenado e o SaleValue não for atualizado uma vez inserido, o seguinte deve funcionar (criei nomes de tabelas e colunas, pois não foram fornecidos na pergunta inicial)
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
O
HOLDLOCK
fornece semântica serializável e bloqueia todo o intervalo correspondente ao TransactionId
e o UPDLOCK
impede que duas transações simultâneas bloqueiem o mesmo intervalo, reduzindo assim o risco de deadlocks. Um índice em
TransactionId,SaleValue
seria melhor para apoiar esta consulta.