使用临时表对 ODBC 数据源/SQL 服务器进行 SQL 查询亲爱的社区,
我正在构建一个 SQL 脚本,其中利用 SQL Server 上的临时表。 下面的简化示例脚本(在其他地方工作正常)运行没有错误,但不返回任何数据(即,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 Server 的消息(不返回数据):无效的对象名称#tmpTable和无法删除表 #tmpTable,因为它不存在。
我正在运行 JMP16。 任何建议都将受到高度赞赏。
数据存取质量和工艺工程回复:使用临时表对 ODBC 数据源/SQL 服务器进行 SQL 查询SET NOCOUNT ON 确实是一个奇怪的选择。
很高兴它对你有用!
回复:使用临时表对 ODBC 数据源/SQL 服务器进行 SQL 查询嗨布莱恩,
您的解决方案设置不计数;效果很好! 我很惊讶这个解决方案是如此简单。 我花了相当长的时间从各种论坛和线程中查找解决方案,但没有人建议这个。
万分感谢;
珍妮
回复:使用临时表对 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 查询嗨布莱恩,感谢您指出旧线程;确实很有关系。 令人着迷的问题!
我通过查看我在笔记本电脑上建立的测试 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
我相信 ODBC 驱动程序用额外的东西包装了 SQL 语句。 尤其是系统存储过程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 。 希望论坛上的其他人最近通过 JMP 使用 SQL Server 临时表。
布赖恩·科科伦
JMP开发