where子句中的可选参数

时间:2015-01-23 14:54:15

标签: c# sql-server stored-procedures

我有一个C#表单,可以在一个表中搜索,用户可以过滤搜索过程。

我有4个文本框,例如txt1,txt2,txt3和txt4。

用户可以填写每个文本框进行搜索,如txt1或txt1和txt2或txt1和txt和txt4或所有这些文本框,并将其他文本框留空并使用此文本框的所有组合。那么如何编写一个选择程序来涵盖所有这些选项。

我写了这个程序,但它没有帮助:

CREATE proc sp_searchZ
@minprice bigint=null,@maxprice bigint=null,@minarea int=null,@maxarea int=null,@location nvarchar(50)=null,@kind nvarchar(50)=null
as

SELECT *
  FROM Landtbl
 WHERE ((@minprice is null and @maxpriceis null) or ([Price] between @minprice and @maxprice))
 and
       ((@minarea is null and @maxarea is null) or ([area] between @minarea and @maxarea))

 and   ((@location is null)or([location]=@location))
 and   ((@kind is null) or ([kind]=@kind))

2 个答案:

答案 0 :(得分:0)

我认为实现这一点的最佳方法是使用动态T-SQL。在您的存储过程中,您可以执行以下操作:

DECLARE @sqlString nvarchar(max);
DECLARE @sqlWhere nvarchar(max);
DECLARE @sqlParams nvarchar(max);

SET @sqlString = 'SELECT * FROM Landtbl '
SET @sqlWhere = 'WHERE 1=1 '

IF (@minprice IS NOT NULL and @maxprice IS NOT NULL)
BEGIN
    SET @sqlWhere = @sqlWhere + 'AND [Price] BETWEEN @minprice AND @maxprice '
END;

IF (@location IS NOT NULL)
BEGIN
    SET @sqlWhere = @sqlWhere + 'AND [location]=@location '
END;
-- any other conditional logic

SET @sqlParams = N'@minprice bigint,@maxprice bigint,@minarea int,@maxarea int,@location nvarchar(50),@kind nvarchar(50)';

SET @sqlString = @sqlString + @sqlWhere;

EXEC sp_executesql @sqlString, @sqlParams, @minprice ,@maxprice ,@minarea,@maxarea,@location,@kind

这应该很好用,可以用来做一些非常复杂的事情。我希望这有帮助

答案 1 :(得分:0)

这里不需要动态SQL,我总是这样做,就像这样(记得我说你的逻辑是合理的吗?):

SELECT * FROM table WHERE ((@optionalparam IS NULL) OR ([field]=@optionalparam))

你已经这样做了,所以,如果你没有按预期看到结果,请注释掉所有where子句并一次一个地添加每个位,你很快就会抓住那个不是工作

编辑:

试试这个,打开SSMS并打开一个新的查询窗口并输入以下内容:

DECLARE @minprice INT /* or whatever datatype you are using */
DELCARE @maxprice INT
SELECT @minprice=1, @maxprice=9999

SELECT 
  *
FROM 
  Landtbl
WHERE 
     ((@minprice IS NULL and @maxprice IS NULL) OR ([Price] BETWEEN @minprice AND @maxprice))

如果可行,则添加下一位

SELECT 
  *
FROM 
  Landtbl
WHERE 
     ((@minprice IS NULL and @maxprice IS NULL) OR ([Price] BETWEEN @minprice AND @maxprice))
 AND ((@minarea is null and @maxarea is null) or ([area] between @minarea and @maxarea))

如果有效则添加下一位,依此类推,直至失败。你最后添加的位是位不起作用。