我有一个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))
答案 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))
如果有效则添加下一位,依此类推,直至失败。你最后添加的位是位不起作用。