摘要高效的方式
是否有(SQL Server 2005上)運行大量的動態SQL語句的有效途徑?
詳細
我們的系統允許用戶創建「郵件提醒」訂閱 - 在系統上的新的比賽是通過電子郵件發送給他們每天的基礎上。
訂閱允許多個選項,包括使用搜索關鍵字。我自己編寫的解析器輸出適當的SQL代碼,考慮到and
,or
和括號()
。 解析器不允許通過可用於SQL注入的任何東西。
例如,關鍵字可能會根據用戶的輸入this (that or other)
,所得查詢將大致爲最終...
SELECT *
FROM [VW_EMAIL_ALERT]
WHERE ([SEARCH] LIKE '%this%' AND ([SEARCH] LIKE '%that%' OR [SEARCH] LIKE '%other%'))
每天晚上,所有的預訂都單獨處理,因爲每一個是潛在的獨特。結果是批處理必須在每個訂閱上運行遊標,並通過sp_executesql
運行SQL。
顯然這是非常低效的,並可能導致嚴重的重載 - 在某些情況下導致超時。運行此處理的存儲過程被編碼爲將訂閱拆分爲塊,因此它們不會一次全部被調用。
有沒有更好/更有效的方法來做到這一點?
注:不幸的是,我們目前堅持支撐最低的SQL Server 2005,我們的一些客戶仍然使用該技術
也許一個愚蠢的問題,但你不能改變它使用靜態SQL更有效的關鍵字通配符? (是的,我知道可以花費很多努力來改變你的模式)。順便說一句你使用「純」的動態或參數動態? – jean
你知道%不是a =的通配符嗎?正如所寫的那樣,永遠不可能是真的。 – Paparazzi
這可能是一些幫助:http://stackoverflow.com/questions/13259850/dynamic-sql-and-stored-procedure-optimization –