Sql-Server

在伺服器上執行之前操作 SQL 語句

  • February 2, 2022

我們的數據庫在SQL Server 2000.我們正在遷移到SQL Server 2008 R2. 我們希望將兼容級別更新為 100。

但是該兼容性級別不再支持連接運算\*=符。=\*建議的解決方案是更新我們的原始碼並將運算符更改為 OUTER JOINS。但是我們負擔不起千.exe和的修改.dll。所以我們不能更新我們的原始碼;項目太多了。

在 SQL Server 2008 R2 中,我想要完成的是以下內容:

  1. 在執行之前擷取 SQL 語句?
  2. 更新語句(即,替換*=LEFT OUTER JOIN)?
  3. 將修改後的語句交還給 SQL 引擎執行?

確實不建議使用這種技巧,但它允許我們將兼容級別設置為 100 事件,以便我們的程序仍然使用舊語法。

謝謝

在找到這個特定站點之前,我在 stackoverflow 上發布了相同的問題。 https://stackoverflow.com/questions/27320554/manipulate-sql-statement-before-execution-on-server

首先,我將總結一下我對 Stack Overflow 上發布的同一個問題的回答:

  1. 不,不可能攔截查詢請求。(請參閱末尾的更新部分以獲取功能請求的連結)
  2. 即使有可能,您所請求的內容也會忽略被視為有效 SQL 的複雜性。考慮間距SELECT * FROM sys.objects、返回、

$$ and $$,表別名,表提示,查詢提示等。現在只需添加一個 WHERE 子句並放入一些函式等。最後,你會破壞比你修復的更多。

接下來,讓我們從問題中考慮一下這句話的含義:

千千萬萬個.exe和.dll的修改我們負擔不起

雖然“負擔得起”可以用絕對術語表示,但與替代品相比,它通常是相對的。因此,在考慮可以“負擔得起”的東西時,您需要考慮以下幾點:

  1. 目前程式碼庫有多少實際受到影響?是否所有數千個文件都包含外部連接?還是說真正的工作範圍比“一切”要小一些?
  2. 如果您可以使用兼容級別 80,是否被視為:
  • “好吧,我們完成了!”,或者更多類似的
  • “我們在 100% 的程式碼需要更新之前買了幾年,所以讓我們立即開始一次轉換部分,目標是在 12 到 14 個月內實現 100% 的轉換”因為,如果它是“好的,我們完成了”,那麼你仍然有麻煩。
  1. 除了外部聯接語法,您是否查看過至少在 SQL Server 2005、2008 和 2008 R2 中的所有更改(特別是刪除的功能和更改的行為)?有很多,我在底部發布了指向 MSDN 頁面的連結,詳細說明了這些更改。即使 2008 R2 上的兼容性級別 80 讓您同時使用舊式外連接語法和鏡像,您仍然必須對所有程式碼執行完全回歸,因為有很多事情發生了變化。您可能很容易發現,由於未通過兼容級別 80 保護的更改,您無論如何都必須更新一些原始碼。意思是,這個問題的重點只是外連接語法太窄了(除非您已經完成分析發現這是唯一的問題)。

我完全理解這是一項繁重的工作,如果沒有必要,最好不要這樣做。但很可能它實際上是必要的。所以你最好的選擇是製定一個關於以下方面的攻擊計劃:

  • 分析哪些程式碼受到這些連結頁面中列出的任何更改的影響
  • 按功能區域將更改分組,以更好地利用 QA 時間
  • 優先級

自 SQL Server 2000 以來發生了哪些變化(除了刪除*==*和語法):*=*


要考慮的最後(和次要)點:

如果你得到你想要的東西,你會得到什麼(即能夠使用 SQL Server 2008 R2,一個或多個數據庫設置為兼容級別 80):

  • 您不必更新程式碼
  • 您可以使用鏡像

但是,您仍然停留在 SQL Server 2008 R2 上。距離 2015 年還有幾週的時間,一兩年內可能會有另一個版本的 SQL Server。這使您處於與目前處於相當舊/過時版本的位置相似的位置。其含義是:

  • 幾年後你可能會再次進行這種對話
  • 與此同時,您仍然被目前落後兩個版本的功能集所困擾;您不能使用 2012 和 2014 版本中添加的任何不錯的功能。
  • 尋求幫助將更多地取決於論壇,而不是能夠找到合格的人員。這對於您的公司可能不是問題,但對於其他正在閱讀本文的人來說可能是因為他們處於類似情況。這是一個非技術性問題,但就像討論如何定義“負擔得起”一樣,更多的是在業務方面。對於擁有專門數據庫開發人員/管理員的公司來說,要找到願意在此類過時版本上工作的人並不容易。再次,一個小問題,但仍然是一個不容忽視的問題。

因此,符合貴公司最大利益的是:

  • 升級到 SQL Server 2014(忘記 2008 R2)
  • 更新原始碼

更新

我為此功能送出了 Microsoft 回饋建議:攔截來自客戶端的查詢批處理以重寫或取消它

引用自:https://dba.stackexchange.com/questions/84459