使用臨時表對 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開發