通過 odbc 從數據庫下載大列我有一個 varbinary(MAX) 的 sql 列。JMP的列寬似乎是65536,所以我無法下載整個列。 這似乎不僅僅是 ODBC 的問題。
目前,我正在一次執行這些操作,只需抓取子字符串,直到它們全部為空並連接到一個數組中。
這需要永遠。
有人對優化此方法有什麼建議嗎?我試圖避免使用 python/sqlcmd/etc。直接抓取斑點(避免 JMP)。
數據存取回复:通過 odbc 從數據庫下載大列是的,是的。非常感激。
回复:通過 odbc 從數據庫下載大列請注意此限制做似乎在 JMP16.1 中已被刪除。謝謝!
回复:通過 odbc 從數據庫下載大列歐佩,我的錯。會做。 謝謝。
回复:通過 odbc 從數據庫下載大列你好, @vince_faller 。
此問題本應在 JMP 16.1 中得到解決。 如果您已在 16.1 中對此進行了測試並且仍然看到相同的行為,請發送電子郵件給支持人員。
回复:通過 odbc 從數據庫下載大列又見面了@Dahlia_沃特金斯,如果該功能請求得到任何關注,有什麼消息嗎?
回复:通過 odbc 從數據庫下載大列謝謝@Dahlia_沃特金斯
互聯網領域的任何人都知道是否有辦法強制從交易中給出大小?
我當前的實現速度非常慢(以 65536 為一組進行訂閱並連接在一起,直到處理完最長的一個),並且不允許我更改驅動程序;所以我有點進退兩難。
回复:通過 odbc 從數據庫下載大列每布萊恩布恩該行為是由於這些驅動程序未重新調整列長度所致。 隨後,JMP 設置默認長度65536當未提供此數據時。
我添加了一個新的功能請求來增加此值,因為 JMP 可以處理此數據。
在此期間,使用 SQL Server(本機)似乎可行。
回复:通過 odbc 從數據庫下載大型列數據庫是的。 使用完全相同的連接字符串。回复:通過 odbc 從數據庫下載大型列數據庫啊好吧。所以由於我使用的是 VARCHAR(MAX),也許沒有列長度?
不幸的是,即使塊提取關閉它也不起作用。
回复:通過 odbc 從數據庫下載大型列數據庫@vince_faller ,
您是否對 Python 和 JMP 使用相同的 ODBC 驅動程序?
斯坦
回复:通過 odbc 從數據庫下載大型列數據庫你可以嘗試使用:
Preferences( ODBC Disable Block Fetch( 1 ) );
有時 ODBC 驅動程序不報告列的長度。
SQL Server 是支持塊獲取的驅動程序之一(這比一次一行獲取效率高得多),但如果驅動程序未報告列的長度,則使用默認值 65536。
回复:通過 odbc 從數據庫下載大型列數據庫這超出了我通過測試來理解正在發生的事情的能力。
@briancorcoran ?
回复:通過 odbc 從數據庫下載大型列數據庫@傑夫·珀金森
進一步研究這個我無法解釋這種行為。我可以通過 python 從完全相同的表和連接字符串中獲取值。無論出於何種原因,一旦該列達到 65537,JMP 就會將該列清空。
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
*/
我缺少什麼嗎?或者也許 python 正在添加一些功能。
*編輯*抱歉進行瞭如此多的編輯。希望您不會每人都收到一封電子郵件。
回复:通過 odbc 從數據庫下載大型列數據庫非常相關。我的錯。然後發生了一些奇怪的事情。
謝謝@傑夫·珀金森,
回复:通過 odbc 從數據庫下載大型列數據庫
@vince_faller寫道:
JMP的列寬似乎是65536,所以我無法下載整個列。這似乎不僅僅是 ODBC 的問題。
我對你的實際詢問沒有任何直接的想法,但我確實想澄清上面的陳述。 JMP 中字符列的最大寬度遠大於 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 ) ),
)
)
我確信這個細節與解決您的速度/查詢問題無關,我可能誤解了您的意思列寬。