2015-05-14 72 views
0

我正在開發一個概念驗證應用程序,如客戶端所要求的那樣,以充當執行初始擦除輸入數據的自動化系統。此過程中的其中一個步驟是查看描述字段並確定如何映射到客戶端提供的描述/代碼列表以獲取特定的代碼。我最初認爲只是使用巨大的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的數量是否有限制?有更好的選擇嗎?

+0

你可以擴展「失敗」嗎?錯誤消息?不會返回正確的結果?我假設'ESLE'只是一個複製和粘貼錯誤。而且'@ DESC'永遠不會包含任何可能會使事情發生變化的字符。 – HABO

+0

有一個批處理文件的大小限制[這裏](https://msdn.microsoft.com/en-us/ms143432.aspx),但默認爲64K * 4K,這看起來不是問題。它可能不適用於數據庫引擎使用動態SQL對自己進行嘟mut。 – HABO

+0

所以我得到的錯誤是一個語法錯誤,但它改變了CASE語句中WHEN語句數量的加深。例如,當我在語句中有31個WHEN時,它會沿着「L」附近的不正確語法行說,當我在語句中有32個WHEN時,它會沿着「不正確的語法附近」 LIK「,等等等等。據我所知,不存在會導致問題的任何奇怪的字符。 – Hukd

回答

1

可能發生的情況是您的數據正像其他人提到的那樣被截斷。現在,除非你使用Unicode字符,否則我建議只使用Varchar。無論哪種方式,只需將所有變量設置爲最大,並且應該修復截斷錯誤。而你之所以會認爲這是你的報價的原因,是因爲如果截斷結束語引號,當然你會有未封閉的引號!

DECLARE @Desc VARCHAR(MAX) = '<sourceDescrptionColumn>'; 
DECLARE @SQL VARCHAR(MAX); 
+0

當['sp_executesql'](https://msdn.microsoft.com/en-us/library/ms188001.aspx)的文檔指出語句參數是Unicode字符串時,使用'VARCHAR'有什麼好處? – HABO

+0

優點是它是NVARCHAR大小的一半。至於sp_excutesql使用NVARCHAR,以及他沒有在他的問題中提到。就我們所知,他可能只是使用EXEC(@sql)。 – Stephan

+1

謝謝Stephan,這似乎是答案! – Hukd