download di colonne di grandi dimensioni dal database tramite odbcHo una colonna SQL che è varbinary(MAX).Sembra che la larghezza della colonna per JMP sia 65536, quindi non posso scaricare l'intera colonna. Non sembra essere un problema solo di ODBC.
Attualmente li sto facendo uno alla volta semplicemente prendendo le sottostringhe finché non sono tutte vuote e concattandole in un array.
Questo richiede PER SEMPRE.
Qualcuno ha qualche suggerimento su come ottimizzare questo?Sto cercando di evitare di usare python/sqlcmd/etc. per catturare direttamente i BLOB (evitando JMP).
Accesso ai datiRi: download di colonne di grandi dimensioni dal database tramite odbcSi si.Molto apprezzato.
Ri: download di colonne di grandi dimensioni dal database tramite odbcSolo una nota che questa limitazione fa sembrano essere stati rimossi in JMP16.1. Grazie!
Ri: download di colonne di grandi dimensioni dal database tramite odbcOp, colpa mia.Andrà bene. Grazie.
Ri: download di colonne di grandi dimensioni dal database tramite odbcCiao, @vince_faller .
Questo problema avrebbe dovuto essere risolto in JMP 16.1. Invia un'e-mail al supporto se lo hai testato nella versione 16.1 e continui a riscontrare lo stesso comportamento.
Ri: download di colonne di grandi dimensioni dal database tramite odbcCiao di nuovo @Dahlia_Watkins , ci sono novità se la richiesta di funzionalità ha avuto successo?
Ri: download di colonne di grandi dimensioni dal database tramite odbcGrazie @Dahlia_Watkins
Qualcuno nel territorio di Internet sa se esiste un modo per forzare la dimensione da fornire dalla transazione?
La mia attuale implementazione è terribilmente lenta (sottoscrizione in gruppi di 65536 e convocazione insieme finché non viene risolto quello più lungo) e non mi è consentito cambiare il driver; quindi sono un po' nei guai.
Ri: download di colonne di grandi dimensioni dal database tramite odbcPer bryan_boone il comportamento è dovuto al fatto che questi driver non reimpostano la lunghezza della colonna. Successivamente, JMP imposta una lunghezza predefinita di 65536 quando questi dati non vengono forniti.
Ho aggiunto una nuova richiesta di funzionalità per aumentare questo valore poiché JMP può gestire questi dati.
Nel frattempo, l'utilizzo di SQL Server (nativo) sembra funzionare.
Ri: download di database con colonne di grandi dimensioni dal database tramite odbcSì. Utilizzando la stessa identica stringa di connessione.Ri: download di database con colonne di grandi dimensioni dal database tramite odbcAh ok. quindi poiché sto usando VARCHAR(MAX), forse non c'è lunghezza della colonna?
Sfortunatamente, anche con il recupero del blocco disattivato non funziona.
Ri: download di database con colonne di grandi dimensioni dal database tramite odbc@vince_faller ,
Stai utilizzando lo stesso driver ODBC per Python e JMP?
Stan
Ri: download di database con colonne di grandi dimensioni dal database tramite odbcPuoi provare a utilizzare:
Preferences( ODBC Disable Block Fetch( 1 ) );
A volte il driver ODBC non segnala la lunghezza della colonna.
SQL Server è uno dei driver che supporta il recupero dei blocchi (che è molto più efficiente di una riga alla volta), ma se la lunghezza della colonna non viene segnalata dal driver, viene utilizzato il valore predefinito 65536.
Ri: download di database con colonne di grandi dimensioni dal database tramite odbcQuesto va oltre la mia capacità di testare per capire cosa sta succedendo.
@briancorcoran ?
Ri: download di database con colonne di grandi dimensioni dal database tramite odbc@Jeff_Perkinson
Esaminando più in questo non riesco a spiegare questo comportamento.Sono in grado di ottenere valori dalla stessa identica tabella e stringa di connessione tramite Python.Per qualsiasi motivo JMP cancella la colonna non appena raggiunge 65537.
Names default to here(1);
driver = "ODBC Driver 17 for SQL Server"; // using SQL Server
server = "localhost";
database = "Test";
username = "sa";
password = "REDACTED";
cxn_string = "DRIVER="||driver||";SERVER="||server||";UID="||username||";PWD="||
password||";Database="||database;
cxn = create database connection(cxn_string);
executesql(cxn,
"
CREATE TABLE [dbo].[LargeChar](
[LargeCharID] [bigint] IDENTITY(1,1) NOT NULL,
[SomeBigChar] [varchar](MAX) NOT NULL,
CONSTRAINT [PK_Blob] PRIMARY KEY CLUSTERED
(
[LargeCharID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
"
);
executeSQL(cxn,
"INSERT INTO [LargeChar]
VALUES('"||REPEAT("A", 100000)||"')"
);
dt_download = executeSQL(cxn,
"SELECT SomeBigChar
, SubString(Convert(VARCHAR(MAX), SomeBigChar), 1, 65536) AS Char65536 -- this works
, SubString(Convert(VARCHAR(MAX), SomeBigChar), 1, 65537) AS Char65537 -- this doesn't
FROM [LargeChar]",
"This should work?"
);
show(length(dt_download:SomeBigChar[1]), // full text doesn't show
length(dt_download:Char65536[1]), // text that is only 65536 shows
length(dt_download:Char65537[1]) // text that is one higher? nope
);
//execute SQL(cxn, "DROP TABLE [LargeChar]");
close database connection(cxn);
//Python script returns
/*
0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA...
Name: SomeBigChar, dtype: object
0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA...
Name: Char65536, dtype: object
0 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA...
Name: Char65537, dtype: object
*/
C'è qualcosa che mi manca?O forse sotto Python si aggiungono alcune funzionalità.
*EDIT* scusate per così tante modifiche.Spero che non riceverai un'e-mail per ognuno di essi.
Ri: download di database con colonne di grandi dimensioni dal database tramite odbcMOLTO rilevante.Colpa mia.Allora sta succedendo qualcosa di strano.
Grazie @Jeff_Perkinson ,
Ri: download di database con colonne di grandi dimensioni dal database tramite odbc
@vince_faller ha scritto:
Sembra che la larghezza della colonna per JMP sia 65536, quindi non posso scaricare l'intera colonna.Non sembra essere un problema solo di ODBC.
Non ho pensieri immediati sulla tua effettiva domanda, ma voglio chiarire l'affermazione di cui sopra. La larghezza massima per una colonna di caratteri in JMP è MOLTO maggiore di 65536.
New Table( "untitled 15",
Add Rows( 1 ),
New Column( "repeat",
Character,
"Nominal",
Formula( Repeat( "a", 128000000 ) ),
),
New Column( "length",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula( Length( :repeat ) ),
)
)
Sono sicuro che questo dettaglio non è rilevante per risolvere il tuo problema di velocità/query e potrei aver frainteso cosa intendevi con larghezza della colonna .