使用临时表对 ODBC 数据源/SQL 服务器进行 SQL 查询亲爱的社区,
我正在构建一个 SQL 脚本,其中使用 SQL 服务器上的临时表。 下面的简化示例脚本(在其他地方可以正常工作)运行没有错误,但不返回任何数据(即不弹出 JMP 数据表)。
query= "
CREATE TABLE #tmpTable (ID int PRIMARY KEY NOT NULL, WaferNum int NOT NULL);
INSERT INTO #tmpTable (ID, WaferNum) (
SELECT
ID,
WaferNum
FROM WareHouse
);
SELECT * FROM #tmpTable;
DROP TABLE #tmpTable;
";
dbc = Create Database Connection(
"DSN=DatabaseName; ... ; UID=email@abc.com;"
);
Execute SQL (dbc, query);
close database connection(dbc);
我的下一次迭代是将执行拆分如下;这个技巧在某个线程上被提及。
query1= "
CREATE TABLE #tmpTable (ID int PRIMARY KEY NOT NULL, WaferNum int NOT NULL);
INSERT INTO #tmpTable (ID, WaferNum) (
SELECT
ID,
WaferNum
FROM WareHouse
);
";
query2= "
SELECT * FROM #tmpTable
DROP TABLE #tmpTable;
";
query3= "
DROP TABLE #tmpTable;
";
dbc = Create Database Connection(
"DSN=DatabaseName; ... ; UID=email@abc.com;"
);
Execute SQL (dbc, query1);
Execute SQL (dbc, query2, "Table");
Execute SQL (dbc, query3);
close database connection(dbc);
现在 JMP 日志窗口从 SQL 服务器捕获消息(没有返回数据):无效的对象名称#tmpTable和无法删除表 #tmpTable,因为它不存在。
我正在运行 JMP16。 任何建议都非常感谢。
数据表脚本回复:使用临时表对 ODBC 数据源/SQL 服务器进行 SQL 查询嗨,詹内尔,
我希望这不是这个老问题https://community.jmp.com/t5/Discussions/Importing-SQL-using-a-temp-table/mp/11760#M11264 . 希望论坛上的其他人最近在 JMP 中使用过 SQL Server 临时表。
布莱恩·科科伦
JMP开发
回复:使用临时表对 ODBC 数据源/SQL 服务器进行 SQL 查询嗨,布赖恩,感谢您指出旧线程;确实很相关。 有趣的问题!
我通过查看我在笔记本电脑上建立的测试 SQL Server 的日志进行了一些调试。 首先要注意的是,在 Excel 中使用完全相同的 DNS 连接/ODBC 驱动程序执行的相同查询(带有临时表或表变量)工作正常,但不是来自 JMP。 在查看传入服务器的流量时,Excel 按原样发送查询字符串(例如从表中选择 * ) 但从 JMP 中,查询以以下格式到达:
declare @p1 int
set @p1=1
exec sp_prepexec @p1 output,NULL,N'SELECT * FROM Table'
select @p1
我相信 SQL 语句是由 ODBC 驱动程序用额外的东西包装的。 尤其是系统存储过程sp_prepexec看起来是导致问题的原因。 可能与引号相关,也可能不相关;很难说这个过程中到底发生了什么。
好的,这是 ODBC 驱动程序问题。 然而,据了解,ODBC 也支持直接执行。 我相信这就是 Excel 发生的情况。 JMP 也能做到这一点吗? 情侣相关链接如下:
https://techcommunity.microsoft.com/t5/datacat/watch-out-those-prepared-sql-statements/ba-p/305074
https://docs.microsoft.com/en-us/sql/odbc/reference/develop-app/direct-execution-odbc?view=sql-server-ver15
回复:使用临时表对 ODBC 数据源/SQL 服务器进行 SQL 查询简,
如果您将第一个 SQL 修改为:
query= "SET NOCOUNT ON;
CREATE TABLE #tmpTable (ID int PRIMARY KEY NOT NULL, WaferNum int NOT NULL);
INSERT INTO #tmpTable (ID, WaferNum) (
SELECT
ID,
WaferNum
FROM WareHouse
);
SELECT * FROM #tmpTable;
DROP TABLE #tmpTable;
";
dbc = Create Database Connection(
"DSN=DatabaseName; ... ; UID=email@abc.com;"
);
Execute SQL (dbc, query);
close database connection(dbc);
您应该将表格放入 JMP。
另外,(以防它在 JSL 中丢失)是:
设置无计数;
https://docs.microsoft.com/en-us/sql/t-sql/statements/set-nocount-transact-sql?view=sql-server-ver15
-布莱恩
回复:使用临时表对 ODBC 数据源/SQL 服务器进行 SQL 查询嗨布莱恩,
您的解决方案设置无计数;很好用!!! 我很惊讶解决方案如此简单。 我花了很长时间从各种论坛和线程中寻找解决方案,但没有人提出这个建议。
十分感谢;
珍妮