Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

bertani

[Resolvido] Sql no c#

Recommended Posts

Pessoal,

estou com um problema que não consigo entender.

 

Fiz um comando sql que quando jogo na aplicação, ele retorna 2 erros, sendo que ao executar no no Management Studio executa normalmente.

Segue o que fiz:

 

try

{

SqlConnection conn = new SqlConnection(@"Server=Server;Database=base;Uid=teste;Pwd=teste;");

SqlCommand cmd = new SqlCommand();

cmd.Connection = conn;

conn.Open();

 

cmd.CommandText = "SELECT DISTINCT EMV01.EMP_FIL, EMV01.DT_MOVTO, EMV01.SEQ, EMV01.C_PROD, ESTOQUE.DESCR_1," +

"EMV01.TIPO_MOVTO, EMV01.QTDE," +

"CASE WHEN ETM01.ES_ARM ='E' THEN QTDE ELSE 0 END AS QTDE_ENT," +

"CASE WHEN ETM01.ES_ARM='S' THEN QTDE ELSE 0 END AS QTDE_SAI," +

"CASE WHEN ETM01.ES_ARM='I' OR ETM01.ES_USO='I' THEN QTDE ELSE 0 END AS QTDE_INV, EMV01.ID_CANCEL" +

"FROM EMV01 LEFT JOIN" +

"(SELECT DESCR_1, DESCR_1 + ' ' + DESCR_2 AS DESCRICAO, C_PROD AS PROD, DEPOSITO AS DEP, ESTAB AS EST, EMP_FIL AS FIL" +

"FROM TESTEDB_ME.DBO.ESTQ" +

"WHERE(ESTAB = 1) AND (DEPOSITO = 1)) AS ESTOQUE" +

"ON (EMV01.C_PROD COLLATE SQL_Latin1_general_cp1_ci_as = PROD) AND (EMV01.DEPOSITO = DEP) AND (EMV01.ESTAB = EST) AND " +

"(EMV01.EMP_FIL = EMP_FIL) LEFT JOIN ETM01 ON EMV01.TIPO_MOVTO = ETM01.TIPO_MOVTO" +

"WHERE (EMV01.EMP_FIL = EMP_FIL) AND (EMV01.DT_MOVTO = DT_MOVTO) AND" +

"(EMV01.ID_CANCEL Is Null) AND (EMV01.C_PROD LIKE 'PRODUTO%') AND (ESTOQUE.DESCR_1 = DESCR_1)" +

"ORDER BY EMV01.EMP_FIL, EMV01.DT_MOVTO, EMV01.SEQ";

cmd.ExecuteReader();

conn.Close();

}

 

catch (Exception)

{

throw;

}

}

 

O erro que retorna é: Sintaxe incorreta próximo ao LEFT e próximo ao TESTEDB_ME.

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema é que você não está deixando espaços entre as palavras chave, aí ele não consegue interpretar.

 

Exemplo:

 

"CASE WHEN ETM01.ES_ARM='I' OR ETM01.ES_USO='I' THEN QTDE ELSE 0 END AS QTDE_INV, EMV01.ID_CANCEL" +
"FROM EMV01 LEFT JOIN"

 

Ele interpretaria como algo assim:

CASE WHEN ETM01.ES_ARM='I' OR ETM01.ES_USO='I' THEN QTDE ELSE 0 END AS QTDE_INV, EMV01.ID_CANCELFROM EMV01 LEFT JOIN

 

Porque você não deu o espaçamento adequado para separar as palavras. Tente fazer assim:

 

cmd.CommandText = "SELECT DISTINCT EMV01.EMP_FIL, EMV01.DT_MOVTO, EMV01.SEQ, EMV01.C_PROD, ESTOQUE.DESCR_1," +
"EMV01.TIPO_MOVTO, EMV01.QTDE," +
"CASE WHEN ETM01.ES_ARM ='E' THEN QTDE ELSE 0 END AS QTDE_ENT," +
"CASE WHEN ETM01.ES_ARM='S' THEN QTDE ELSE 0 END AS QTDE_SAI," +
"CASE WHEN ETM01.ES_ARM='I' OR ETM01.ES_USO='I' THEN QTDE ELSE 0 END AS QTDE_INV, EMV01.ID_CANCEL " +
"FROM EMV01 LEFT JOIN " +
"(SELECT DESCR_1, DESCR_1 + ' ' + DESCR_2 AS DESCRICAO, C_PROD AS PROD, DEPOSITO AS DEP, ESTAB AS EST, EMP_FIL AS FIL " +
"FROM TESTEDB_ME.DBO.ESTQ " +
"WHERE(ESTAB = 1) AND (DEPOSITO = 1)) AS ESTOQUE " +
"ON (EMV01.C_PROD COLLATE SQL_Latin1_general_cp1_ci_as = PROD) AND (EMV01.DEPOSITO = DEP) AND (EMV01.ESTAB = EST) AND " +
"(EMV01.EMP_FIL = EMP_FIL) LEFT JOIN ETM01 ON EMV01.TIPO_MOVTO = ETM01.TIPO_MOVTO " +
"WHERE (EMV01.EMP_FIL = EMP_FIL) AND (EMV01.DT_MOVTO = DT_MOVTO) AND " +
"(EMV01.ID_CANCEL Is Null) AND (EMV01.C_PROD LIKE 'PRODUTO%') AND (ESTOQUE.DESCR_1 = DESCR_1) " +
"ORDER BY EMV01.EMP_FIL, EMV01.DT_MOVTO, EMV01.SEQ";

Compartilhar este post


Link para o post
Compartilhar em outros sites

João, funcionou perfeitamente.

Fiz da maneira que publicou e esta ok. Vou modificar os outros scritps que estavam dando o mesmo problema e irá funcionar.

 

Valeu demais

 

Abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.