我正在開發一個概念驗證應用程序,如客戶端所要求的那樣,以充當執行初始擦除輸入數據的自動化系統。此過程中的其中一個步驟是查看描述字段並確定如何映射到客戶端提供的描述/代碼列表以獲取特定的代碼。我最初認爲只是使用巨大的case語句,但是由於輸入數據不總是相同的,我想我會合並動態SQL來傳遞輸入描述字段的列名稱。下面是迄今爲止代碼片段(省略號(...)表示代碼繼續在這一點上未知的距離,不是真正的代碼):存儲過程中的Case語句中使用的動態SQL
DECLARE @DESC VARCHAR(100)
SET @DESC = '<sourceDescrptionColumn>'
DECLARE @SQL NVARCHAR(MAX)
SET @SQL = '
SELECT
<sourceDescrptionColumn>
,CASE WHEN(' + @DESC + ' LIKE ''%club%'') THEN ''00''
WHEN(' + @DESC + ' LIKE ''%ball%'' AND ' + @DESC + ' NOT LIKE ''%basket%'' AND ' + @DESC + ' NOT LIKE ''%base%'') THEN ''01''
WHEN(' + @DESC + ' LIKE ''%glov%'' AND ' + @DESC + ' NOT LIKE ''%bat%'' AND ' + @DESC + ' NOT LIKE ''%golf%'' AND ...) THEN ''02''
...
ESLE ''99''
END AS DESC_CODE
FROM <someInputTable>'
這將爲大致的第一項工作大約30個「WHEN」語句,然後開始失敗。這似乎是我使用單引號的問題,但似乎無法找到源代碼。
在此類SQL使用中可以使用的AND或WHEN的數量是否有限制?有更好的選擇嗎?
你可以擴展「失敗」嗎?錯誤消息?不會返回正確的結果?我假設'ESLE'只是一個複製和粘貼錯誤。而且'@ DESC'永遠不會包含任何可能會使事情發生變化的字符。 – HABO
有一個批處理文件的大小限制[這裏](https://msdn.microsoft.com/en-us/ms143432.aspx),但默認爲64K * 4K,這看起來不是問題。它可能不適用於數據庫引擎使用動態SQL對自己進行嘟mut。 – HABO
所以我得到的錯誤是一個語法錯誤,但它改變了CASE語句中WHEN語句數量的加深。例如,當我在語句中有31個WHEN時,它會沿着「L」附近的不正確語法行說,當我在語句中有32個WHEN時,它會沿着「不正確的語法附近」 LIK「,等等等等。據我所知,不存在會導致問題的任何奇怪的字符。 – Hukd