Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

paginad

Insert por String

Recommended Posts

Fala moçada tranquilo. Vejam se podem me ajudar.

 

Eu to montando um sistema e preciso importar muitos dados de outro sistema. Não tenho acesso nenhum e não posso alterar nada do sistema que fornece os dados.

 

Eu recebo por string o seguinte:

 

INSERT INTO MODELO(ID_MODELO, MODELO) VALUES(1, BLUSA)

INSERT INTO COR(ID_COR, ID_MODELO, COR) VALUES(1, 1, PRETA)

INSERT INTO COR(ID_COR, ID_MODELO, COR) VALUES(2, 1, BRANCA)

 

INSERT INTO MODELO(ID_MODELO, MODELO) VALUES(2, CALÇA)

INSERT INTO COR(ID_COR, ID_MODELO, COR) VALUES(3, 2, PRETA)

INSERT INTO COR(ID_COR, ID_MODELO, COR) VALUES(4, 2, BRANCA)

 

Esse String tem mais um menos umas Mil linhas. Eu insiro isso direto no banco. Até ai tudo bem. A questão é, como eu posso fazer usando SP ou não para validar se já existe o produto?

 

Lebrando que eu recebo essa string igualzinha está ai. Já com insert e tudo, tipo é só copiar e colocar no Management Studio e está inserida. Problema que tenho que validar antes para não inserir linhas repetidas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O melhor seria criar uma constraint de FK ou de UK na tabela.

 

Clique aqui

 

Se a idéia é validação, cria uma tabela temporaria para inserir estes dados, mas com a FK e UK, como falou o Motta.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Legal, ahcei válida a ideia de ter tabelas temporárias. Não havia pensado nisso. Em linhas gerais, fazendo um resumo como seriam as ações.

 

1. Inserir os dados na tabela original

2. Insetir os dados na tabela temporária

3. Como eu faria para comparar as 2 e inserir na original só que o que novo. Só os registros novos?

Compartilhar este post


Link para o post
Compartilhar em outros sites

mais algumas idéias:

 

1. Inserir os dados na tabela original

2. Insetir os dados na tabela temporária

outra idéia seria colocar as FK na tabela original

e pra evitar erros pode usar o comando EXISTS

e mesmo que não puder colocar as FK na tabela original, ainda sim podes usar o comando EXISTS para controlar o que já foi inserido

 

3. Como eu faria para comparar as 2 e inserir na original só que o que novo. Só os registros novos?

uma opção para comparação é o MERGE, mas só para SQL Server 2008

mais sobre MERGE: http://forum.imasters.com.br/topic/396962-utilizando-o-comando-merge/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ainda estou com dúvidas, preciso pesquisar um pouco mais. Tudo isso é dentro de uma SP?

 

Esse MERGE é fantástico. Preciso ver se roda na versão que tenho.

Compartilhar este post


Link para o post
Compartilhar em outros sites

+/- assim:

 

/* REPRENSENTA SUA TABELA FINAL  - INICIO */
DECLARE @DADOS_FINAIS_MODELO table (id_modelo int, modelo varchar(100))
DECLARE @DADOS_FINAIS_COR table (id_cor int, id_modelo int, cor varchar(100))

INSERT INTO @DADOS_FINAIS_MODELO(ID_MODELO, MODELO) VALUES(1, 'BLUSA')
INSERT INTO @DADOS_FINAIS_COR(ID_COR, ID_MODELO, COR) VALUES(1, 1, 'PRETA')

/* TRAZ OS DADOS QUE JÁ EXISTEM NA TABELA */
SELECT * FROM @DADOS_FINAIS_MODELO
SELECT * FROM @DADOS_FINAIS_COR

/* REPRENSENTA SUA TABELA FINAL  - FIM */

/* INSERE NA TABELA TEMPORARIA - INICIO */
declare @MODELO table (id_modelo int, modelo varchar(100))
declare @COR table (id_cor int, id_modelo int, cor varchar(100))

INSERT INTO @MODELO(ID_MODELO, MODELO) VALUES(1, 'BLUSA')
INSERT INTO @COR(ID_COR, ID_MODELO, COR) VALUES(1, 1, 'PRETA')
INSERT INTO @COR(ID_COR, ID_MODELO, COR) VALUES(2, 1, 'BRANCA')

INSERT INTO @MODELO(ID_MODELO, MODELO) VALUES(2, 'CALÇA')
INSERT INTO @COR(ID_COR, ID_MODELO, COR) VALUES(3, 2, 'PRETA')
INSERT INTO @COR(ID_COR, ID_MODELO, COR) VALUES(4, 2, 'BRANCA')
/* INSERE NA TABELA TEMPORARIA - FIM */
/* VERIFICO OS DADOS INSERIDOS NA TABELA TEMPORARIA */
select * from @modelo 
select * from @cor

/* VERIFICO O MODELO DA TABELA TEMPORARIA QUE NAO EXISTE NA TABELA DE MODELO FISICA, SENDO QUE O ID_MODELO É MINHA PK*/
select * from @modelo m where NOT exists (select * from @DADOS_FINAIS_MODELO mm where m.id_modelo = mm.id_modelo)

/* VERIFICO A COR DA TABELA TEMPORARIA QUE NAO EXISTE NA TABELA DE COR FISICA, SENDO QUE O ID_COR É MINHA PK*/
select  * from @cor c where NOT exists (select * from @DADOS_FINAIS_COR CC where C.ID_COR = CC.ID_COR)

 

Isso é por exist, que roda em qualquer versão do SQL.

Não sei qual a sua versão, se for 2008 é mais fácil!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi perfeitamente, mais se não for complicar, teria como fazer um INSERT na tabela final dos dados novos ou invés de comparar apenas?

Compartilhar este post


Link para o post
Compartilhar em outros sites

É só inserir o comando do insert:

 

insert into @DADOS_FINAIS_MODELO 
select * from @modelo m where NOT exists (select * from @DADOS_FINAIS_MODELO mm where m.id_modelo = mm.id_modelo) 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desculpa a minha burrice mais ficaria assim:

 

/* REPRENSENTA SUA TABELA FINAL - INICIO */

DECLARE @DADOS_FINAIS_MODELO table (id_modelo int, modelo varchar(100))

DECLARE @DADOS_FINAIS_COR table (id_cor int, id_modelo int, cor varchar(100))

 

INSERT INTO @DADOS_FINAIS_MODELO(ID_MODELO, MODELO) VALUES(1, 'BLUSA')

INSERT INTO @DADOS_FINAIS_COR(ID_COR, ID_MODELO, COR) VALUES(1, 1, 'PRETA')

 

/* TRAZ OS DADOS QUE JÁ EXISTEM NA TABELA */

SELECT * FROM @DADOS_FINAIS_MODELO

SELECT * FROM @DADOS_FINAIS_COR

 

/* REPRENSENTA SUA TABELA FINAL - FIM */

 

/* INSERE NA TABELA TEMPORARIA - INICIO */

declare @MODELO table (id_modelo int, modelo varchar(100))

declare @COR table (id_cor int, id_modelo int, cor varchar(100))

 

INSERT INTO @MODELO(ID_MODELO, MODELO) VALUES(1, 'BLUSA')

INSERT INTO @COR(ID_COR, ID_MODELO, COR) VALUES(1, 1, 'PRETA')

INSERT INTO @COR(ID_COR, ID_MODELO, COR) VALUES(2, 1, 'BRANCA')

 

INSERT INTO @MODELO(ID_MODELO, MODELO) VALUES(2, 'CALÇA')

INSERT INTO @COR(ID_COR, ID_MODELO, COR) VALUES(3, 2, 'PRETA')

INSERT INTO @COR(ID_COR, ID_MODELO, COR) VALUES(4, 2, 'BRANCA')

/* INSERE NA TABELA TEMPORARIA - FIM */

/* VERIFICO OS DADOS INSERIDOS NA TABELA TEMPORARIA */

select * from @modelo

select * from @cor

 

/* VERIFICO O MODELO DA TABELA TEMPORARIA QUE NAO EXISTE NA TABELA DE MODELO FISICA, SENDO QUE O ID_MODELO É MINHA PK*/

insert into @DADOS_FINAIS_MODELO

select * from @modelo m where NOT exists (select * from @DADOS_FINAIS_MODELO mm where m.id_modelo = mm.id_modelo)

 

 

/* VERIFICO A COR DA TABELA TEMPORARIA QUE NAO EXISTE NA TABELA DE COR FISICA, SENDO QUE O ID_COR É MINHA PK*/

select * from @cor c where NOT exists (select * from @DADOS_FINAIS_COR CC where C.ID_COR = CC.ID_COR)

 

Ou fica assim:

 

 

select * from @modelo m where NOT exists (insert into @DADOS_FINAIS_MODELO)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ou fica assim:

select * from @modelo m where NOT exists (insert into @DADOS_FINAIS_MODELO)

 

 

Isso nao existe :P

 

Fica do primeiro jeito que fez!

insert into @DADOS_FINAIS_MODELO 
select * from @modelo m where NOT exists (select * from @DADOS_FINAIS_MODELO mm where m.id_modelo = mm.id_modelo) 

insert into @DADOS_FINAIS_COR
select * from @cor c where NOT exists (select * from @DADOS_FINAIS_COR CC where C.ID_COR = CC.ID_COR)

Mas te lembro que este nome

@DADOS_FINAIS_MODELO e @DADOS_FINAIS_COR

é como se fosse sua tabela fisica (a que existe no seu banco)

As tabelas que começam com @ ou # são temporarias, usadas somente na sua sessao.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Caraca, você manja muito hein. Eu precisava bater um papo com você para entender melhor. você disse que isso @ ou # são para as tabelas temporárias. A única fisica mesmo tem que a modelos e cor? Nossa acho que estou perdido.

 

Eu só manjo mesmo de SELECT e INSERT...rsss

Compartilhar este post


Link para o post
Compartilhar em outros sites

Caraca, você manja muito hein. Eu precisava bater um papo com você para entender melhor. você disse que isso @ ou # são para as tabelas temporárias. A única fisica mesmo tem que a modelos e cor? Nossa acho que estou perdido.

 

Eu só manjo mesmo de SELECT e INSERT...rsss

 

Não manjo tanto assim não. Tem muito mais gente fera nesta área :P

 

Eu postei um exemplo utilizando tabelas temporarias. Você pode modificar para gravar, comparar dados, modificar dados como queira em sua tabela fisica. Só substituir as tabelas temporarias pelas fisicas (nome delas)

Quando se esta fazendo Insert, Update ou Delete, geralmente eu uso o Begin Cath principalmente para tratamento de erro.

 

Não fique perdido, pode postar suas dúvidas. Antes ter dúvidas e sana-las do que fazer um update em base de produção e perder a base e o trampo (acredite, já vi isso acontecer muitas vezes!)

 

Abçs

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.