我有一个查询,如下所示:
SELECT * FROM Members (NOLOCK) WHERE Phone= dbo.FormatPhone(@Phone)
现在,我明白了必须将格式化应用于列上的变量。但是我应该将其应用于变量以分配给其他局部变量,然后使用它(如下所示)。
Set @SomeVar = dbo.FormatPhone(@Phone) SELECT * FROM Members (NOLOCK) WHERE Phone= @SomeVar
哪种方法更好或两者都好?
编辑:和第一次查询有何不同
SELECT * FROM Members (NOLOCK) WHERE dbo.FormatPhone(Phone) = @Phone
与SQL一样,该查询在很大程度上与查询无关,不知道使用实际的架构。
您在Member.Phone上有索引吗?如果否,那么您编写查询的方式就没有关系,它们都将扫描整个表并执行相同的操作(即执行不佳)。如果您 确实有索引, 那么编写查询的方式将带来所有不同:
SELECT * FROM Members WHERE Phone= @Phone; SELECT * FROM Members WHERE Phone= dbo.FormatPhone(@Phone); SELECT * FROM Members WHERE dbo.FormatPhone(Phone)=@Phone;
首先查询保证最佳,将在索引上寻找电话。 第二个查询取决于dbo.FormatPhone的特征。它可能会或可能不会使用最佳搜索。 上次查询保证是错误的。将扫描表。