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

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

回答:

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

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

DECLARE @SQL VARCHAR(MAX);

以上是 存储过程中的Case语句中使用的动态SQL 的全部内容, 来源链接: utcz.com/qa/266466.html

回到顶部