Метод ограничения Sql возвращает ложное значение

У меня проблема с методом ограничений в sql.

Это моя таблица

CREATE TABLE [relations].[CompoundKey_Contacts](
    [compoundId] [varchar](32) NOT NULL,
    [companyId] [varchar](32) NULL,
    [personId] [varchar](32) NULL,
    [contactInfoId] [varchar](32) NOT NULL)

Когда вы добавляете строку в эту таблицу, она должна проверить, что эта комбинация персоны и компании еще не существует в таблице. Для этого я использую функцию ограничения

Ограничение

ALTER TABLE [relations].[CompoundKey_Contacts]  WITH NOCHECK ADD  CONSTRAINT [CK_CompoundKey_Contacts] CHECK  (([relations].[doesThisCompoundKeyExist]([personId],[companyId])='NO'))
GO

ALTER TABLE [relations].[CompoundKey_Contacts] CHECK CONSTRAINT [CK_CompoundKey_Contacts]
GO

Функция

CREATE function [relations].[doesThisCompoundKeyExist](
    @personId varchar(32),
    @companyId varchar(32)
)
returns varchar(3)
as
begin
    declare @exists varchar(32)

    if(@companyId is null and @personId is null)
      set @exists = 'YES'
    else if(@personId is null)
        if exists(select compoundId from relations.CompoundKey_Contacts where personId is null AND companyId = @companyId)
            set @exists = 'YES' 'This is where to code enters, but it should come to the else and return 'NO'
        else
            set @exists = 'NO'
    else if(@companyId is null)
        if exists(select compoundId from relations.CompoundKey_Contacts where personId = @personId AND companyId is null)
            set @exists = 'YES'
        else
            set @exists = 'NO'
    else if exists(
        select compoundId from relations.CompoundKey_Contacts where personId = @personId AND companyId = @companyId
        )
        set @exists = 'YES'
    else
        set @exists = 'NO'
    return @exists
end;

Мой оператор вставки, который не работает

insert into relations.CompoundKey_Contacts (companyId, contactInfoId, personId, compoundId) values ('COM-000015945', 'INF-000144406', null, 'CPK-000000067');

Проблема в следующем. Когда я запускаю вставку в таблицу с уникальной вставкой, она все равно не работает. Я, конечно, проверил, что она действительно уникальна с помощью оператора select. И вот тут начинается самое интересное. Когда я отлаживаю его и проверяю, где он не работает, и вырываю эту часть кода и запускаю ее без функции, она ведет себя так, как должна, поэтому следующий код работает, если он не запущен в функции

if exists(select compoundId from relations.CompoundKey_Contacts where personId is null AND companyId = 'COM-000015945')
                print 'YES'
            else
                print 'NO' 'Returns NO as it should.

Вот сообщение об ошибке, которое я получаю

The INSERT statement conflicted with the CHECK constraint "CK_CompoundKey_Contacts". The conflict occurred in database "domas", table "relations.CompoundKey_Contacts".
The statement has been terminated.

Я запускаю это на Sql Server 2012 и Sql Server 'DENALI' CTP3

0
задан Deduplicator 6 September 2015 в 19:06
поделиться