none
Ajuda - Cursor com Insert ( Resolvido ) RRS feed

  • Pergunta

  • Pessoal bom dia !!

     

    Sou novo na área e gostaria de uma ajuda para montar um cursor.

    Tenho três (3) tabelas uma dbo.Usuarios, dbo.Empresas e dbo.EmpresaQueViaja.

    A tabela Usuarios tem UsuarioId na tabela Empresa tem EmpresaId, GrupoId, e na tabela dbo.EmpresaQueViaja tem UsuarioId e EmpresID.

    Dentro da tabela Empresa tem varias empresas do grupo 22 por exemplo, e gostaria de inserir o usuario 232 por exemplo, com todas as empresas do grupo 22 na tabela dbo.EmpresaQueViaja e fazer isso para cada usuario da tabela usuarios

    Obrigado pela ajuda.

     

     

    • Editado AndreLPTI terça-feira, 21 de setembro de 2010 11:23
    sexta-feira, 17 de setembro de 2010 13:20

Respostas

  • Boa Tarde AndreLPTI

    Se eu entendi bem, dado um  Grupo e um usuário, você precisa inserir na tabela dbo.EmpresaQueViaja, o usuario (UsuarioId) e todas as empresas que participam deste grupo, é isso mesmo? Se sim, acredito que o script abaixo resolva seu problema.

     

    CREATE TABLE #Usuarios
     ( UsuarioId INT IDENTITY,
      Nome VARCHAR(200) NULL
     )
    
    CREATE TABLE #Empresa
     (
      EmpresaId INT IDENTITY,
      GrupoId  INT,
      Nome VARCHAR(200) NULL
     )
    
    CREATE TABLE #EmpresaQueViaja
     (
      UsuarioId INT,
      EmpresaId INT
     )
    
    
    
    INSERT INTO #Usuarios VALUES ('Empreagado 1')
    INSERT INTO #Usuarios VALUES ('Empreagado 2')
    INSERT INTO #Usuarios VALUES ('Empreagado 3')
    INSERT INTO #Usuarios VALUES ('Empreagado 4')
    INSERT INTO #Usuarios VALUES ('Empreagado 5')
    INSERT INTO #Usuarios VALUES ('Empreagado 6')
    
    
    INSERT INTO #Empresa VALUES (10, 'Companhia 11')
    INSERT INTO #Empresa VALUES (10, 'Companhia 12')
    INSERT INTO #Empresa VALUES (10, 'Companhia 13')
    INSERT INTO #Empresa VALUES (20, 'Companhia 21')
    INSERT INTO #Empresa VALUES (20, 'Companhia 22')
    INSERT INTO #Empresa VALUES (20, 'Companhia 23')
    INSERT INTO #Empresa VALUES (20, 'Companhia 24')
    
    SELECT * FROM #Usuarios
    SELECT * FROM #Empresa
    SELECT * FROM #EmpresaQueViaja
    
    DECLARE @GRUPO    INT
    DECLARE @EmpresaId  INT
    DECLARE @UsuarioId  INT
    
    SET @GRUPO = 20
    SET @UsuarioId = 4
    
    DECLARE cursor_empresa CURSOR FOR 
     SELECT EmpresaId FROM #Empresa WHERE GrupoId = @GRUPO
    
    OPEN cursor_empresa
    FETCH NEXT FROM cursor_empresa INTO @EmpresaId
      
    WHILE @@FETCH_STATUS = 0 
    BEGIN
     select @EmpresaId, @Nome
    
     INSERT INTO #EmpresaQueViaja (UsuarioId, EmpresaId) VALUES (@UsuarioId, @EmpresaId)
     FETCH NEXT FROM cursor_empresa INTO @EmpresaId
    END
    
    CLOSE cursor_empresa
    DEALLOCATE cursor_empresa
    
    select * from #EmpresaQueViaja
    

     

    Espero ter ajudado.

    Abraço

    dTito


    hã?
    sexta-feira, 17 de setembro de 2010 19:49
  • DTito,

    Colega, tomei a liberdade de realizar uma pequena alteração do código, para tentar reproduzir as erros que o André, destacou.

    Andre,

    Acabei de executar o código de exemplo do DTito em meu ambiente, a única coisa que encontrei como falha, foi a falta da declaração da variável @Nome, fora isso, não identifiquei nada de errado, inclusive coloquei como comentário uma linha que estava sendo realizado um Select.

    Veja como ficou, o código:

    CREATE TABLE #Usuarios
     ( UsuarioId INT IDENTITY,
     Nome VARCHAR(200) NULL
     )
    
    CREATE TABLE #Empresa
     (
     EmpresaId INT IDENTITY,
     GrupoId INT,
     Nome VARCHAR(200) NULL
     )
    
    CREATE TABLE #EmpresaQueViaja
     (
     UsuarioId INT,
     EmpresaId INT
     )
    
    INSERT INTO #Usuarios VALUES ('Empreagado 1')
    INSERT INTO #Usuarios VALUES ('Empreagado 2')
    INSERT INTO #Usuarios VALUES ('Empreagado 3')
    INSERT INTO #Usuarios VALUES ('Empreagado 4')
    INSERT INTO #Usuarios VALUES ('Empreagado 5')
    INSERT INTO #Usuarios VALUES ('Empreagado 6')
    
    
    INSERT INTO #Empresa VALUES (10, 'Companhia 11')
    INSERT INTO #Empresa VALUES (10, 'Companhia 12')
    INSERT INTO #Empresa VALUES (10, 'Companhia 13')
    INSERT INTO #Empresa VALUES (20, 'Companhia 21')
    INSERT INTO #Empresa VALUES (20, 'Companhia 22')
    INSERT INTO #Empresa VALUES (20, 'Companhia 23')
    INSERT INTO #Empresa VALUES (20, 'Companhia 24')
    
    SELECT * FROM #Usuarios
    SELECT * FROM #Empresa
    SELECT * FROM #EmpresaQueViaja
    
    Declare @Nome VarChar(50) -- Declarei esta variável, pois estava faltando.
    
    DECLARE @GRUPO  INT
    DECLARE @EmpresaId INT
    DECLARE @UsuarioId INT
    
    SET @GRUPO = 20
    SET @UsuarioId = 4
    
    DECLARE cursor_empresa CURSOR FOR 
     SELECT EmpresaId FROM #Empresa WHERE GrupoId = @GRUPO
    
    OPEN cursor_empresa
    FETCH NEXT FROM cursor_empresa INTO @EmpresaId
     
    WHILE @@FETCH_STATUS = 0 
    BEGIN
     --select @EmpresaId, @Nome (Linha comentada)
    
     INSERT INTO #EmpresaQueViaja (UsuarioId, EmpresaId) VALUES (@UsuarioId, @EmpresaId)
     FETCH NEXT FROM cursor_empresa INTO @EmpresaId
    END
    
    CLOSE cursor_empresa
    DEALLOCATE cursor_empresa
    
    select * from #EmpresaQueViaja
    
    

     


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário]
    segunda-feira, 20 de setembro de 2010 12:47
  • André se entendi sua dúvida, vc não precisa de um curso p/ efetuar o insert.

    segue exemplo, baseado na estrutura postada pelo amigo dTito

    INSERT INTO 
      #EmpresaQueViaja
    SELECT 
      u.UsuarioID, E.EmpresaID 
    FROM 
      #Usuarios AS U CROSS JOIN #Empresa AS E 
    WHERE 
      E.GrupoId  = 20 --> Informar o Grupo de empresas
    AND u.UsuarioID = 5  --> Informar o Usuario q deseja cadastrar 
    

    Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino
    segunda-feira, 20 de setembro de 2010 15:12
  • André

    tente esse script e veja se ira trazer o resultado q deseja, caso sim é so descomentar a linha do insert.

     

    --INSERT INTO dbo.EmpresaQueViaja
    SELECT 
     u.UsuarioID, E.EmpresaID 
    FROM 
     dbo.Usuarios AS U CROSS JOIN dbo.Empresas AS E 
    WHERE 
     E.GrupoId = 22 
    

    Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino
    segunda-feira, 20 de setembro de 2010 18:01
  • Boa Noite Andre,

    Se está retornando esta mensagem, provavelmente a consulta que gera o cursor está gerando um valor NULL, ou tem grupo na tabela Empresa cujo EmpresaId é NULL.

    Execute a query:

     SELECT * FROM #Empresa WHERE GrupoId IS NOT NULL and EmpresaId IS NULL 

     

    Se a query acima retornar algum valor, significa que a tabela Empresa não está preenchida corretamente, então, na lógica do cursor que colocamos acima, voce deverá tratar quando o valor de @Empresa vier NULL para não executar a rotina de insert.

    WHILE @@FETCH_STATUS = 0

    BEGIN

     select @EmpresaId

     

    IF @EmpresaId IS NOT NULL

    BEGIN

       INSERT INTO #EmpresaQueViaja (UsuarioId, EmpresaId) VALUES (@UsuarioId, @EmpresaId)

    END

     FETCH NEXT FROM cursor_empresa INTO @EmpresaId

    END

     

     

    Abraço

    dtito


    hã?
    • Sugerido como Resposta DTito segunda-feira, 27 de setembro de 2010 19:06
    • Marcado como Resposta Gustavo Maia Aguiar segunda-feira, 20 de agosto de 2012 12:38
    terça-feira, 21 de setembro de 2010 01:41

Todas as Respostas

  • Andre,

    Não consegui entender o que você deseja fazer?


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário]
    • Marcado como Resposta AndreLPTI terça-feira, 21 de setembro de 2010 11:24
    • Não Marcado como Resposta AndreLPTI terça-feira, 21 de setembro de 2010 11:25
    sexta-feira, 17 de setembro de 2010 17:46
  • Boa Tarde AndreLPTI

    Se eu entendi bem, dado um  Grupo e um usuário, você precisa inserir na tabela dbo.EmpresaQueViaja, o usuario (UsuarioId) e todas as empresas que participam deste grupo, é isso mesmo? Se sim, acredito que o script abaixo resolva seu problema.

     

    CREATE TABLE #Usuarios
     ( UsuarioId INT IDENTITY,
      Nome VARCHAR(200) NULL
     )
    
    CREATE TABLE #Empresa
     (
      EmpresaId INT IDENTITY,
      GrupoId  INT,
      Nome VARCHAR(200) NULL
     )
    
    CREATE TABLE #EmpresaQueViaja
     (
      UsuarioId INT,
      EmpresaId INT
     )
    
    
    
    INSERT INTO #Usuarios VALUES ('Empreagado 1')
    INSERT INTO #Usuarios VALUES ('Empreagado 2')
    INSERT INTO #Usuarios VALUES ('Empreagado 3')
    INSERT INTO #Usuarios VALUES ('Empreagado 4')
    INSERT INTO #Usuarios VALUES ('Empreagado 5')
    INSERT INTO #Usuarios VALUES ('Empreagado 6')
    
    
    INSERT INTO #Empresa VALUES (10, 'Companhia 11')
    INSERT INTO #Empresa VALUES (10, 'Companhia 12')
    INSERT INTO #Empresa VALUES (10, 'Companhia 13')
    INSERT INTO #Empresa VALUES (20, 'Companhia 21')
    INSERT INTO #Empresa VALUES (20, 'Companhia 22')
    INSERT INTO #Empresa VALUES (20, 'Companhia 23')
    INSERT INTO #Empresa VALUES (20, 'Companhia 24')
    
    SELECT * FROM #Usuarios
    SELECT * FROM #Empresa
    SELECT * FROM #EmpresaQueViaja
    
    DECLARE @GRUPO    INT
    DECLARE @EmpresaId  INT
    DECLARE @UsuarioId  INT
    
    SET @GRUPO = 20
    SET @UsuarioId = 4
    
    DECLARE cursor_empresa CURSOR FOR 
     SELECT EmpresaId FROM #Empresa WHERE GrupoId = @GRUPO
    
    OPEN cursor_empresa
    FETCH NEXT FROM cursor_empresa INTO @EmpresaId
      
    WHILE @@FETCH_STATUS = 0 
    BEGIN
     select @EmpresaId, @Nome
    
     INSERT INTO #EmpresaQueViaja (UsuarioId, EmpresaId) VALUES (@UsuarioId, @EmpresaId)
     FETCH NEXT FROM cursor_empresa INTO @EmpresaId
    END
    
    CLOSE cursor_empresa
    DEALLOCATE cursor_empresa
    
    select * from #EmpresaQueViaja
    

     

    Espero ter ajudado.

    Abraço

    dTito


    hã?
    sexta-feira, 17 de setembro de 2010 19:49
  • dTito bom dia !!!

    Era exatamente isso que queria, quando rodei aqui na minha base esta dando erro Dizendo que não é possível inserir o valo NULL na coluna EmpresaId na tabela Usuarios_EmpresaQueViaja, vc pode me ajudar mais uma vez ?

    O que tenho que fazer para arrumar este.

     

    Obrigado novamente.

    segunda-feira, 20 de setembro de 2010 12:13
  • Andre,

    Neste caso, será necessário especificar dentro do cursor um valor para ser inserido sobre esta coluna na sua table Usuarios_EmpresaQueViaja.

    Mas verificando o DTito, esta sendo passado um valor dentro do Cursor para esta coluna e posteriormente inserida sobre sua table!!!!

    Em qual momento você esta recebendo esta mensagem de erro, é o ínicio da execução do Cursor?


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário]
    segunda-feira, 20 de setembro de 2010 12:43
  • DTito,

    Colega, tomei a liberdade de realizar uma pequena alteração do código, para tentar reproduzir as erros que o André, destacou.

    Andre,

    Acabei de executar o código de exemplo do DTito em meu ambiente, a única coisa que encontrei como falha, foi a falta da declaração da variável @Nome, fora isso, não identifiquei nada de errado, inclusive coloquei como comentário uma linha que estava sendo realizado um Select.

    Veja como ficou, o código:

    CREATE TABLE #Usuarios
     ( UsuarioId INT IDENTITY,
     Nome VARCHAR(200) NULL
     )
    
    CREATE TABLE #Empresa
     (
     EmpresaId INT IDENTITY,
     GrupoId INT,
     Nome VARCHAR(200) NULL
     )
    
    CREATE TABLE #EmpresaQueViaja
     (
     UsuarioId INT,
     EmpresaId INT
     )
    
    INSERT INTO #Usuarios VALUES ('Empreagado 1')
    INSERT INTO #Usuarios VALUES ('Empreagado 2')
    INSERT INTO #Usuarios VALUES ('Empreagado 3')
    INSERT INTO #Usuarios VALUES ('Empreagado 4')
    INSERT INTO #Usuarios VALUES ('Empreagado 5')
    INSERT INTO #Usuarios VALUES ('Empreagado 6')
    
    
    INSERT INTO #Empresa VALUES (10, 'Companhia 11')
    INSERT INTO #Empresa VALUES (10, 'Companhia 12')
    INSERT INTO #Empresa VALUES (10, 'Companhia 13')
    INSERT INTO #Empresa VALUES (20, 'Companhia 21')
    INSERT INTO #Empresa VALUES (20, 'Companhia 22')
    INSERT INTO #Empresa VALUES (20, 'Companhia 23')
    INSERT INTO #Empresa VALUES (20, 'Companhia 24')
    
    SELECT * FROM #Usuarios
    SELECT * FROM #Empresa
    SELECT * FROM #EmpresaQueViaja
    
    Declare @Nome VarChar(50) -- Declarei esta variável, pois estava faltando.
    
    DECLARE @GRUPO  INT
    DECLARE @EmpresaId INT
    DECLARE @UsuarioId INT
    
    SET @GRUPO = 20
    SET @UsuarioId = 4
    
    DECLARE cursor_empresa CURSOR FOR 
     SELECT EmpresaId FROM #Empresa WHERE GrupoId = @GRUPO
    
    OPEN cursor_empresa
    FETCH NEXT FROM cursor_empresa INTO @EmpresaId
     
    WHILE @@FETCH_STATUS = 0 
    BEGIN
     --select @EmpresaId, @Nome (Linha comentada)
    
     INSERT INTO #EmpresaQueViaja (UsuarioId, EmpresaId) VALUES (@UsuarioId, @EmpresaId)
     FETCH NEXT FROM cursor_empresa INTO @EmpresaId
    END
    
    CLOSE cursor_empresa
    DEALLOCATE cursor_empresa
    
    select * from #EmpresaQueViaja
    
    

     


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário]
    segunda-feira, 20 de setembro de 2010 12:47
  • Sim é no inicio, quando eu executo o código do dTito da certo mais quando passo pro meu banco ai da erro.

    segunda-feira, 20 de setembro de 2010 13:32
  • André,

    Você executou o script que eu alterei?


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário]
    segunda-feira, 20 de setembro de 2010 14:02
  • Sim rodei, o que vc féis da certo, mais quando eu executo no meu banco da erro.

    segunda-feira, 20 de setembro de 2010 14:13
  • André se entendi sua dúvida, vc não precisa de um curso p/ efetuar o insert.

    segue exemplo, baseado na estrutura postada pelo amigo dTito

    INSERT INTO 
      #EmpresaQueViaja
    SELECT 
      u.UsuarioID, E.EmpresaID 
    FROM 
      #Usuarios AS U CROSS JOIN #Empresa AS E 
    WHERE 
      E.GrupoId  = 20 --> Informar o Grupo de empresas
    AND u.UsuarioID = 5  --> Informar o Usuario q deseja cadastrar 
    

    Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino
    segunda-feira, 20 de setembro de 2010 15:12
  • Pessoal boa tarde

    Primeiramente muito obrigado pela ajuda e pronto atendimento, mais acho que não me expliquei corretamente, o que o dTito e o Junior passou e mais ou menos o que preciso só esta faltando a parte de usuários pois para cada usuário vai ser cadastrado todas as empresas.

    Obrigado.

     

    segunda-feira, 20 de setembro de 2010 17:46
  • André

    tente esse script e veja se ira trazer o resultado q deseja, caso sim é so descomentar a linha do insert.

     

    --INSERT INTO dbo.EmpresaQueViaja
    SELECT 
     u.UsuarioID, E.EmpresaID 
    FROM 
     dbo.Usuarios AS U CROSS JOIN dbo.Empresas AS E 
    WHERE 
     E.GrupoId = 22 
    

    Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino
    segunda-feira, 20 de setembro de 2010 18:01
  • Boa Noite Andre,

    Se está retornando esta mensagem, provavelmente a consulta que gera o cursor está gerando um valor NULL, ou tem grupo na tabela Empresa cujo EmpresaId é NULL.

    Execute a query:

     SELECT * FROM #Empresa WHERE GrupoId IS NOT NULL and EmpresaId IS NULL 

     

    Se a query acima retornar algum valor, significa que a tabela Empresa não está preenchida corretamente, então, na lógica do cursor que colocamos acima, voce deverá tratar quando o valor de @Empresa vier NULL para não executar a rotina de insert.

    WHILE @@FETCH_STATUS = 0

    BEGIN

     select @EmpresaId

     

    IF @EmpresaId IS NOT NULL

    BEGIN

       INSERT INTO #EmpresaQueViaja (UsuarioId, EmpresaId) VALUES (@UsuarioId, @EmpresaId)

    END

     FETCH NEXT FROM cursor_empresa INTO @EmpresaId

    END

     

     

    Abraço

    dtito


    hã?
    • Sugerido como Resposta DTito segunda-feira, 27 de setembro de 2010 19:06
    • Marcado como Resposta Gustavo Maia Aguiar segunda-feira, 20 de agosto de 2012 12:38
    terça-feira, 21 de setembro de 2010 01:41
  • dTito,

     

    Muito Obrigado, deu certo !!

    Pessoal agradeço a ajuda de todos e o pronto atendimento, valeu mesmo.

    Abraço

    terça-feira, 21 de setembro de 2010 11:22
  • Boa tarde pessoal,

    estou aprendendo sobre sql server e estou com problema em relação a um script.

    Preciso fazer uma consulta em uma tabela e gravar essas informações em outra tabela, fazendo algumas modificações na informação.

    Pensei em usar cursor com um loop while para realizar a gravação.

    Criei um script para tal, mas não obtive sucesso na gravação.

    Peço ajuda para tentar resolver o problema.

    Segue abaixo o script que  tenho trabalhando.

    Desde de já agradeço.

    --Declara as variaveis

    DECLARE @nome  VarChar(150)

    DECLARE @codpessoa VarChar(150)

    DECLARE @key int

    --setando ela como 0

    SET @key = 1

    --Declara o cursor

    DECLARE cursor_empresa CURSOR FOR

    SELECT nome,codfuncao FROM pfunc

    --Abre o cursor

    OPEN cursor_empresa

    --atribui o valor do 1º registro do cursor as variáveis

    FETCH NEXT FROM cursor_empresa INTO @nome, @codpessoa

    --Executa um loop para montar os vetores e realizar as gravações

    WHILE @@FETCH_STATUS = 0 

    BEGIN 

    --Grava as informações do Next nas variaveis

    SELECT @nome, @codpessoa

    --Inicio do comando de gravação

    INSERT INTO TVEN(CODVEN, NOME) VALUES (@key, @nome)

    --Adianta o ponteiro uma posição

    FETCH NEXT FROM cursor_empresa INTO @nome, @codpessoa

    --incremento na variavel

    SET @key = @key + 1

    END

    CLOSE cursor_empresa

    DEALLOCATE cursor_empresa



    quinta-feira, 16 de agosto de 2012 19:50
  • Bom Dia,

    Seria muito mais rápido (e com um código de melhor qualidade), se você fizesse um INSERT com SELECT.

    INSERT INTO TVEN (CODVEN, NOME)
    SELECT nome,codfuncao FROM pfunc

    [ ]s,

    Gustavo Maia Aguiar
    Blog: http://gustavomaiaaguiar.wordpress.com
    Vídeos:http://www.youtube.com/user/gmasql


    Classifique as respostas. O seu feedback é imprescindível

    segunda-feira, 20 de agosto de 2012 12:39