none
CURSOR para várias colunas RRS feed

  • Pergunta

  • Olá Pessoal, tudo bem?

    Comecei a usar/aprender T-SQL há duas semanas. Então sou bem noob.

    Tenho uma tabela temporária de 63 colunas. O conteúdo dela é a importação de uma planilha.

    Preciso fazer um SELECT nesta tabela e identificar os dados. Não existe uma PK ou qualquer coisa parecida. Pesquisei e vi que usando CURSOR e WHILE iria satisfazer a minha necessidade. Porém em todos os exemplos que li no FETCH é usado INTO.

    Minha pergunta é: Dentro do WHILE posso usar Cursor.COLUNA para não precisar definir 63 variáveis?

    DECLARE curAluno CURSOR FOR SELECT * FROM estudo.dbo.tmp_aluno OPEN curAluno; FETCH NEXT FROM curAluno; WHILE @@FETCH_STATUS = 0 BEGIN CASE WHEN curAluno.Coluna1 = 41 THEN INSERT INTO tabela ( curAluno.Coluna1, curAluno.Coluna2, ..., curAluno.Coluna63 )

    WHEN curAluno.Coluna1 = 42 THEN UPDATE pagamento ( curAluno.Coluna1, curAluno.Coluna45, curAluno.Coluna56 )

    FETCH NEXT FROM curAluno; END CLOSE curAluno; DEALLOCATE curAluno;

    domingo, 18 de outubro de 2015 23:06

Respostas

  • Rogerio,

    Bom, a tabela temporária você já tem.

    Como não sei a estrutura do arquivo ou da tabela, vou imaginar que dentro das linhas 42 (as linhas "filhas") existe uma coluna que seja o identificador da linha 41. Se isso for verdade, o que você precisa é basicamente de 2 "insert ... select"

    Primeiro insira na tabela todos os que tem a linha 41 na tua temporária. Após, insira os que tem 42. Aí você tem duas possibilidades:

    Se as duas tabelas estão sendo referenciadas pelos códigos que vieram do arquivo, trabalho finalizado, pois as constraints já estão garantidas.

    Caso essa referência seja por uma PK auto-incremento (o que normalmente acontece), aí você vai precisar de um trabalho adicional, que é desabilitar a constraint antes da carga da segunda tabela. E, ao terminar os inserts, fazer um update na coluna, fazendo um select entre as tabelas. Ao terminar o update, reabilitar a constraint, garantindo a verificação, para não deixá-la "not trusted".

    É um pouco mais trabalhoso, mas dependendo da quantidade de registros, pode ser mais performático que o cursor.

    Espero ter deixado o processo um pouco mais claro... Agora, claro... Se você não se sentir seguro com o processo "em lote", faça o cursor. 

    Se tiver alguma dúvida, só falar.

    []'s!



    /* Logan Destefani Merazzi - DBA | @LoganMerazzi | http://www.merazzi.eti.br
    Se a resposta for útil, vote nela. Se resolveu, marque-a como resposta. */

    • Marcado como Resposta Marcos SJ segunda-feira, 19 de outubro de 2015 12:24
    segunda-feira, 19 de outubro de 2015 10:32

Todas as Respostas

  • Rogerio,

    O que você está querendo fazer, não é possível. Você realmente precisa trabalhar com as variáveis para realizar o fetch nelas e ter o status correto. Claro que se você não precisar de todas as colunas, não é preciso declarar uma variável para cada coluna... ajuste o teu select para usar apenas as colunas realmente desejadas.

    Agora, se você nos disser melhor quais são as validações que você precisa fazer, podemos bolar algo que talvez não necessite de um cursor.

    Cursores, normalmente, são péssimos no que tange a performance.

    Poste mais detalhes e vamos ver se dá para fazermos algo sem cursor. Se não for possível, aí você vai ter que trabalhar com todas as variáveis que deseja.

    []'s!


    /* Logan Destefani Merazzi - DBA | @LoganMerazzi | http://www.merazzi.eti.br
    Se a resposta for útil, vote nela. Se resolveu, marque-a como resposta. */

    segunda-feira, 19 de outubro de 2015 00:41
  • Olá Logan

    Muito obrigado pela resposta.

    Recebi um arquivo governamental onde cada linha tem um identificador.

    Se a linha tiver identificador 40 ignoro a linha.

    Se a linha tiver identificador 41 realizo um INSERT em uma determinada tabela usando algumas colunas.

    Se a linha tiver identificador 42 realizo um INSERT em outra tabela usando todas as colunas.

    A linha 42, podendo ter 1 ou mais, são detalhes da linha 41 porém o relacionamento entre elas teria que ser criado. Por isso preciso ler linha a linha.

    Não sei se consegui dar os detalhes que você pediu.

    segunda-feira, 19 de outubro de 2015 09:58
  • Rogerio,

    Bom, a tabela temporária você já tem.

    Como não sei a estrutura do arquivo ou da tabela, vou imaginar que dentro das linhas 42 (as linhas "filhas") existe uma coluna que seja o identificador da linha 41. Se isso for verdade, o que você precisa é basicamente de 2 "insert ... select"

    Primeiro insira na tabela todos os que tem a linha 41 na tua temporária. Após, insira os que tem 42. Aí você tem duas possibilidades:

    Se as duas tabelas estão sendo referenciadas pelos códigos que vieram do arquivo, trabalho finalizado, pois as constraints já estão garantidas.

    Caso essa referência seja por uma PK auto-incremento (o que normalmente acontece), aí você vai precisar de um trabalho adicional, que é desabilitar a constraint antes da carga da segunda tabela. E, ao terminar os inserts, fazer um update na coluna, fazendo um select entre as tabelas. Ao terminar o update, reabilitar a constraint, garantindo a verificação, para não deixá-la "not trusted".

    É um pouco mais trabalhoso, mas dependendo da quantidade de registros, pode ser mais performático que o cursor.

    Espero ter deixado o processo um pouco mais claro... Agora, claro... Se você não se sentir seguro com o processo "em lote", faça o cursor. 

    Se tiver alguma dúvida, só falar.

    []'s!



    /* Logan Destefani Merazzi - DBA | @LoganMerazzi | http://www.merazzi.eti.br
    Se a resposta for útil, vote nela. Se resolveu, marque-a como resposta. */

    • Marcado como Resposta Marcos SJ segunda-feira, 19 de outubro de 2015 12:24
    segunda-feira, 19 de outubro de 2015 10:32