none
T-SQL RETORNA DADOS NO CONSOLE MAS NÃO RETORNA NO OBJETO CONNECTION RRS feed

  • 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
    END

    Já 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
    domingo, 2 de agosto de 2015 21:54

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
    terça-feira, 4 de agosto de 2015 17:39

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.

    segunda-feira, 3 de agosto de 2015 14:22
  • 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
    terça-feira, 4 de agosto de 2015 00:17
  • 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.

    terça-feira, 4 de agosto de 2015 02:11
  • 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.

    terça-feira, 4 de agosto de 2015 06:26
  • 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
    terça-feira, 4 de agosto de 2015 17:39
  • 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.

    quarta-feira, 5 de agosto de 2015 20:16