Inquiridor
Inserir na Tabela os dados da Temporária com condição

Pergunta
-
Olá pessoal preciso de uma ajuda
Eu fiz um procedure que tem que fazer coisa:
1º Cria um temporária
2º Lê um txt e insere nesta tabela temporária
3º Inseri na tabela não temporaria os valores que ainda não existirem
4º Atualizar os registros que já existam
5º Drop a tabela temporária
Eu fiz o 1º, 2º e 3º itens mas não estou perdida. Vejam o codigo e me digam se conseguem ajudar.
USE [Relatorios_Testes] GO /****** Object: StoredProcedure [dbo].[sp_Usuario_Import] Script Date: 02/27/2009 14:21:42 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER OFF GO ALTER PROCEDURE [dbo].[sp_Usuario_Import] @PathFileName varchar(100), AS --Step 1: Build Valid BULK INSERT Statement - Passo 1: Construa Válida BULK INSERT Statement DECLARE @SQL varchar(2000) Declare @linhas int Declare @id_usuario int CREATE TABLE Tmp_Usuario( Id_usuario varchar (15) NOT NULL, Nome varchar (50) NOT NULL, Login varchar (50) NOT NULL, Data_admissao datetime null, Data_demissao datetime null ) BEGIN BULK INSERT Tmp_Usuario FROM @PathFileName WITH ( FIELDTERMINATOR = '|', KEEPNULLS); END WITH Usuarios as( SELECT usuario.* FROM tb_usuario usuario, tmp_usuario tmp WHERE usuario.id_usuario = tmp.id_usuario) INSERT INTO tb_usuario(id_usuario, nome, login, data_admissao, data_demissao) SELECT DISTINCT usuario.id_usuario, usuario.nome, usuario.login, usuario.data_admissao, usuario.data_demissao FROM tmp_usuario tmp, tb_usuario usuario WHERE (tmp.id_usuario = usuario.id_usuario) AND NOT EXISTS ( SELECT * FROM tb_usuario usuario WHERE usuario.id_usuario = tmp.id_usuario ) UPDATE tb_usuario SET id_usuario = expression, nome = , login, data_admissao, data_demissao
Todas as Respostas
-
Boa Noite,
Primeiramente eu substituiria o CREATE TABLE TMP_Usuario por CREATE TABLE #TMP_Usuario. A segunda construção é uma tabela temporária de fato. Não faria muita diferença se você dropa a tabela ao final do processo, mas criar uma tabela temporária irá sobrecarregar o TEMPDB e as operações são parcialmente logadas. Criar a tabela de forma não temporária irá logar todas as atividades que além de mais lentas, ficarão presentes no log de transações aumentando o seu tamanho e a duração de um possível RESTORE. Algumas outras considerações:
- Não entendi a criação da CTE Usuarios, uma vez que ela é definida mas não é aproveitada nos passos posteriores.
- Considerando que você está capturando registros das tabelas de usuário e tmp_usuario e que (presumo eu) o ID do usuário é único, não vejo razão para utilizar o DISTINCT.
- Se você o INSERT só será feito com os registros que ainda não existem, não faria sentido tentar correlacionar as tabelas com o ID usuário
- É mais interessante atualizar primeiro e inserir depois, pois, a atualização irá contemplar menos registros
Sua situação é uma excelente aplicação do comando MERGE disponível no SQL Server 2008, mas como creio não ser essa a sua versão do SQL Server, segue um esboço dos passos posteriores.
UPDATE tb_usuario SET nome = tmp.nome, [login] = [login], data_admissao = data_admissao, data_demissao = data_demissao FROM tb_usuario INNER JOIN Tmp_Usuario ON tb_usuario.id_usuario = tmp_usuario.id_usuario INSERT INTO tb_usuario(id_usuario, nome, login, data_admissao, data_demissao) SELECT usuario.id_usuario, usuario.nome, usuario.login, usuario.data_admissao, usuario.data_demissao FROM tb_usuario usuario WHERE NOT EXISTS (SELECT * FROM tmp_usuario tmp WHERE tmp.id_usuario = usuario.id_usuario) [ ]s,
Gustavo Maia Aguiar
http://gustavomaiaaguiar.spaces.live.com
Classifique as respostas. O seu feedback é imprescindível -
-
-
-
-
Alexandre,
Realmente o link do nosso amigo esta correto, eu sem querer acabei fazendo uma pequena confusão com outro recurso.
Estou excluindo o post anterior.
Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA -
-