空值列,不存在T-sql

空值列,不存在T-sql,sql,sql-server-2005,tsql,Sql,Sql Server 2005,Tsql,我正在努力做到以下几点: IF NOT EXISTS ( SELECT * FROM [tbl_web_company] WHERE [name] = @name AND [address1] = @address1 AND [address2] = @addre

我正在努力做到以下几点:

IF NOT EXISTS ( 
                SELECT  *   
                FROM    [tbl_web_company] 
                WHERE   [name]          = @name
                AND     [address1]      = @address1
                AND     [address2]      = @address2
                AND     [city]          = @city
                AND     [province_id]   = @province_id
                AND     [postal_code]   = @postalcode
                AND     [contact_phone] = @phone
                AND     [contact_fax]   = @fax
                AND     [deleted]       = dbo.pvd_fn_getDeletedDate(@id, @active))
        BEGIN
            SELECT 'update'
        END
        ELSE
        BEGIN
            SELECT 'no update'
        END
...
AND ([province_id] IS NULL OR [province_id] = @province_id)
...
我基本上是想看看是否有任何列发生了更改,但是当@province\u id和dbo.pvd\u fn\u getDeletedDate(@id,@active)在数据库中为NULL,并且都设置为NULL时,我遇到了问题

省ID是一个整型可为空的

Deleted是一个Datetime-null

如果数据库中的记录对这两个值都为NULL,则将始终选择“更新”。这是错误的,因为[province_id]和[deleted]为空

在这种情况下如何处理空值有什么建议吗?

使用 是空的 相反 =NULL

改用“IS NULL”:

不会返回任何行,但:

SELECT 'Is null' WHERE NULL IS NULL


有关空值的详细信息

由于您的值来自参数,并且不是硬编码的,您可以使用以下内容:

IF NOT EXISTS ( 
                SELECT  *   
                FROM    [tbl_web_company] 
                WHERE   [name]          = @name
                AND     [address1]      = @address1
                AND     [address2]      = @address2
                AND     [city]          = @city
                AND     [province_id]   = @province_id
                AND     [postal_code]   = @postalcode
                AND     [contact_phone] = @phone
                AND     [contact_fax]   = @fax
                AND     [deleted]       = dbo.pvd_fn_getDeletedDate(@id, @active))
        BEGIN
            SELECT 'update'
        END
        ELSE
        BEGIN
            SELECT 'no update'
        END
...
AND ([province_id] IS NULL OR [province_id] = @province_id)
...
对其他
可为null的
字段使用相同的结构。

是否可以使用ISNULL()函数设置默认值

    SELECT  *   
                FROM    [tbl_web_company] 
                WHERE   [name]          = @name
                AND     [address1]      = @address1
                AND     [address2]      = @address2
                AND     [city]          = @city
                AND     ISNULL([province_id],99999) = ISNULL(@province_id,99999)
                AND     [postal_code]   = @postalcode
                AND     [contact_phone] = @phone
                AND     [contact_fax]   = @fax
                AND     ISNULL([deleted], '1990-01-01') = ISNULL(dbo.pvd_fn_getDeletedDate(@id, @active), '1990-01-01')
    BEGIN
        SELECT 'update'
    END
    ELSE
    BEGIN
        SELECT 'no update'
    END

使用ISNULL()会阻止优化器使用索引,因此通常我会建议不要这样做,但是这个查询的编写方式,如果它仍然使用索引,我会感到惊讶。

如果使用参数而不是硬编码的值,是否可以使用空值?是否可以?这对我不起作用。即使是这样,它也只能在参数为null时工作(如果@name是'John'
,则不能说
)。那么使用参数就没有意义了。