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