PROBLEMA COM SQL INSERT WHERE NOT EXISTS

DAMASCENO.CESAR 13/07/2017 16:34:55
#475181
Boa tarde, tenho uma consulta SQL, Banco de dados MySql, que se houver registros na tabela, ela funciona normalmente, mas se a tabela estiver vazia, não insere os dados. Segue a rotina abaixo:

  Using cmd As New MySqlCommand
cmd.Connection = con
Dim a
For a = 0 To Lst.Count - 1
sSql = [Ô]INSERT INTO Turmas(Matricula, Classe, Ano, Semestre, Inicio, Fim, RA, Ativo, Obs) SELECT [Ô] _
& [Ô]@Matricula, @Classe, @Ano, @Semestre, @Inicio, @Fim, @RA, @Ativo, @Obs FROM Turmas [Ô] _
& [Ô]WHERE NOT EXISTS (SELECT Matricula, Classe, Ano, Semestre, Inicio, Fim, RA, Ativo, Obs FROM Turmas WHERE Matricula = @Matricula AND Classe =@Classe) LIMIT 1;[Ô]
cmd.Parameters.AddWithValue([Ô]@Matricula[Ô], Lst.Item(a).Matricula)
cmd.Parameters.AddWithValue([Ô]@Classe[Ô], Lst.Item(a).Classe)
cmd.Parameters.AddWithValue([Ô]@Ano[Ô], Lst.Item(a).Ano)
cmd.Parameters.AddWithValue([Ô]@Semestre[Ô], Lst.Item(a).Semestre)
cmd.Parameters.AddWithValue([Ô]@Inicio[Ô], Lst.Item(a).Inicio)
cmd.Parameters.AddWithValue([Ô]@Fim[Ô], Lst.Item(a).Fim)
cmd.Parameters.AddWithValue([Ô]@RA[Ô], Lst.Item(a).RA)
cmd.Parameters.AddWithValue([Ô]@Ativo[Ô], Lst.Item(a).Ativo)
cmd.Parameters.AddWithValue([Ô]@Obs[Ô], Lst.Item(a).Obs)
cmd.CommandText = sSql
cmd.ExecuteNonQuery()
cmd.Parameters.Clear()
Next
End Using


Gostaria de saber se é erro meu em montar a consulta SQL ou é necessário haver registros para funcionar.
Obrigado
GUIMORAES 13/07/2017 16:43:48
#475184
DAMASCENO.CESAR,

Faz um count e verifique se existem registros na tabela.
  

sSql = [Ô]INSERT INTO Turmas(Matricula, Classe, Ano, Semestre, Inicio, Fim, RA, Ativo, Obs) SELECT [Ô] _
& [Ô]@Matricula, @Classe, @Ano, @Semestre, @Inicio, @Fim, @RA, @Ativo, @Obs FROM Turmas [Ô] _
& [Ô]WHERE (SELECT count(*) FROM Turmas WHERE Matricula = @Matricula AND Classe =@Classe) <= 0;[Ô]

DAMASCENO.CESAR 13/07/2017 16:53:07
#475185
GUIMORAES, não funcionou, mas obrigado. Estou encerrando o expediente agora, amanhã retorno.
DAMASCENO.CESAR 14/07/2017 09:44:26
#475195
GUIMORAES, baseado em seu exemplo também tentei:
  sSql = [Ô]INSERT INTO Turmas(Matricula, Classe, Ano, Semestre, Inicio, Fim, RA, Ativo, Obs) SELECT [Ô] _
& [Ô]@Matricula, @Classe, @Ano, @Semestre, @Inicio, @Fim, @RA, @Ativo, @Obs FROM Turmas [Ô] _
& [Ô]WHERE (SELECT COUNT(Matricula) AS Matricula FROM Turmas where Matricula <=0) OR NOT EXISTS [Ô] _
& [Ô](SELECT Matricula, Classe, Ano, Semestre, Inicio, Fim, RA, Ativo, Obs FROM Turmas WHERE Matricula = @Matricula AND Classe =@Classe) [Ô] _
& [Ô] LIMIT 1;[Ô]


e a variação:
  sSql = [Ô]INSERT INTO Turmas(Matricula, Classe, Ano, Semestre, Inicio, Fim, RA, Ativo, Obs) SELECT [Ô] _
& [Ô]@Matricula, @Classe, @Ano, @Semestre, @Inicio, @Fim, @RA, @Ativo, @Obs FROM Turmas [Ô] _
& [Ô]WHERE NOT EXISTS (SELECT Matricula, Classe, Ano, Semestre, Inicio, Fim, RA, Ativo, Obs FROM Turmas WHERE Matricula = @Matricula AND Classe =@Classe) [Ô] _
& [Ô]OR (SELECT COUNT(Matricula) AS Matricula FROM Turmas where Matricula <=0) LIMIT 1;[Ô]


e nenhuma funcionou, se alguem tiver mais ideias...
GUIMORAES 14/07/2017 13:26:03
#475205
DAMASCENO.CESAR

Você não precisa utilizar o Limit nesta operação, pois o count só irá retornar um registros.
Fiz um teste em meu banco de dados, e obtive sucesso. Você está recebendo alguma mensagem de erro?

Tenta desta forma para ver se dá certo!
  

sSql = [Ô]INSERT INTO Turmas(Matricula, Classe, Ano, Semestre, Inicio, Fim, RA, Ativo, Obs) [Ô]
sSql = sSql & [Ô] SELECT Matricula, Classe, Ano, Semestre, Inicio, Fim, RA, Ativo, Obs FROM Turmas[Ô]
sSql = sSql & [Ô] WHERE (SELECT COUNT(Matricula) AS Matricula FROM Turmas[Ô]
sSql = sSql & [Ô] WHERE @Matricula, @Classe, @Ano, @Semestre, @Inicio, @Fim, @RA, @Ativo, @Obs) <=0[Ô]

cmd.Parameters.AddWithValue([Ô]@Matricula[Ô], Lst.Item(a).Matricula)
cmd.Parameters.AddWithValue([Ô]@Classe[Ô], Lst.Item(a).Classe)
cmd.Parameters.AddWithValue([Ô]@Ano[Ô], Lst.Item(a).Ano)
cmd.Parameters.AddWithValue([Ô]@Semestre[Ô], Lst.Item(a).Semestre)
cmd.Parameters.AddWithValue([Ô]@Inicio[Ô], Lst.Item(a).Inicio)
cmd.Parameters.AddWithValue([Ô]@Fim[Ô], Lst.Item(a).Fim)
cmd.Parameters.AddWithValue([Ô]@RA[Ô], Lst.Item(a).RA)
cmd.Parameters.AddWithValue([Ô]@Ativo[Ô], Lst.Item(a).Ativo)
cmd.Parameters.AddWithValue([Ô]@Obs[Ô], Lst.Item(a).Obs)
cmd.CommandText = sSql
cmd.ExecuteNonQuery()
cmd.Parameters.Clear()



A segunda opção seria fazer um select isolado e depois disto fazer o insert.
DAMASCENO.CESAR 18/07/2017 23:10:53
#475276
só dando um Up!
KERPLUNK 18/07/2017 23:14:38
#475277
https://dev.mysql.com/doc/refman/5.7/en/replace.html
Tópico encerrado , respostas não são mais permitidas