Transferir registros via SQL

Frequentemente precisamos importar dados de uma tabela criando registros em outra tabela (ou na mesma). Acontece que quando temos formatos diferentes, pela PSDU fica impossível. Então é necessário criar uma rotina para isso, ou então utilizar um artifício pelo SQL Management mesmo.

Segue um exemplo de query que cria uma outra query para, por exemplo, copiar as Previsões de Venda (tabela SC4) para o Plano Mestre de Produção (tabela SHC) de uma determinado período. Esse exemplo é apenas para ilustrar, pois esse artifício pode ser usado para qualquer outra coisa e inclusive pode ser aperfeiçoado dependendo da necessidade:

SELECT
 'INSERT INTO SHC010 (HC_FILIAL,HC_PRODUTO,HC_DATA,HC_QUANT,HC_DOC,R_E_C_N_O_) SELECT ''01'','''+
 C4_PRODUTO+''','''+
 C4_DATA+''','+
 STR(C4_QUANT)+','''+
 C4_DOC+''','+
 '(SELECT CASE WHEN MAX(R_E_C_N_O_) IS NULL THEN 1 ELSE MAX(R_E_C_N_O_)+1 END FROM SHC010)' SQLSTR
FROM
 SC4010
WHERE
 D_E_L_E_T_ = ' '
 AND C4_DATA BETWEEN '20141027' AND '20141031'
ORDER BY
 C4_DATA,
 C4_PRODUTO,
 C4_LOCAL

Perceba que para o R_E_C_N_O_ utilizamos uma subquery que recalcula em cada inserção. Qual é o resultado dessa query? Configure no Management Studio no menu Query / Results to / Results to Text e terá o resultado como texto simples:

SQLSTR
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
INSERT INTO SHC010 (HC_FILIAL,HC_PRODUTO,HC_DATA,HC_QUANT,HC_DOC,R_E_C_N_O_) SELECT '01','05010 ','20141027', 100,'271014 ',(SELECT CASE WHEN MAX(R_E_C_N_O_) IS NULL THEN 1 ELSE MAX(R_E_C_N_O_)+1 END FROM SHC010)

...

INSERT INTO SHC010 (HC_FILIAL,HC_PRODUTO,HC_DATA,HC_QUANT,HC_DOC,R_E_C_N_O_) SELECT '01','05011 ','20141027', 420,'271014 ',(SELECT CASE WHEN MAX(R_E_C_N_O_) IS NULL THEN 1 ELSE MAX(R_E_C_N_O_)+1 END FROM SHC010)

...

INSERT INTO SHC010 (HC_FILIAL,HC_PRODUTO,HC_DATA,HC_QUANT,HC_DOC,R_E_C_N_O_) SELECT '01','05040 ','20141027', 130,'271014 ',(SELECT CASE WHEN MAX(R_E_C_N_O_) IS NULL THEN 1 ELSE MAX(R_E_C_N_O_)+1 END FROM SHC010)
Anúncios

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão /  Alterar )

Google photo

Está a comentar usando a sua conta Google Terminar Sessão /  Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão /  Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão /  Alterar )

Connecting to %s