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

本文关键字:空值 参数 where net ado 子句 | 更新日期: 2023-09-27 18:20:58

如何在Ado.net中的where子句中设置一个可能为null值的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子句中我有一个null值。所以等号(=)不起作用,我必须使用"is"。

但是当我把sql改成这样时:

Select * from ViewSessionTarget where AgentId is @Parameter

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

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

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

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

您可以编写这样的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