PROBLEMA COM SQL INSERT WHERE NOT EXISTS
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:
Gostaria de saber se é erro meu em montar a consulta SQL ou é necessário haver registros para funcionar.
Obrigado
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
DAMASCENO.CESAR,
Faz um count e verifique se existem registros na tabela.
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;[Ô]
GUIMORAES, não funcionou, mas obrigado. Estou encerrando o expediente agora, amanhã retorno.
GUIMORAES, baseado em seu exemplo também tentei:
e a variação:
e nenhuma funcionou, se alguem tiver mais ideias...
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...
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!
A segunda opção seria fazer um select isolado e depois disto fazer o insert.
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.
só dando um Up!
https://dev.mysql.com/doc/refman/5.7/en/replace.html
Tópico encerrado , respostas não são mais permitidas