我正在从我的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
条款?
答案 0 :(得分:1)
好吧,你没有显示结果中entity_value
的内容,但两者之间的区别在于你是在字面值周围添加单引号:
N'''FSEC'''
是文字值'FSEC'
'FSEC'
只是FSEC
(没有引号)。
我的猜测是2004981和2004982的记录FSEC
的值为entity_value
(不含引号)。
如果您要从C#代码添加参数值,请不要像在构建字符串时那样在它们周围添加引号。 SQL会将值视为字符串,而不需要字符串限定符。
修改强>
好的,我刚看了这句话:
这里entityValue,companyValue是逗号分隔的字符串
您不能只是将逗号分隔的字符串传递给IN子句。要搜索多个值,有几个选项:
在每一端添加逗号并使用LIKE:
Where (',' + @entity_value +',' LIKE '%,' + entity_value + ',%')
将字符串解析为临时表,而不是在IN子句中使用该表
EXEC