通過 odbc 從數據庫下載大列我有一個 sql 列,它是 varbinary(MAX)。JMP 的列寬似乎是 65536,所以我無法下載整列。 它似乎不是 ODBC 唯一的問題。
目前,我一次只抓取子字符串,直到它們全部為空並連接到一個數組中,從而一次完成這些操作。
這需要永遠。
有沒有人對優化方法有任何建議?我試圖避免使用 python/sqlcmd/etc。直接抓取 blob(避免 JMP)。
腳本回复:通過 odbc 從數據庫下載大列是的是的。非常感激。
回复:通過 odbc 從數據庫下載大列請注意,此限制做似乎已在 JMP16.1 中刪除。謝謝!
回复:通過 odbc 從數據庫下載大列哎呀,我的錯。會做。 謝謝。
回复:通過 odbc 從數據庫下載大列你好, @vince_faller .
這個問題應該在 JMP 16.1 中得到解決。 如果您在 16.1 中對此進行了測試並且仍然看到相同的行為,請發送電子郵件給支持人員。
回复:通過 odbc 從數據庫下載大列又見面了@Dahlia_Watkins ,如果該功能請求得到任何牽引力,有什麼消息嗎?
回复:通過 odbc 從數據庫下載大列謝謝@Dahlia_Watkins
互聯網領域的任何人都知道是否有辦法強制從交易中給出大小?
我當前的實現非常慢(以 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 從數據庫下載大列數據庫@Jeff_Perkinson
對此進行更多研究,我無法解釋這種行為。我能夠通過 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 從數據庫下載大列數據庫非常相關。我的錯。然後發生了一些奇怪的事情。
謝謝@Jeff_Perkinson ,
回复:通過 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 ) ),
)
)
我確定這個細節與解決您的速度/查詢問題無關,我可能誤解了您的意思列寬.