query di Oracle contro database di SQL Server dando risultati inconsistenti
-
16-10-2019 - |
Domanda
Abbiamo più database Oracle 11.2.0.2 con collegamenti a database og4odbc a un database di SQL Server 2008. Un particolare tabella nel database di SQL Server dispone di due (36) Varchar colonne. I seguenti restituisce dichiarazione 1292 righe:
select "id", "folder_id" from dbo.mediasite_presentation@ms;
Interrogazione per un valore specifico nella prima colonna restituisce una riga:
select "id", "folder_id" from dbo.mediasite_presentation@ms
where "id"='006d815d-6e9e-4004-9104-51213a1ecd52';
id folder_id
------------------------------------ ------------------------------------
006d815d-6e9e-4004-9104-51213a1ecd52 54aa9b6e-1c55-4de5-a06f-033d8b19fff0
Ma query per un valore specifico nella seconda colonna non restituisce alcuna riga:
select "id", "folder_id" from dbo.mediasite_presentation@ms
where "folder_id"='54aa9b6e-1c55-4de5-a06f-033d8b19fff0';
no rows selected
Uso della clausola where che funziona e avvolgendo ogni campo in una to_char restituisce i seguenti risultati interessanti:
select to_char("id"), to_char("folder_id") from dbo.mediasite_presentation@ms
where "id"='006d815d-6e9e-4004-9104-51213a1ecd52';
TO_CHAR("ID") TO_CHAR("FOLDER_ID")
------------------------------------ ------------------------------------
006d815d-6e9e-4004-9104-51213a1ecd52 ┐┐┐┐┐┐┐┐┐┐┐┐┐┐┐┐┐┐
È interessante notare che in grado di produrre gli stessi risultati solo con l'aggiunta di una clausola rownum:
select "id", "folder_id" from dbo.mediasite_presentation@ms
where "id"='006d815d-6e9e-4004-9104-51213a1ecd52' and rownum<=1;
id folder_id
------------------------------------ ------------------
006d815d-6e9e-4004-9104-51213a1ecd52 ┐┐┐┐┐┐┐┐┐┐┐┐┐┐┐┐┐┐
Anche straniero è il fatto che la creazione di una vista materializzata per query che restituisce nessun dato restituisce effettivamente i dati.
Create Materialized View TempMV as (
select "id", "folder_id" from dbo.mediasite_presentation@ms
where "folder_id"='54aa9b6e-1c55-4de5-a06f-033d8b19fff0' and rownum<=1);
Materialized view created.
select * from TempMV;
id folder_id
------------------------------------ ------------------------------------
006d815d-6e9e-4004-9104-51213a1ecd52 54aa9b6e-1c55-4de5-a06f-033d8b19fff0
Si prega di rispondere anche se si può spiegare solo un pezzo di questo puzzle.
Soluzione
mi piacerebbe sospetto un po 'per di problema di conversione di caratteri. Quando si esegue un TO_CHAR, si stanno ottenendo indietro "++++++++++++++++++" (18 caratteri). Ciò suggerisce che v'è una certa confusione riguardo se i dati contenuti nella colonna a byte singolo o multi-byte.
"Il tipo di dati uniqueidentifier in SQL Server viene memorizzato in modo nativo come un valore binario a 16 byte" Questo dovrebbe idealmente venire attraverso di Oracle come un tipo di dati RAW non un VARCHAR2 o CHAR.
Se fate una
CREATE VIEW temp_view as select "id", "folder_id" from dbo.mediasite_presentation@ms
quello che si presenta quando si fa un DESC temp_view