none
如何在存储过程中根据选择生成SELECT查询WHERE后的条件 RRS feed

  • 问题

  • 如何在存储过程中根据选择生成SELECT查询WHERE后的条件。如不用存储过程,在C#代码中可以通过以下的方法来实现自动生成SQL语查询语句。

    int CategoryID=-1;

    CategoryID = Convert.ToInt32(DropDownListCategory.SelectValue);

    string ProductName=TextBoxProductName.Text;

    string ProductModel=TextBoxDrawNumber.Text;

    string DrawNumber=TexyBoxDrawNumber.Text;

    int ProductType=-1;

    ProductType=Convert.ToInt32(DropDownListProductType.SelectValue);

    string CmdString="SELECT * FROM Product WHERE "

    if(!string.IsNullOrEmpty(CategoryID))
    {
        CmdString += " CategoryID="+CategoryID.ToString();
    }

    if(!string.IsNullOrEmpty(ProductName))
    {
        CmdString += " AND ProductName="+ProductName;
    }

    if(!string.IsNullOrEmpty(DrawNumber))
    {
    CmdString += " AND DrawNumber="+DrawNumber;
    }

    if(!string.IsNullOrEmpty(ProductModel))
    {
        CmdString += " AND ProductModel="+ProductModel;
    }

    if(!string.IsNullOrEmpty(ProductType))
    {
        CmdString += " AND ProductType="+ProductType.ToString();
    }

    这样能根据用户选择的条件自动生成Where后的条件,请问在存储过程中应该怎么弄。



    • 已编辑 cycc 2011年10月9日 9:09
    2011年10月9日 9:07

答案

  • 不妨參考下列程式碼片段,我是以Northwind來做示範:

    use Northwind
    go
    
    
    if exists (select * from sys.objects where type='P' and name='usp_GetCustomers')
    	drop procedure usp_GetCustomers
    go
    
    create procedure usp_GetCustomers
    (@CustomerID nchar(10) = ''
    ,@City nvarchar(30) = ''
    ,@Country nvarchar(30) = ''
    )
    as
    begin
    	select *
    	from Customers
    	where (CustomerID = @CustomerID OR @CustomerID = '')
    	and 	(City = @City OR @City = '')
    	and (Country = @Country OR @Country = '')
    end
    
    go
    
    --全部使用預設值,不針對CustomerID、City和Country來進行篩選
    exec usp_GetCustomers
    
    --針對CustomerID進行篩選
    exec usp_GetCustomers @CustomerID = 'ALFKI'
    
    --針對國家及城市進行篩選
    exec usp_GetCustomers @City = 'Seattle',@Country = 'USA'
    
    

    PS:建議參數傳入的部分使用SqlParameter或Parameter類別比較安全。


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/
    • 已标记为答案 cycc 2011年10月9日 10:17
    2011年10月9日 10:04