当我将.NET代码中的整数传递给SQL时,我看到一些非常奇怪的行为。
.NET
int facilityID = 0;
//...
var param = new SqlParameter("@facid", facilityID)
// db call
using (SqlConnection connectionToSQL = new SqlConnection(connectionString))
{
using (SqlCommand command = new SqlCommand(storedProcedure, connectionToSQL))
{
command.CommandType = CommandType.StoredProcedure;
command.CommandTimeout = commandTimeout;
command.Parameters.Add(param)
adapter = new SqlDataAdapter(command);
connectionToSQL.Open();
data = new DataSet();
adapter.Fill(data);
}
}
SQL
CREATE PROCEDURE MySP @facid int = NULL,
-- ...
SELECT
-- ...
WHERE r.entity = isnull(@facid,r.entity) -- r.entity defined as [entity] [numeric] (18, 0) NULL, however it contains only numbers > 0 (no NULLs)
因此,仅当@facid为NULL或某个数字> 0与r.entity值之一匹配时,此select语句才能返回数据,但是,当我运行.NET代码时,它将返回结果。有人可以解释一下这怎么可能吗?尽管我从.NET代码中传递了0,但究竟是什么以及为什么它使@ facid = NULL呢?
.NET 4.5
System.Data版本4.0.0.0
Microsoft SQL Server 2008 R2(SP3-GDR)(KB4057113)-10.50.6560.0(X64)2017年12月28日15:03:48(c)Windows NT 6.1(Build)上的Microsoft Corporation Developer Edition(64位)版权所有(c) 7601:Service Pack 1)(管理程序)