使用臨時表導入 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 ) ;