將舊的 SQL 2000 非 Ansi 程式碼轉換為 SQL 2012 兼容
我們有一個僅用於只讀參考的遺留應用程序。
它使用的是 SQL Server 2000。我們想將其數據庫遷移到 SQL 版本 2012,但是我們無法升級軟體並且供應商不再存在。
問題是數據庫上的視圖/儲存過程正在使用不再支持的舊非 ANSI SQL 程式碼。
當我們嘗試在 SQL 2008R2 上簡單地恢復它(因為從 2000 年到 2012 年沒有直接恢復)並將兼容性級別提高到 100 時,我們在視圖/儲存過程上遇到了驗證錯誤,因為它們使用的是舊的加入語法。
該查詢使用非 ANSI 外連接運算符(“ =”或“= ”)。要在不修改的情況下執行此查詢,請使用 ALTER DATABASE 的 SET COMPATIBILITY_LEVEL 選項將目前數據庫的兼容級別設置為 80。強烈建議使用 ANSI 外連接運算符(LEFT OUTER JOIN、RIGHT OUTER JOIN)重寫查詢。在 SQL Server 的未來版本中,即使在向後兼容模式下也不支持非 ANSI 連接運算符。
由於有大約 200 個對象需要使用更新且正確的連接語法程式碼進行更新,我想知道是否存在工具/腳本/程式碼生成器來幫助我轉換程式碼。
我確實注意到,如果我右鍵點擊視圖對象並選擇設計,視圖的查詢將轉換為正確的語法。但這對我來說還不夠自動化。
有什麼想法嗎?
我能想到的最符合您要求的是 SSMS 中的查詢設計器。
您可以通過右鍵點擊數據庫中的任何表並選擇“編輯前 200 行”來打開設計器。
然後,通過點擊工具欄中的按鈕打開 SQL 窗格:
現在您可以將語句粘貼到 SQL 窗格中並使用語法檢查器來轉換程式碼:
轉換後的程式碼如下:
您可能已經註意到,這裡有很多問題:
- 所有格式都消失了
- 萬用字元被擴展。這實際上可能是一件好事。
- 未命名的表達式以美妙的隨機名稱命名,例如“Expr1”。
- 語法檢查器可能會以與初始程式碼不匹配的方式重寫您的查詢(例如,請參閱此連接項)
這種方法(以及任何其他自動化方法)不是 100% 防彈的,可以用作在此過程中幫助您的起點,但它肯定需要人工干預和對轉換後的程式碼進行廣泛的測試。
我遇到了類似的問題,但我設法使用 SSMS 內置的查詢設計器工具修復了它。
根據我對 Stack Overflow 上相關問題的回答:
它只是重構了我的所有查詢並放入了正確的 Join,無論是 Left 還是 Right,以及 Where 條件作為 Join 本身的 AND 條件,所以我得到了 pre 和 post 的正確數據結果集,只有有時數據排序/排序有點偏離。
仍然有點不確定,如果連接條件和過濾器相同,為什麼排序/排序會有點偏差,因為數據是 100% 匹配的。
> > 要使查詢設計器工作,只需選擇您的舊 SQL,然後在編輯器中按 Ctrl + Shift + Q 或轉到主菜單工具欄 => 查詢 => 設計查詢來打開查詢設計器。 > > >
而已。您將使用可以複製和測試的新聯接獲得轉換後的查詢。為我工作了 100% 的時間,除了在某些排序不匹配的情況下,您可以通過在 pre 和 post 中添加一個簡單的 order by 子句來比較數據來檢查。
作為參考,我與John Paul Cook的 Using the Query Designer to convert non-ANSI joins to ANSI進行了交叉檢查。