[英]Varying number of records
我正在从我的C#代码执行SQL Server存储过程,该过程实际上是根据提供的条件从数据库中提取了一些数据。
DataSet GetAllxxxxxByDate(string entityValue,string companyValue)
{
using (var sqlConn = new SqlConnection(GetConnectionString()))
{
using (var cmd = new SqlCommand())
{
var data = new DataSet();
cmd.CommandText = “myStoredprodecure”;
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = sqlConn;
var eVal = string.IsNullOrWhiteSpace(entityValue) ? string.Empty : entityValue;
cmd.Parameters.AddWithValue("@entity_value", eVal);
var company = string.IsNullOrWhiteSpace(companyValue) ? string.Empty : companyValue;
cmd.Parameters.AddWithValue("@company", company);
var sqlDataAdaptor = new SqlDataAdapter(cmd);
sqlDataAdaptor.Fill(data);
return data;
}
}
}
在这里, entityValue
和companyValue
是逗号分隔的字符串,在C#代码中动态形成并将其传递给存储过程。
例如:
’first’,’second’,’third’
并且存储过程使用这些值来填充其中定义的NOT IN
条件。
问题是,当我执行代码时,记录数不一致。
以下是一个快速屏幕截图,其中第一个WHERE
子句返回3条记录,第二个WHERE
子句返回1条记录。 第一个WHERE
子句的输入值由c#代码填充,第二个WHERE
子句的输入值由手动填充以进行测试。
我能发现的唯一区别是报价数量。
问题:有人可以帮助我将问题零或将WHERE
子句中的区别归零吗?
好吧,您没有显示结果中的entity_value
,但是两者之间的区别是您在文字值周围添加了单引号:
SQL中的N'''FSEC'''
是字面值'FSEC'
SQL中的'FSEC'
只是FSEC
(不带引号)。
我的猜测是,记录2004981和2004982具有的价值FSEC
为(不带引号) entity_value
。
如果要从C#代码中添加参数值,请不要像在构建字符串时那样在其周围添加引号。 SQL会将值视为字符串,而无需字符串限定符。
编辑
好吧,我刚刚读了下面的声明:
在这里,entityValue,companyValue是逗号分隔的字符串
您不能只将逗号分隔的字符串传递给IN子句。 要搜索多个值,有几个选项:
在两端添加逗号并使用LIKE:
Where (',' + @entity_value +',' LIKE '%,' + entity_value + ',%')
将字符串解析为临时表,而不是在IN子句中使用该表
EXEC
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.