Usuário com melhor resposta
Ajuda - Cursor com Insert ( Resolvido )

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
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ã?- Marcado como Resposta Gustavo Maia Aguiar segunda-feira, 20 de agosto de 2012 12:38
-
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]- Marcado como Resposta Gustavo Maia Aguiar segunda-feira, 20 de agosto de 2012 12:38
-
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- Marcado como Resposta Gustavo Maia Aguiar segunda-feira, 20 de agosto de 2012 12:38
-
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- Marcado como Resposta Gustavo Maia Aguiar segunda-feira, 20 de agosto de 2012 12:38
-
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
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] -
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ã?- Marcado como Resposta Gustavo Maia Aguiar segunda-feira, 20 de agosto de 2012 12:38
-
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.
-
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] -
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]- Marcado como Resposta Gustavo Maia Aguiar segunda-feira, 20 de agosto de 2012 12:38
-
-
-
-
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- Marcado como Resposta Gustavo Maia Aguiar segunda-feira, 20 de agosto de 2012 12:38
-
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.
-
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- Marcado como Resposta Gustavo Maia Aguiar segunda-feira, 20 de agosto de 2012 12:38
-
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
-
-
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
- Editado DanielBorgesOliveira quinta-feira, 16 de agosto de 2012 19:51
-
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/gmasqlClassifique as respostas. O seu feedback é imprescindível
- Sugerido como Resposta Gustavo Maia Aguiar segunda-feira, 20 de agosto de 2012 15:44