1

我有三个变量可能需要也可能不需要传递给存储过程,基本上是一个全部选项,然后是基于通过几个值将其分解的选项。如果有人选择分解选项并单独选择所有选项,我有这个程序,但是我必须制作一个 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 将数据传递给此过程。

4

2 回答 2

0

如果您有更多参数,这可能会非常困难。请在 SO 上查看此问题以进行进一步调查: 如何在 T-SQL 存储过程中使用可选参数?.

C# 示例

在这种情况下,我永远不会使用存储过程。相反,请看一下以下代码:

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
}
于 2013-07-12T21:50:40.597 回答
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
于 2013-07-12T22:10:39.853 回答