通过 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 ) ),
)
)
我确信这个细节与解决您的速度/查询问题无关,我可能误解了您的意思列宽。