2

我在 SQL Server 环境中工作,大量存储过程,其中许多过程使用 0 和 '' 而不是 Null 来表示没有传递有意义的参数值。

这些参数经常出现在 WHERE 子句中。通常的模式是这样的

WHERE  ISNULL(SomeField,'') = 
    CASE @SomeParameter 
        WHEN ''  THEN ISNULL(SomeField,'')
        ELSE @SomeParameter
    END

由于各种原因,对 proc 进行更改比更改调用它的代码要容易得多。那么,鉴于调用代码将为空参数传递空字符串,与空字符串进行比较的最快方法是什么?

我想到的一些方法:

@SomeParameter = ''

NULLIF(@SomeParameter,'') IS NULL

LEN(@SomeParameter) = 0

我还考虑过在 proc 的早期检查参数,如果它等于'',则将其设置为 NULL,然后@SomeParameter IS NULL在实际的 WHERE 子句中进行测试。

还有哪些其他方法?什么是最快的?

非常感谢。

4

1 回答 1

1

在 proc 开始时对参数进行排序必须比 where 子句中的多个条件或在一个中使用函数更快。查询越复杂,或者需要过滤的记录越多,增益就越大。

让我害怕的一点是,如果过程参数中缺乏可空性也进入了数据中。如果它在您开始锁定时出现,您的查询将返回“错误”结果。

如果这个产品有一定的寿命,那么我会说容易长期是错误的解决方案,应该在调用应用程序中纠正它。如果没有,那么您可能应该不理会它,因为您所要做的就是从一张地毯下,另一张地毯下扫除乱七八糟的东西……

你将如何测试这些变化,你引入一个小错误的机会,而你的头骨无聊地一次又一次地做出同样的改变,是非常高的。

于 2012-09-20T22:40:25.050 回答