Problema com NULL em sql

31/01/2013

2

Olá pessoal,

tenho uma procedure que gera script de inserção das tabelas e campos que eu desejar , ex:
UPDATE OR INSERT INTO COM0020 (CODICIDADE, DESCCIDADE, UF, CODICIDADEIBGE, SIGLAPAIS) VALUES ('5.000000000000000','PORTO ALEGRE','RS','NULL','NULL'), o problema está quando os campo são null e fica com as aspas, quando vou rodar pelo ibexpert ou ibScript do delphi da erro (conversion error from string "NULL").

Estou usando comando StringReplace(Lista.Text,QuotedStr('NULL'),'NULL',[rfReplaceAll]) no delphi mas quando o arquivo é muito grande ele não gera, pesquisei alguns fóruns, para tentar fazer por sql ex: select replace(Script."Script", 'NULL', NULL)from Script mas não consegui. Se alguem tiver idéia de como resolver, será bem vinda.
Responder

Posts

Posta seu código completo...
Responder

31/01/2013

Flavio Deuner

Esta é procedure que gera os script na tabela Script

CREATE OR ALTER PROCEDURE PRC_EXTRACT_INSERT (
tabela varchar(100),
campos varchar(4000))
as
declare variable stmt_select varchar(4000);
declare variable stmt varchar(4000);
declare variable primeiro varchar(100);
declare variable ultimo varchar(100);
declare variable "_FIRST" varchar(100);
declare variable "_LAST" varchar(100);
declare variable registro varchar(4000);
declare variable Script varchar(9000);
BEGIN

REGISTRO = '';
Script = '';
-- Seleciona quais campos devem ser gerado os script
STMT = 'SELECT DISTINCT(R.RDB$FIELD_NAME) FROM RDB$RELATION_FIELDS R
WHERE R.RDB$RELATION_NAME='''||TRIM(UPPER(TABELA))||'''
AND R.RDB$FIELD_NAME IN (SELECT DISTINCT COMFRANQUIAC.CAMPO
FROM COMFRANQUIAC
WHERE COMFRANQUIAC.TABELA='''||TRIM(UPPER(TABELA))||'''
AND COMFRANQUIAC.UTILIZADO = ''S'')
ORDER BY R.RDB$FIELD_POSITION ';
-- Pega o Primeiro campo da tabela
EXECUTE STATEMENT
'SELECT FIRST 1 RDB$FIELD_NAME FROM RDB$RELATION_FIELDS
WHERE RDB$RELATION_NAME='''||TRIM(UPPER(TABELA)) ||'''
AND RDB$FIELD_NAME IN (SELECT DISTINCT COMFRANQUIAC.CAMPO
FROM COMFRANQUIAC
WHERE COMFRANQUIAC.TABELA='''||TRIM(UPPER(TABELA))||'''
AND COMFRANQUIAC.UTILIZADO = ''S'')
ORDER BY RDB$FIELD_POSITION ASC ; ' INTO :"_FIRST" ;
-- Pega o Ultimo campo da tabela
EXECUTE STATEMENT
'SELECT FIRST 1 RDB$FIELD_NAME FROM RDB$RELATION_FIELDS
WHERE RDB$RELATION_NAME='''||TRIM(UPPER(TABELA)) ||'''
AND RDB$FIELD_NAME IN (SELECT DISTINCT COMFRANQUIAC.CAMPO
FROM COMFRANQUIAC
WHERE COMFRANQUIAC.TABELA='''||TRIM(UPPER(TABELA))||'''
AND COMFRANQUIAC.UTILIZADO = ''S'')
ORDER BY RDB$FIELD_POSITION DESC ; ' INTO :"_LAST" ;
-- Valida se existe os campos e se são diferentes
IF (TRIM("_FIRST") IS NOT NULL) THEN
BEGIN
IF(TRIM("_LAST") IS NOT NULL) THEN
BEGIN
PRIMEIRO = (TRIM("_FIRST"));
ULTIMO = (TRIM("_LAST"));

IF(PRIMEIRO <> ULTIMO)THEN
BEGIN
-- Inicia o laço pegando todos os regitros com os campos passados por parametro
FOR EXECUTE STATEMENT STMT INTO :REGISTRO
DO
IF (REGISTRO IS NOT NULL) THEN
BEGIN
IF( REGISTRO = TRIM("_FIRST")) THEN
BEGIN
STMT_SELECT = 'SELECT ''UPDATE OR INSERT INTO '||TABELA||' ('||CAMPOS||') VALUES (''''''||COALESCE(' || TRIM(REGISTRO)||','''')' ;
END
ELSE
BEGIN
IF(REGISTRO = TRIM("_LAST")) THEN
BEGIN
STMT_SELECT = STMT_SELECT || '||'''''',''''''||TRIM(COALESCE('||TRIM(REGISTRO)||',''NULL''))||'''''');'' FROM ' ||TABELA;
END
ELSE
BEGIN
STMT_SELECT = STMT_SELECT || '||'''''',''''''||TRIM(COALESCE('||TRIM(REGISTRO)||',''NULL''))' ;
END
END
END
-- Executa o sql para gravar na variavel script e gerar retorno
FOR EXECUTE STATEMENT STMT_SELECT INTO :SCRIPT
DO

insert into script(script)values (:script);
END

END
END
suspend;
END
Responder