存储过程 WHERE 子句错误(期望参数)

时间:2021-05-15 09:20:16

标签: c# sql-server stored-procedures

ALTER PROCEDURE [dbo].[sp_twa_report1]
    (@date1 as DATE,
     @date2 as DATE,
     @Filter1 as INT,
     @Kheadoption as NVARCHAR(10),
     @Kcodeoption as NVARCHAR(10),
     @Ktypeoption as NVARCHAR(10),
     @Shiftoption as INT)
AS
BEGIN
    SELECT
        wageentry.empno, wageentry.kdate, wageentry.kcode,
        empmain.paybookno, 
        kamjaricode.kdesc, kamjarihead.khead, kamjarihead.khdesc,
        wageentry.shiftno
    INTO
        #tmpTbl1
    FROM
        wageentry, empmain, kamjaricode, kamjarihead
    WHERE 
        wageentry.empno = empmain.empno
        AND wageentry.kcode = kamjaricode.kcode
        AND kamjaricode.khead = kamjarihead.khead
        AND wageentry.kdate >= @date1 AND wageentry.kdate <= @date2
        AND (wageentry.shiftno = CASE @Shiftoption 
                                     WHEN 1 THEN 1 
                                     WHEN 2 THEN 1 
                                     WHEN 3 THEN 2 
                                     ELSE 5 
                                 END
             OR wageentry.shiftno = CASE @Shiftoption 
                                        WHEN 1 THEN 2 
                                        WHEN 2 THEN 1 
                                        WHEN 3 THEN 2 
                                        ELSE 5 
                                    END
            OR wageentry.shiftno = CASE @Shiftoption
                                       WHEN 1 THEN 5  
                                       WHEN 2 THEN 1 
                                       WHEN 3 THEN 2 
                                       ELSE 5 
                                   END)
        AND ((@Kheadoption IS NULL) OR (kamjaricode.khead = @Kheadoption))
        AND ((@Kcodeoption IS NULL) OR (kamjaricode.kcode = @Kcodeoption))
        AND ((@Ktypeoption IS NULL) OR (kamjaricode.ktype = @Ktypeoption))

    -- More code here

End

上述存储过程在 Management Studio 中运行良好,但是当我从 Winforms 应用程序运行它时,出现错误:

<块引用>

过程或函数“sp_twa_report1”需要未提供的参数“@Kheadoption”。

参数@Kheadoption, @Kcodeoption, @Ktypeoption默认为空。因此,根据我的理解,应该忽略这些查询行。我哪里出错了?

我的 Winforms 代码是:

commandText = "sp_twa_report1";

SqlCommand command = new SqlCommand(commandText, cs);
command.CommandType = CommandType.StoredProcedure;

command.Parameters.Add("@date1", SqlDbType.Date).Value = mySdate;
command.Parameters.Add("@date2", SqlDbType.Date).Value = myEdate;
command.Parameters.Add("@Filter1", SqlDbType.Int).Value = Filter1;
command.Parameters.Add("@Kheadoption",SqlDbType.NVarChar).Value = Kheadoption;
command.Parameters.Add("@Kcodeoption", SqlDbType.NVarChar).Value = Kcodeoption;
command.Parameters.Add("@Ktypeoption", SqlDbType.NVarChar).Value = Ktypeoption;
command.Parameters.Add("@Shiftoption", SqlDbType.Int).Value = myShiftno;
        
cs.Open();
SqlDataAdapter da = new SqlDataAdapter(command);
da.Fill(dt);
cs.Close();

1 个答案:

答案 0 :(得分:1)

<块引用>

参数@Kheadoption、@Kcodeoption、@Ktypeoption默认为空。因此,根据我的理解,应该忽略查询中的这些行。

在为存储过程传递参数时考虑使用 DBNull 而不是 null

Per MSDN:当您向服务器发送空参数值时,您必须指定 DBNull,而不是 null