如何在带有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'附近的语法不正确。”
答案 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));