使用臨時表對 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 查詢嗨布萊恩,
您的解決方案設置無計數;很好用!!! 我很驚訝解決方案如此簡單。 我花了很長時間從各種論壇和線程中尋找解決方案,但沒有人提出這個建議。
十分感謝;
珍妮