我正在开发一个概念验证应用程序,如客户端所要求的那样,以充当执行初始擦除输入数据的自动化系统。此过程中的其中一个步骤是查看描述字段并确定如何映射到客户端提供的描述/代码列表以获取特定的代码。我最初认为只是使用巨大的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