INSERTED
является таблицей, поэтому может содержать более одной строки, что означает, что этот код
SELECT @Cloturer=Cloturer, @Exercice=Exercice, @Numero=Numero, @IdBranche=IdBranche
FROM INSERTED
по существу неверен.
UDF не лучший выбор для наборана основе программирования и может привести к снижению производительности.В частности, этот UDF не имеет абсолютно никакого смысла и не имеет смысла инкапсулировать этот код в отдельный модуль.Это тривиальный код EXISTS
.
Вся функция может и должна быть заменена на оператор EXISTS
, весь код триггера может выглядеть следующим образом:
IF EXISTS(
SELECT 1
FROM INSERTED
INNER JOIN ...
WHERE ...
)
BEGIN
RAISERROR(...)
END
I'mЯ не уверен, в чем смысл ваших таблиц и столбцов, но я предполагаю, что вы пытаетесь проверить уникальность.Итак, при условии, что вам не нужна еще одна Mandat
запись для того же CategorieNumero
, окончательный EXISTS может выглядеть следующим образом:
IF EXISTS(
SELECT 1
FROM INSERTED i
INNER JOIN Branch b on b.IdBranche = i.IdBranch
-- other branches with the same CategorieNumero; why isn't CategorieNumero unique?
INNER JOIN Branch b_dup on b_dup.CategorieNumero = b.CategorieNumero
-- existing Mandat rows for the same CategorieNumero with any IdBranch
INNER JOIN Mandat m_dup on m_dup = b_dup.IdBranch
-- ensure you're not comparing inserted/updated Mandat row to itself
WHERE i.ID != m_dup.ID
)
...
Но ваше намерение мне неясно, и я думаю, что после разъяснениябольшинство ваших потребностей будут легко удовлетворены уникальными ограничениями .
Если вам не нужно более одной строки для каждого набора (Exercice, Numero, IdBranch)
- просто добавьте уникальное ограничение в таблицу Mandat
и удалите и триггер, и функцию!
Нетриггеры чрезмерного использования.И UDFs.