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

时间:2015-05-14 19:01:56

标签: tsql stored-procedures case dynamic-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数量是否有限制?还有更好的选择吗?

1 个答案:

答案 0 :(得分:1)

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

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