ado.net中where子句中的空值参数

时间:2014-09-07 00:40:15

标签: c# sql-server ado.net

如何在带有Ado.net参数的where子句中设置带有可能空值的Sql命令。

Sql声明:

Select * from ViewSessionTarget where AgentId = @Parameter

Ado.net代码

using (SqlConnection connection = new SqlConnection(@"my connection string"))
using (SqlCommand command = new SqlCommand(sql, connection))
{
      connection.Open();
      var parameter = command.Parameters.AddWithValue("@Parameter", DBNull.Value);
      parameter.DbType = DbType.Int64;

      SqlDataReader reader = command.ExecuteReader();
      while (reader.Read())
      {
           Debug.Write(reader["SessionId"]);
      }
}

Resultset总是有0个元素,因为在我的where子句中我有一个空值。 所以等于(=)将不起作用,我必须使用“是”。

但是当我将我的sql更改为:

Select * from ViewSessionTarget where AgentId is @Parameter

我收到一个SqlException:“'@Parameter'附近的语法不正确。”

2 个答案:

答案 0 :(得分:0)

你可以写这样的SQL查询......

Select * from ViewSessionTarget where AgentId = @Parameter OR @Parameter IS NULL

或者你可以创建一个小程序,也可以给你更好的表现,比如......

CREATE PROCEDURE dbo.myProc 
 @Parameter INT 
AS
BEGIN
  SET NOCOUNT ON; 
  DECLARE @Sql NVARCHAR(MAX);

SET @Sql = N'Select * from ViewSessionTarget where 1 = 1 '
           + CASE WHEN @Parameter IS NOT NULL THEN 
                N'AND AgentId = @Parameter ' ELSE N' ' END

EXECUTE sp_executesql @Sql 
                     ,N'@Parameter INT '
                     ,@Parameter                

END

答案 1 :(得分:0)

我找到了一种更干净的方法(至少对我而言):

SELECT * FROM ViewSessionTarget 
    WHERE (AgentId = @Parameter OR (@Parameter IS NULL AND AgentID IS NULL));