这就是我在C#上做的事情:
public static decimal ObterSaldoEstoqueEntrarProdutosFamilia(this IRepositorio<SaldoEstoqueProduto> saldoEstoqueRepositorio, string empresaUsuario, Int64 tipoEstoqueUsuario, string filial, string familia)
{
//TODO: Trocar por consulta pelo LINQ quando os objetos de programação estiverem criados no C#
decimal resultado = 0;
try
{
string connString = saldoEstoqueRepositorio.StringConexao();
SqlConnection conexaoSql = new SqlConnection(connString);
StringBuilder queryItens = new StringBuilder();
queryItens.Append("SELECT isnull(SUM(T2.ProTrfQtd - T2.ProTrfCol),0) as Saldo ");
queryItens.Append("FROM EST250 T1 (NOLOCK) ");
queryItens.Append("INNER JOIN EST2501 T2 (NOLOCK) ON T2.EmpCod = T1.EmpCod AND T2.EstTip = T1.EstTip AND T2.ProTrfNum = T1.ProTrfNum AND T2.FilOriCod = T1.FilOriCod AND T2.FilDstCod = T1.FilDstCod ");
queryItens.Append("LEFT JOIN EST2503 T3 (NOLOCK) ON T3.EmpCod = T1.EmpCod AND T3.EstTip = T1.EstTip AND T3.ProTrfNum = T1.ProTrfNum AND T3.FilOriCod = T1.FilOriCod AND T3.FilDstCod = T1.FilDstCod ");
queryItens.Append("LEFT JOIN NTF006 T4 (NOLOCK) ON t4.EmpCod = t3.EmpCod and t4.FisOpe = 'E' and t4.FilCod = t3.FilOriCod and t4.FisEspCod = t3.ProTrfEspC and t4.FisSerCod = t3.ProTrfSerC and t4.FisEntCod = t3.ProTrfFisE and t4.FisCod = t3.ProTrfFisC and t4.NopCod = t3.ProTrfNopC ");
queryItens.Append("LEFT JOIN EST020 T5 (NOLOCK) ON T5.EmpCod = t2.EmpCod and t5.EstTip = t2.EstTip and t5.ProCod = t2.ProCod ");
queryItens.Append("LEFT JOIN EST023 T6 (NOLOCK) ON T6.EmpCod = t2.EmpCod and t5.EstTip = t2.EstTip and t6.ProFamCod = t5.ProFmlCod ");
queryItens.Append("WHERE T1.EmpCod = @EmpCod AND T1.EstTip = @EstTip AND T1.FilDstCod = @FilCod AND");
queryItens.Append(" ( ");
queryItens.Append(" T6.ProFamCod like @ProFamCodLike OR T6.ProFamCod = @ProFamCod ");
queryItens.Append(" ) ");
queryItens.Append("AND T1.ProTrfOdfC = 0 AND T2.ProTrfQtd > T2.ProTrfCol AND ");
queryItens.Append(" ( ");
queryItens.Append(" (T1.ProTrfSta = 1 OR T1.ProTrfSta = 2 OR T1.ProTrfSta = 4 OR T1.ProTrfSta = 7 OR T1.ProTrfSta = 9) ");
queryItens.Append(" OR (T1.ProTrfSta = 6 AND t4.FisSta in (1, 2, 3, 4, 5, 6, 12)) "); //Não considera o saldo a entrar de notas que estão em conclusão pendente, pois esta saldo já está contando no lógico,ou das programações Em recebimento que não possuem nota relacionada
queryItens.Append(" ) ");
conexaoSql.Open();
SqlCommand comando = new SqlCommand(queryItens.ToString(), conexaoSql);
comando.Parameters.AddWithValue("@EmpCod", empresaUsuario);
comando.Parameters.AddWithValue("@EstTip", tipoEstoqueUsuario);
comando.Parameters.AddWithValue("@ProFamCod", familia);
comando.Parameters.AddWithValue("@ProFamCodLike", familia + ".%" );
comando.Parameters.AddWithValue("@FilCod", filial);
resultado = Convert.ToDecimal(comando.ExecuteScalar());
conexaoSql.Close();
}
catch (Exception)
{
}
return resultado;
}
comando.ExecuteScalar()
需要4秒才能执行。但是如果我在SQL Server上生成并使用相同的参数执行sql,则只需1秒钟。
有人知道什么可以吗?有办法解决吗?
答案 0 :(得分:0)
我解决了我的问题,改变了我向查询添加参数的方式!
我这样做:
comando.Parameters.AddWithValue("@EmpCod", empresaUsuario);
comando.Parameters.AddWithValue("@EstTip", tipoEstoqueUsuario);
comando.Parameters.AddWithValue("@ProFamCod", familia);
comando.Parameters.AddWithValue("@ProFamCodLike", familia + ".%" );
comando.Parameters.AddWithValue("@FilCod", filial);
然后我改为:
SqlParameter sqlParmInsLeitura1 = new SqlParameter("EmpCod", SqlDbType.VarChar);
sqlParmInsLeitura1.Value = (object)empresaUsuario.Trim();
SqlParameter sqlParmInsLeitura2 = new SqlParameter("EstTip", SqlDbType.BigInt);
sqlParmInsLeitura2.Value = (object)tipoEstoqueUsuario;
SqlParameter sqlParmInsLeitura3 = new SqlParameter("ProFamCod", SqlDbType.VarChar);
sqlParmInsLeitura3.Value = (object)familia.Trim();
SqlParameter sqlParmInsLeitura4 = new SqlParameter("ProFamCodLike", SqlDbType.VarChar);
sqlParmInsLeitura4.Value = (object)familia.Trim() + ".%";
SqlParameter sqlParmInsLeitura5 = new SqlParameter("FilCod", SqlDbType.VarChar);
sqlParmInsLeitura5.Value = (object)filial.Trim();
comando.Parameters.Add(sqlParmInsLeitura1);
comando.Parameters.Add(sqlParmInsLeitura2);
comando.Parameters.Add(sqlParmInsLeitura3);
comando.Parameters.Add(sqlParmInsLeitura4);
comando.Parameters.Add(sqlParmInsLeitura5);
现在它在1秒内执行。而不是4秒。
谢谢大家!