Usuário com melhor resposta
T-SQL RETORNA DADOS NO CONSOLE MAS NÃO RETORNA NO OBJETO CONNECTION

Pergunta
-
Primeiramente, gostaria de informar que estou iniciando agora em T-sql. Criei o código abaixo, que retorna no console a coluna "TOTAL" preenchida com o valor 1, conforme previsto, mas quando executado através do objecto connection, o recordset não é aberto, e consequentemente dá o erro que a coluna não foi localizada.
USE OSCAPTURA;
DECLARE @TOTAL INT
DECLARE @CODIGO CHAR(14)
DECLARE TMO_CURSOR CURSOR FOR
SELECT CODIGO FROM TMO WHERE KM='1' AND PLANO='1'
OPEN TMO_CURSOR;
SET @CODIGO=0
FETCH NEXT FROM TMO_CURSOR
INTO @CODIGO
USE BANCOPRODUCAO;
CLOSE TMO_CURSOR; DEALLOCATE TMO_CURSOR
BEGIN
SELECT COUNT(SOF_OSS.TM_CD) AS TOTAL FROM (SOF_OSS LEFT JOIN SOF_TM ON SOF_OSS.TM_CD=SOF_TM.TM_CD) LEFT JOIN SOF_OS ON SOF_OSS.OS_NR=SOF_OS.OS_NR WHERE VE_NR='0025907' AND SOF_OSS.TM_CD = @CODIGO
ENDJá não sei mais o que tentar, a unica solução que encontrei é salvar o resultado em uma tabela temporária e recuperar com outro select. Se alguém souber me informar uma solução para isso ficarei muito grato.
- Editado RGBARROS domingo, 2 de agosto de 2015 22:09
Respostas
-
RGBarros,
Concordo com o Eric, você esta fazendo a troca do contexto de conexão quando troca de banco de dados, neste caso, o processamento que você realiza acaba não sendo o que realmente necessita, pois o SQL Server tem que ficar mudando de banco de dados e processando possivelmente objetos que não condizem com o que você esta acessando.
Além disso, o uso do Cursor é uma solução interessante mas que requer cuidados no seu processamento, para que o mesmo não venha a ocasionar impactos.
Pedro Antonio Galvao Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]
- Marcado como Resposta Marcos SJ quarta-feira, 5 de agosto de 2015 20:15
Todas as Respostas
-
Olá RGBARROS,
Tudo bem?
Poderia por gentileza postar aqui o código de erro gerado?
Atenciosamente
Marcos Roberto de Souza Junior
Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita
MSDN Community Support
Por favor, lembre-se de Marcar como Resposta as respostas que resolveram o seu problema. Essa e uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.
-
Olá Marcos,
Quando executo o codigo pelo console, ele funciona perfeitamente, retornando a uma coluna de nome TOTAL com um registro de valor 1. Perfeito, conforme esperado. Mas quando executo o mesmo código pelo objeto connection, e tento ler o recordset retornado, procurando pela coluna "TOTAL", apresenta o erro "3265 O ítem não pode ser encontrado na coleção correspondente ao nome ou ao ordinal solicitado." Quando tento ler a propriedade recordcount, apresenta o erro de que o objeto não está aberto, portanto na verdade, o código não está retornando nenhum recorset. Não intendo como pode funcionar no console e não funcionar no programa...
Fiz também o seguinte teste, ao invés de retornar o recorset, eu salvo o resultado em uma tabela temporária, e depois faço a leitura da mesma com outro select. Desta forma funciona também, mas como o volume de informações é muito grande, o tempo de execução seria muito sacrificado.- Editado RGBARROS terça-feira, 4 de agosto de 2015 00:38
-
Olá Marcos,
Quando executo o codigo pelo console, ele funciona perfeitamente, retornando a uma coluna de nome TOTAL com um registro de valor 1. Perfeito, conforme esperado. Mas quando executo o mesmo código pelo objeto connection, e tento ler o recordset retornado, procurando pela coluna "TOTAL", apresenta o erro "3265 O ítem não pode ser encontrado na coleção correspondente ao nome ou ao ordinal solicitado." Quando tento ler a propriedade recordcount, apresenta o erro de que o objeto não está aberto, portanto na verdade, o código não está retornando nenhum recorset. Não intendo como pode funcionar no console e não funcionar no programa...
Fiz também o seguinte teste, ao invés de retornar o recorset, eu salvo o resultado em uma tabela temporária, e depois faço a leitura da mesma com outro select. Desta forma funciona também, mas como o volume de informações é muito grande, o tempo de execução seria muito sacrificado. -
Por que tantos "USE" e porque esta criando um cursor pra retornar um código?
porque não faz:
select @variavel = campo from x where ....
ou
set @variavel = (select top 1 campo from .... ) ; ?
e não entendi as mudanças de banco de dados... o recordset ou .net sqlcliente (não sei qual esta usando) pode ta gerando outro recorset, tenta o nextresult() ou no adodb. não lembro qual seria o comando...
Desenvolvedor de sistemas VB6, ASP, ASP.NET, C#, VB.NET, SQL Server, Oracle e MySql.
- Sugerido como Resposta Junior Galvão - MVPMVP terça-feira, 4 de agosto de 2015 17:39
-
RGBarros,
Concordo com o Eric, você esta fazendo a troca do contexto de conexão quando troca de banco de dados, neste caso, o processamento que você realiza acaba não sendo o que realmente necessita, pois o SQL Server tem que ficar mudando de banco de dados e processando possivelmente objetos que não condizem com o que você esta acessando.
Além disso, o uso do Cursor é uma solução interessante mas que requer cuidados no seu processamento, para que o mesmo não venha a ocasionar impactos.
Pedro Antonio Galvao Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]
- Marcado como Resposta Marcos SJ quarta-feira, 5 de agosto de 2015 20:15
-
Boa tarde,
Por falta de retorno do usuário, esta thread será encerrada.
Caso seja necessário, por gentileza, abra uma thread nova.
Atenciosamente
Marcos Roberto de Souza Junior
Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita
MSDN Community Support
Por favor, lembre-se de Marcar como Resposta as respostas que resolveram o seu problema. Essa e uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.