quinta-feira, 19 de junho de 2008

SELECIONANDO TODOS OS CAMPOS MENOS ALGUNS - SQL-SERVER

Todos nós que trabalhamos com banco de dados por varias vezes seguida temos a necessidade de repetir um mesmo conjunto de dados alterando apenas um ou dois campos da chave.

Esta tarefa é bem fácil quando estamos trabalhando com uma tabela com poucos campo.

Suponhamos que temos a tabela TPT210 que contém um campo CDMOEDA que faz parte da chave e precisamos duplicar as linhas da tabela cujo campo CDMOEDA é igual a 1 alterando o valor para 20. Se temos poucos campos na tabela seria algo assim:

INSERT INTO TPT210 SELECT CAMPO1, CAMPO2, 20 AS CDMOEDA, CAMPO4 FROM
TPT210

Mas se temos muitos campos; reescreve-los todos é bastante trabalhoso e propenso a erros. Embora podemos utilizar alguns recursos de aplicativos dos bancos que copia os nomes de campos separados por virgula e tal, ainda assim, por experiência, é chato.

Portanto o script abaixo tem o objetivo de resolver esta questão.

O objetivo é o mesmo acima descrito. Copiar todos os registros da tabela com TPT210 com o valor do campo CDMOEDA = 1 e inseri-los na própria TPT210 alterando o conteúdo do campo
CDMOEDA para 20.


DECLARE @vCOLLIST VARCHAR(1000), @vSQLS VARCHAR(4000)
SET @vCOLLIST = ''
SELECT @vCOLLIST = @vCOLLIST + CASE WHEN NAME != 'CDMOEDA' THEN
NAME
ELSE
'20 AS CDMOEDA'
END + ', ' FROM SYSCOLUMNS WHERE ID = OBJECT_ID('TPT210') ORDER BY COLORDER
SELECT @vSQLS = 'INSERT INTO TPT210 SELECT ' + substring(@vCOLLIST,1,len(@vCOLLIST)-1) + ' FROM TPT210 WHERE CDMOEDA = 1'
PRINT @vSQLS



Por enquanto é somente isso.

Até a próxima.

Reginaldo

PS: Aqui na empresa funciona e quase todos os servidores menos em um e não sei porque.








segunda-feira, 16 de junho de 2008

Seleção de registros aleatórios - ORACLE

Por vezes gostaríamos de preencher um campo de uma tabela com valores aleatórios. Abaixo o script que pode ajuda-lo a cumprir esta tarefa.

Criei uma tabela teste para acumular os valores para podermos analisar o que foi feito pelo script.

Neste caso poderia utilizar o valor vCDFNC tranquilamente porque o valor já é um número aleatório e é isso que quero porém em alguns casos posso querer inserir um valor aleatório que vem de um SELECT de um campo VARCHAR. Neste caso passo à função RANDOM os valores minimos e maximos que quero. Aqui no exemplo tenho 124 registros na tabela TPT154, isto me traz um valor neste intervalo e após isso seleciono o campo VARCHAR da tabela cujo registro é exatamente este número.

Verifique que neste script estão contidas várias técnicas : selecionar um registro randomicamente, selecionar apenas um registro, ou vários aleatóriamente, etc.


CREATE TABLE TESTE
(
ID INTEGER PRIMARY KEY,
vCDFNC INTEGER,
aCDFNC VARCHAR(40)
);


DECLARE
vCDFNC INTEGER;
n INTEGER;
aCDFNC VARCHAR(40);
BEGIN
n := 1;
WHILE n <>
LOOP
SELECT ROUND( dbms_random.VALUE(1,124)) INTO vCDFNC FROM dual;
SELECT DSFNC INTO aCDFNC
FROM ( SELECT a.dsfnc, ROWNUM rnum FROM ( SELECT * FROM TPT154
ORDER BY CDFNC, ROWID ) a WHERE ROWNUM <= vCDFNC )
WHERE rnum > vCDFNC - 1;

INSERT INTO TESTE VALUES( n, vCDFNC, aCDFNC );

n := n + 1;

END LOOP;
END;



Espero que lhe seja útil em algum momento. Pode perguntar se não entender via comentário que terei prazer em lhe ajudar.

Até a próxima.

Reginaldo