使用临时表导入 SQL<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />我在 JMP 11.2.1 中使用存储过程和临时表时遇到困难。我根本得不到回报
db = 创建数据库连接("DRIVER=SQL Server;
服务器=本地服务器\SQLEXPRESS;
数据库=测试”
);
执行 SQL(db,
“
创建表#Test(ID int)
插入 #Test (ID)
值 (1), (2), (3), (4), (5)
选择 *
来自#Test
删除表 #Test
",
“:-(”
);
关闭数据库连接(db);
这个问题困扰了我一段时间。从它的外观来看,SAS 可以做到,所以我认为这不是 ODBC 的问题。
回复:使用临时表导入 SQL文斯,
谢谢。查找较旧的 ODBC 2.0 下载是否有意义?我还没有太多运气。
回复:使用临时表导入 SQL按照我的理解,这不是 JMP 方面需要解决的问题。问题出在微软方面,他们的 ODBC 3.0 驱动程序调用它的方式。他们可能会像您所说的那样尝试检测#Tables,但我认为我不想中断脚本来告诉我我的 SQL 是以不可接受的方式编写的。将一些东西传递到日志中,我认为这是有用的。
回复:使用临时表导入 SQL我注意到,将每个查询部分的结果保存为文字 JMP 数据表,然后通过 JSL 手动连接它们有时似乎可行。虽然它确实会占用您的时间,但您可以在运行关闭数据表之前保持结果处于活动状态。
回复:使用临时表导入 SQL感谢您的解释。但是,我不喜欢它的工作原理。我应该简单地能够采用在其他应用程序中运行良好的任何查询,并在 JMP/JSL 中运行时看到/期望相同的结果。
我已经阅读了这个线程,有一点很清楚......讨论的解决方法,将所有临时表拆分成单独的查询,对我们 JSL 开发人员来说不是一个好的解决方案。我有一个大型的、较旧的查询,它工作得很好,实际上我需要几个小时才能将它拆分出来。那有什么意义呢?这是首选方法吗?我还注意到,在我的第一次查询拆分尝试中,JMP 没有将 OID 加载到新数据表中。所以我不太确定我是否可以拆分这个查询。如果我继续,我将无法加入空白的 OID 列....当我通过 SQL Server 运行这个相同的查询部分时,我的列确实有数据。
我也很惊讶这个话题是难的找到 - 它需要一些谷歌搜索。JSL 手册中应明确说明限制,但这是我第一次阅读它。我专门写了几个辅助函数——现在用处不大。现在我意识到那是浪费时间。使用另一个应用程序写入 csv 并让 JMP 加载它实际上会更快。这个软件并不便宜,所以我希望 Temp Tables/SQL 在 JMP 中工作,而不是需要外部应用程序来节省我的时间。
至少,我希望这个应用程序有更好的通知。如果 JMP 在 JSL 或“Open Table > Advanced”平台中检测到临时表的使用,可能会显示一条消息应该发送给开发人员以通知他们 JMP 无法处理该操作...?
此线程似乎不再处于活动状态... SAS/JMP 是否计划解决这个问题?
回复:使用临时表导入 SQL这可能不是你的错。JMP 12 中有一个错误导致存储过程不向 JMP 返回任何行(坦率地说,我不确定 Brian 是如何让一个程序工作的)。它将在 12.1 维护版本中修复,该版本应该会在几个月内发布。
更新: 我很困惑。关于存储过程不返回任何行的错误实际上 *不* 在 JMP 12 中 - 它是在 JMP 12.1 循环中引入并修复的。所以您可能需要查看您的存储过程代码。我们已经看到创建表然后从单个存储过程中选择表的情况,其中行不会返回到 JMP。
埃里克
回复:使用临时表导入 SQL谢谢布赖恩,我一定是说错了。
回复:使用临时表导入 SQL嗨文斯,
我不知道存储过程有问题。尽管我们在 SQL Server 上没有很多很好的示例,但我能够在这里工作。我知道引用是个大问题。你在看什么?
布莱恩
回复:使用临时表导入 SQL谢谢布赖恩,这真的很有用。
是否同样的问题也可能导致存储过程失败?
回复:使用临时表导入 SQL嗨文斯,
很抱歉延迟回复,但我想对此做一些调查。不幸的是,这似乎是 Microsoft SQL Server ODBC 驱动程序(Native Client 和 Office 版本)的问题。当我们提交 SQL 时,表创建失败了。使用适用于 Mac 的 Actual Technologies SQL Server 驱动程序等驱动程序,这会成功。我知道在旧版本的 JMP 中这会起作用,因为当时我们没有强制执行 ODBC 3.0。此级别需要在 SQL Server 和其他数据库供应商中使用块提取。块提取使得检索大表的速度大大加快。然而,随之而来的是 TEMP 表的失败。此初始化是在 JMP 的启动时完成的,因此实际上不可能为 TEMP 表选择性地禁用它,即使我们可以解析 SQL 以检测 TEMP 表的使用情况。
我希望我能给你更好的消息。
布赖恩·科科伦
JMP开发
回复:使用临时表导入 SQL那么我将不得不在这方面听从 SQL Server 专家的意见。
回复:使用临时表导入 SQL没有 # 就不是临时表。
它在 SQL SERVER 中正常工作。
回复:使用临时表导入 SQL我不是 SQL 服务器专家——我主要使用 Oracle。SQL Server 似乎不喜欢您的表名。尝试测试而不是#Test。
您是否在 SQL Server 控制台中验证了 SQL 命令?
回复:使用临时表导入 SQL看起来它会在执行完成后立即摆脱它。
[Microsoft][ODBC SQL Server 驱动程序][SQL Server]对象名称“#Test”无效。
[Microsoft][ODBC SQL Server 驱动程序][SQL Server]对象名称“#Test”无效。
[Microsoft][ODBC SQL Server 驱动程序][SQL Server]无法删除表“#Test”,因为它不存在或您没有权限。
回复:使用临时表导入 SQL尝试分离出每个 SQL 语句:
D b =创建数据库连接( “驱动程序=SQL 服务器;
服务器=本地服务器\SQLEXPRESS;
数据库=测试”
) ;
sql1 = “创建表#Test(ID int)” ;
执行SQL ( D b , sql1 ) ;
sql2 = “插入 #Test (ID) VALUES (1), (2), (3), (4), (5)” ;
执行SQL ( D b , sql2 ) ;
sql3 = “从#Test中选择*” ;
dt =执行SQL ( D b , sql3 , “#测试” ) ;
sql4 = “删除表#Test” ;
执行SQL ( D b , sql4 ) ;
关闭数据库连接( D b ) ;