這個事兒的背景吧就是因爲加鎖查詢速度太慢,於是讓咱優化,至少先通過使用with(nolock)來解決查詢慢的問題,這麼個事兒說來也簡單對伐,但是影響範圍特別大,因爲要優化的這個存儲過程是個動態存儲過程,有70多個操作行爲DAO調用到了這個存儲過程,可謂牽一髮而動全身。
報錯了!
一開始自信滿滿,參照了一篇文章瞭解瞭解with(nolock)咋玩兒
SQL Server 中WITH (NOLOCK)淺析 https://www.cnblogs.com/kerrycode/p/3946268.html
想着就直接在存儲過程最後拼一個with(nolock)唄,類似這樣:
SELECT * FROM TML where Name='maolintian' and age=29 with(nolock)
結果一下報了一個大錯,直接影響了平臺的功能,大家的標準功能都不好使了。
消息 319,級別 15,狀態 1,第 1 行
關鍵字 'with' 附近有語法錯誤。如果此語句是公用表表達式、
xmlnamespaces 子句或者更改跟蹤上下文子句,那麼前一個語句必須以分號結尾。
於是使用如下方法來處理。
如何處理
怎麼排查呢?在傑哥大佬的幫助下使用print先把sql打出來看看:print @strSQL
,使用完該語句打印出來後又查了下問題:
- 首先重新新建一個存儲過程,起個別名,在裏邊加入
print @strSQL
來打印,防止被影響了。 - 然後讓傑哥看了下原來是with(nolock)後置了。
- 排查好問題後,最後刪除新建的這個存儲過程。
調整後存儲過程應該爲:
SELECT * FROM TML with(nolock) where Name='maolintian' and age=29
這樣就解決了。