Domanda

sto usando nella dichiarazione inserto per convertire tabella di BDE (fonte) per un tavolo Firebird (destinazione) utilizzando IB DataPump. Quindi l'istruzione INSERT è alimentata da valori della tabella di origine attraverso parametri. Uno dei parametri di campo sorgente è alphanum (SOURCECHAR10 char(10), detiene soprattutto interi e deve essere convertito in numero intero (tipo intero) NEWINTFLD colonna di destinazione. Se SOURCECHAR10 non è numerico, voglio assegnare 0 a NEWINTFLD.

Uso IIF e SIMILAR a per verificare se la stringa è numerica, e assegnare 0 se non numerico come segue:

INSERT INTO "DEST_TABLE" (......,  "NEWINTFLD",.....)          
VALUES(..., IIF( :"SOURCECHAR10" SIMILAR TO '[[:DIGIT:]]*', :"SOURCECHAR10", 0),..)

Per ogni stringa non numerica però, ho ancora ottenere gli errori di conversione (DSQL error code = -303).

ho provato solo con le costanti nei campi di risultato IIF come SOURCECHAR10" SIMILAR TO '[[:DIGIT:]]*', 1, 0) e che funziona bene così in qualche modo il: SOURCECHAR10 nel vero campo risultato della IIF genera l'errore. Delle idee come ottenere intorno a questo?

È stato utile?

Soluzione

Quando si esegue la query, il parser noterà che secondo l'uso di :"SOURCECHAR10" viene utilizzato in un luogo in cui ci si aspetta un numero intero. Perciò sarà sempre convertire il contenuto di:. SOURCECHAR10 in un numero intero per quella posizione, anche se non viene utilizzata se la stringa è non intero

In realtà Firebird non usa :"SOURCECHAR10" come parametri, ma la vostra raccolta connessioni sarà convertirlo in due separati segnaposto dei parametri ? e il tipo del secondo segnaposto sarà INTERO. Così la conversione avviene prima che venga eseguita la query effettiva.

La soluzione è probabilmente (non ho la prova di esso, potrebbe contenere errori di sintassi) di usare qualcosa come ( Nota : vedi secondo esempio per soluzione corretta):

CASE 
   WHEN :"SOURCECHAR10" SIMILAR TO '[[:DIGIT:]]*' 
      THEN CAST(:"SOURCECHAR10" AS INTEGER) 
   ELSE 0 
END

Questo non funziona in quanto questo viene interpretato come un calco del parametro stesso, vedere CAST () 'campi di input Casting' voce

Se questo non funziona, si potrebbe anche tentare di aggiungere un cast esplicito a VARCHAR intorno :"SOURCECHAR10" per assicurarsi che il parametro sia correttamente identificato come VARCHAR:

CASE 
   WHEN :"SOURCECHAR10" SIMILAR TO '[[:DIGIT:]]*' 
      THEN CAST(CAST(:"SOURCECHAR10" AS VARCHAR(10) AS INTEGER) 
   ELSE 0 
END

Qui il getto interno è applicata al parametro stesso, il cast esterno viene applicato quando l'espressione CASE viene valutata true

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top