Usuário com melhor resposta
Problemas com Lógica (Cursor/OpenRowSet/Update)

Pergunta
-
Gente,
Estou com um problema de lógica, o caso é que tenho duas tabelas:
Teste_Area Teste_Nome
ID_Area Nome Id_Nome Nome ID_Area
1 DBA 1 Tábata 2
2 Qualidade 2 Fulano NULL
3 Programador 3 Fulano1 3
Em excel tenho a tabela na íntegra:
Nome Area
Tábata Qualidade
Fulano
Fulano1 Programador
Preciso subir isso sem usar #temp, com um código mais leve possível.
Eu sei que é fácil, mas travei total, vocês podem me ajudar?
Fiz o seguinte:
--' Carrega tabela area
INSERT INTO TESTE_AREA
SELECT [Area] FROM OPENROWSET('Microsoft.Jet.OleDB.4.0','EXCEL 8.0;Database=C:\Teste_Nome.XLS',Nomes$)
WHERE [Area] not in(SELECT nome FROM TESTE_AREA) ORDER BY [Area]
--Declara variaveis
Declare @Nome varchar(150), @Area varchar(150)-- Zera variaveis
Set @Nome = ''
Set @Area = ''-- Inicia Cursor
DECLARE Teste_Nome_Cursor CURSOR
FOR
--' Consulta os dados da tabela
SELECT [Nome], [Area] FROM OPENROWSET('Microsoft.Jet.OleDB.4.0','EXCEL 8.0;Database=C:\Teste_Nome.XLS',Nomes$)OPEN Teste_Nome_Cursor
FETCH NEXT FROM Teste_Nome_Cursor--' Obtem valores
SELECT @Nome = [Nome],
@Area = [Area]
FROM OPENROWSET('Microsoft.Jet.OleDB.4.0','EXCEL 8.0;Database=C:\Teste_Nome.XLS',Nomes$)
WHILE @@FETCH_STATUS = 0
BEGINUPDATE OPENROWSET('Microsoft.Jet.OleDB.4.0','EXCEL 8.0;Database=C:\Teste_Nome.XLS',Nomes$)
SET [Area] = TA.ID_Area
FROM OPENROWSET ('Microsoft.Jet.OleDB.4.0','EXCEL 8.0;Database=C:\Teste_Nome.XLS',Nomes$) AS S
INNER JOIN TESTE_AREA AS TA ON (TA.NOME = S.[Area])
WHERE TA.Nome = S.[Area]FETCH NEXT FROM Teste_Nome_Cursor
END
CLOSE Teste_Nome_Cursor
DEALLOCATE Teste_Nome_Cursor
Mas o arquivo atualiza com o id da ultima verificação.
Muito obrigada amigos.
Respostas
-
Bom dia tábata, vou postar um código de acordo com meu entendimento referente a sua dúvida, veja se é isso q deseja.
-- Inseri na tabela TESTE_AREA as Area ainda não inclusas na tabela. INSERT INTO Teste_Area SELECT Ex.[Area] FROM OPENROWSET('Microsoft.Jet.OleDB.4.0','EXCEL 8.0;Database=C:\Teste_Nome.XLS',Nomes$) as Ex WHERE NOT EXISTS(SELECT Nome FROM Teste_Area WHERE Nome = Ex.[area]) ORDER BY Ex.[Area] ASC -- Select q Exibe o Id_Nome, Nome e ID_Area através de join. SELECT tn.[Id_Nome], tn.[Nome], ta.[ID_Area ] FROM OPENROWSET('Microsoft.Jet.OleDB.4.0','EXCEL 8.0;Database=C:\Teste_Nome.XLS',Nomes$) as Ex INNER JOIN Teste_Area AS ta ON ta.[Nome] = ex.[Area] INNER JOIN Teste_Nome AS tn ON tn.[Nome] = ex.[Nome] -- Atualiza a coluna Id_Area da tabela Teste_Nome UPDATE tn SET tn.Id_Area = ta.Id_Area FROM OPENROWSET('Microsoft.Jet.OleDB.4.0','EXCEL 8.0;Database=C:\Teste_Nome.XLS',Nomes$) as Ex INNER JOIN Teste_Area AS ta ON ta.[Nome] = ex.[Area] INNER JOIN Teste_Nome AS tn ON tn.[Nome] = ex.[Nome]
Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino- Sugerido como Resposta Leonardo Marcelino sexta-feira, 11 de dezembro de 2009 16:30
- Marcado como Resposta Tábata_000 sexta-feira, 11 de dezembro de 2009 16:36
Todas as Respostas
-
-
Oi,
Então preciso subir a tabela do excel para minha base, com o código da FK ao invés da informação.
Preciso carregar também a tabela de relacionamento.
O que eu tenho? Essas duas tabelas Teste_Area ,Teste_Nome no banco.
Onde está os dados? No excel.
O que preciso fazer? Subir os dados, já com as informações relacionadas para essas duas tabelas do banco, sem usar tabelas temporárias.
Eu estou usando SQL Server 2000.
Obrigada Leonardo! -
Bom dia tábata, vou postar um código de acordo com meu entendimento referente a sua dúvida, veja se é isso q deseja.
-- Inseri na tabela TESTE_AREA as Area ainda não inclusas na tabela. INSERT INTO Teste_Area SELECT Ex.[Area] FROM OPENROWSET('Microsoft.Jet.OleDB.4.0','EXCEL 8.0;Database=C:\Teste_Nome.XLS',Nomes$) as Ex WHERE NOT EXISTS(SELECT Nome FROM Teste_Area WHERE Nome = Ex.[area]) ORDER BY Ex.[Area] ASC -- Select q Exibe o Id_Nome, Nome e ID_Area através de join. SELECT tn.[Id_Nome], tn.[Nome], ta.[ID_Area ] FROM OPENROWSET('Microsoft.Jet.OleDB.4.0','EXCEL 8.0;Database=C:\Teste_Nome.XLS',Nomes$) as Ex INNER JOIN Teste_Area AS ta ON ta.[Nome] = ex.[Area] INNER JOIN Teste_Nome AS tn ON tn.[Nome] = ex.[Nome] -- Atualiza a coluna Id_Area da tabela Teste_Nome UPDATE tn SET tn.Id_Area = ta.Id_Area FROM OPENROWSET('Microsoft.Jet.OleDB.4.0','EXCEL 8.0;Database=C:\Teste_Nome.XLS',Nomes$) as Ex INNER JOIN Teste_Area AS ta ON ta.[Nome] = ex.[Area] INNER JOIN Teste_Nome AS tn ON tn.[Nome] = ex.[Nome]
Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino- Sugerido como Resposta Leonardo Marcelino sexta-feira, 11 de dezembro de 2009 16:30
- Marcado como Resposta Tábata_000 sexta-feira, 11 de dezembro de 2009 16:36
-
Leandro era praticamente isso! Obrigada=D
Só subi o restante da tabela.
Eu estava viajando com cursor... Realmente meu problema era com lógica! Vlw.INSERT INTO Teste_Area SELECT Ex.[Area] FROM OPENROWSET('Microsoft.Jet.OleDB.4.0','EXCEL 8.0;Database=C:\Teste_Nome.XLS',Nomes$) as Ex WHERE NOT EXISTS(SELECT Nome FROM Teste_Area WHERE Nome = Ex.[area]) AND [Area] IS NOT NULL ORDER BY Ex.[Area] ASC INSERT INTO Teste_Nome SELECT convert(varchar(150), Ex.[Nome]), null FROM OPENROWSET('Microsoft.Jet.OleDB.4.0','EXCEL 8.0;Database=C:\Teste_Nome.XLS',Nomes$) as Ex WHERE Ex.[Nome] IS NOT NULL -- Select q Exibe o Id_Nome, Nome e ID_Area através de join. SELECT tn.[Id_Nome], tn.[Nome], ta.[ID_Area ] FROM OPENROWSET('Microsoft.Jet.OleDB.4.0','EXCEL 8.0;Database=C:\Teste_Nome.XLS',Nomes$) as Ex INNER JOIN Teste_Area AS ta ON ta.[Nome] = ex.[Area] INNER JOIN Teste_Nome AS tn ON tn.[Nome] = ex.[Nome] -- Atualiza a coluna Id_Area da tabela Teste_Nome UPDATE tn SET tn.Id_Area = ta.Id_Area FROM OPENROWSET('Microsoft.Jet.OleDB.4.0','EXCEL 8.0;Database=C:\Teste_Nome.XLS',Nomes$) as Ex INNER JOIN Teste_Area AS ta ON ta.[Nome] = ex.[Area] INNER JOIN Teste_Nome AS tn ON tn.[Nome] = ex.[Nome]
-