sql - 在存储过程中构建动态 WHERE 子句

标签 sql sql-server sql-server-2008 stored-procedures

我使用的是 SQL Server 2008 Express,并且有一个存储过程,可以根据参数从表中执行SELECT。我有 nvarchar 参数和 int 参数。

这是我的问题,我的 where 子句如下所示:

WHERE [companies_SimpleList].[Description] Like @What 
    AND companies_SimpleList.Keywords Like @Keywords
    AND companies_SimpleList.FullAdress Like @Where
    AND companies_SimpleList.ActivityId = @ActivityId
    AND companies_SimpleList.DepartementId = @DepartementId
    AND companies_SimpleList.CityId = @CityId

此参数是我的 ASP.NET MVC 3 应用程序的用户设置的过滤器值,并且 int 参数可能未设置,因此它们的值将为 0。这是我的问题,例如,存储过程将搜索 0 作为 CityId 的项目,为此,它会返回错误的结果。因此,如果能够根据 int 参数的值是否大于 0 来拥有一个动态的 where 子句,那就太好了。

提前致谢

最佳答案

试试这个:

WHERE 1 = 1
AND (@what     IS NULL OR [companies_SimpleList].[Description] Like @What )
AND (@keywords IS NULL OR companies_SimpleList.Keywords        Like @Keywords)
AND (@where    IS NULL OR companies_SimpleList.FullAdress      Like @Where)
...

如果将任何参数 @what@where 发送到具有 NULL 值的存储过程,则条件将被忽略。您可以使用 0 而不是 null 作为测试值,那么它将类似于 @what = 0 OR ...

关于sql - 在存储过程中构建动态 WHERE 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11396919/

相关文章:

mysql - MySQL 中的 SQL 更新查询

c# - ASP.NET Core OnModelCreating 强制触发每个请求

sql - 如何将一个巨大的表数据复制到SQL Server中的另一个表中

SQL Server 列的大小差异

sql - 使用 PostgreSQL 区分计数

mysql - 如何在 bash 脚本中使用 SQL Update 功能

sql-server - Oracle 删除约束级联等效于 Sql Server

sql - 如何在sql中生成连续的行号?

sql - 如何在单个查询中使用计数和限制在 postgres 中选择数据

sql - 如何在没有像 ApexSqlLog 这样的应用程序的情况下从 SQL Server 中的事务日志文件(.ldf 文件)获取用户