动态 SQL 在存储过程中的 Case 语句中使用

Dynamic SQL used in Case Statement in Stored Procedure

我正在按照客户的要求开发概念验证应用程序,以充当对输入数据进行初始清理的自动化系统。此过程中的步骤之一是查看描述字段并确定它如何映射到客户提供的 description/code 列表以获取特定代码。我最初想到只使用一个巨大的 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 的数量是否有限制?有更好的选择吗?

可能发生的情况是您的数据正像其他人提到的那样被截断。现在,除非您使用 Unicode 字符,否则我建议您只使用 Varchar。无论哪种方式,只需将所有变量设置为 max 即可修复截断错误。你会认为这是你的引号的原因是,如果截断结束引号,你当然会有未结束的引号!

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