SQL Server替代动态查询

时间:2016-02-18 12:01:19

标签: sql sql-server dynamic-sql

我想知道我们有什么选择不做动态查询。

例如:

IF @Mail <> ''
BEGIN
    SELECT @Where = @Where + ' AND Mail =  @Mail '
END
ELSE IF @Phone <> ''
BEGIN
    SELECT @Where = @Where + ' AND Phone like ''%'' + @Phone '
END

我不想这样做,我想避免动态查询,如果有人可以帮助我。

顺便说一句,我希望按Mail进行过滤,但如果Mail不存在,那么我必须按Phone进行过滤,但不要两者都进行过滤。

5 个答案:

答案 0 :(得分:2)

如果您想要提高性能,最好的解决方案是针对每种情况单独进行查询。

Gordon的解决方案很好,但SQL服务器不会使用您可能希望在过滤的列上使用的任何索引。 可以通过添加OPTION(RECOMPILE)来增强它以使用索引,但这将导致每次运行时重新编译查询。如果您的表有很多行(并且您在列上定义了索引),它将显着提高性能,但会降低具有少量行(或没有索引)的表的性能 - 它将具有与动态查询基本相同的性能。

答案 1 :(得分:1)

在性能方面,您可能最好使用动态查询。更简单的查询通常更容易优化。

然而,您可以将where子句标记为:

where . . . AND
      (@Mail = '' or mail = @mail) AND
      (@Phone = '' or Phone like '%' + @Phone)

注意:NULL值用于表示&#34; all&#34;是很常见的。所以更典型的配方是:

WHERE . . . AND
      (@Mail IS NULL or mail = @mail) AND
      (@Phone IS NULL or Phone like '%' + @Phone)

答案 2 :(得分:0)

对于多个过滤器,动态SQL很有可能表现得更好,因为OR和性能通常在SQL查询中不能相处。

但是,如果“无过滤器值”上的过滤器为NULL,则可以按如下方式编写查询:

Android Studio

使用SELECT Mail, Phone, <other columns here> FROM table WHERE Mail = COALESCE(@Mail, Mail) AND Phone LIKE (COALESCE('%' + @Phone, Phone) 可以轻松将所有''值转换为NULL。此外,这将同等地处理nullif(@Mail, '')''

答案 3 :(得分:0)

你可以试试这个

AND ((ISNULL(@Mail,'') = '' or mail = @mail) OR (ISNULL(@Phone,'') = '' or Phone like '%' + @Phone))

答案 4 :(得分:-1)

为什么不使用CASE WHEN。

以下是可以帮助您进行此查询的网址。

"CASE" statement within "WHERE" clause in SQL Server 2008