2015-05-14 44 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