我有三个变量可能需要或可能不需要传递给存储过程,基本上是一个所有选项,然后通过将它分解为几个值来选择。我有这个程序,如果有人选择分解选项并单独选择所有选项但我必须制作一个GetReportbySV,GetReportbyVE等。有没有人在一个存储过程中做到这一点我会更好其中8个?
create proc GetReportbySVE
@SCode int,
@VCode int,
@ECode int
as
begin
select * from D
where S = @SCode and V = @VCode and E = @ECode
end
编辑:我正在使用C#winform将数据传递给此过程。
答案 0 :(得分:0)
如果您有更多参数,可能会非常困难。 请在SO上查看此问题以便进一步调查: How can I use optional parameters in a T-SQL stored procedure?
我永远不会在这种情况下使用存储过程。相反,请看一下以下代码:
var sqlSelect = "Select field1, field2, field3 FROM yourTable"
var cmd = new SqlCommand(yourConn)
var sqlWhere = new StringBuilder();
If (sCode > 0)
{
cmd.Parameters.Add("@SCode", SqlDbType.int).Value = sCode;
sqlWhere.Append("@SCode AND");
}
If (vCode > 0)
{
cmd.Parameters.Add("@VCode ", SqlDbType.int).Value = vCode;
sqlWhere.Append("@VCode AND");
}
If(eCode > 0)
{
cmd.Parameters.Add("@ECode", SqlDbType.int).Value = eCode ;
sqlWhere.Append("@ECode AND");
}
if (sqlWhere.length > 0)
{
sqlWhere.Insert("WHERE ",0);
}
cmd.CommandText = sqlSelect + sqlWhere.ToString();
using(var sr = SqlDataReader = cmd.ExecuteReader())
{
//read your fields
}
答案 1 :(得分:0)
我建议你使用我的其他答案。但是,这里还有一个存储过程示例。
无论如何,以下程序说明了它的外观(仅为两个参数,给你一个想法):
CREATE PROCEDURE GetReportbySVE
@SCode int,
@VCode int
AS
/* check for the NULL / default value (indicating nothing was passed */
if (@SCode = 0 AND @VCode = 0)
BEGIN
/* your sql to execute*/
END
if (@VCode = 0)
BEGIN
/* your sql to execute*/
END
if (@SCode = 0)
BEGIN
/* your sql to execute*/
END
if (@SCode <> 0 AND @VCode <> 0)
BEGIN
/* your sql to execute*/
END