不同的记录数量

时间:2013-11-18 14:10:56

标签: c# sql sql-server stored-procedures

我正在从我的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;
         }
     }
}

此处entityValuecompanyValue是逗号分隔的字符串,在C#代码中动态生成,并将其传递给存储过程。

例如:

’first’,’second’,’third’

存储过程使用这些值来填充其中定义的NOT IN条件。

问题在于,当我执行代码时,我得到的记录数量不一致。

以下是一个快速屏幕截图,其中第一个WHERE子句返回3个记录,第二个WHERE子句返回1个记录。第一个WHERE子句的输入值是从c#代码填充的,第二个是手动填充以进行测试。

Both c# execution result and manual execution result

唯一的区别是,我能看到的是报价数量。

问题:有人可以帮助我解决这个问题或者这些问题的区别吗?WHERE条款?

1 个答案:

答案 0 :(得分:1)

好吧,你没有显示结果中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子句中使用该表

  • 将值作为表值参数传递,并在IN子句中使用它。
  • 将SQL语句构建为字符串,并使用EXEC
  • 执行它