MSSQL:IF EXISTS为假仍报错datetime参数不适用于substring函数
问题解决办法
错误原因
SQL Server会对整个批处理的所有语句做编译阶段检查,不管IF EXISTS的条件是否成立。如果当前SENEST_OPDAT列已经是datetime类型,编译UPDATE语句时,SUBSTRING()函数作用在datetime类型的列上就会触发报错——因为SUBSTRING只支持字符串类型参数。
解决方法
把UPDATE和ALTER TABLE操作放到动态SQL中执行,这样只有当IF条件满足时,才会编译并执行动态SQL里的语句,避免编译阶段的无效检查。
修改后的代码如下:
IF EXISTS ( SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'LZS' AND TABLE_NAME='TBDLZL2760_FOAB369I_RAT_TYP_OPL' AND COLUMN_NAME ='SENEST_OPDAT' AND LOWER(DATA_TYPE)='varchar' ) BEGIN EXEC sp_executesql N' UPDATE LZS.TBDLZL2760_FOAB369I_RAT_TYP_OPL SET SENEST_OPDAT = CASE WHEN SUBSTRING(SENEST_OPDAT,1,4) >= ''1753'' THEN SUBSTRING(SENEST_OPDAT,1,10)+'' ''+REPLACE(SUBSTRING(SENEST_OPDAT,12,8),''.'','':'')+''.''+ CASE WHEN SUBSTRING(SENEST_OPDAT,21,3) = ''999'' THEN ''998'' ELSE SUBSTRING(SENEST_OPDAT,21,3) END ELSE ''1753-01-01 ''+REPLACE(SUBSTRING(SENEST_OPDAT,12,8),''.'','':'')+''.''+ CASE WHEN SUBSTRING(SENEST_OPDAT,21,3) = ''999'' THEN ''998'' ELSE SUBSTRING(SENEST_OPDAT,21,3) END END; ALTER TABLE LZS.TBDLZL2760_FOAB369I_RAT_TYP_OPL ALTER COLUMN SENEST_OPDAT DATETIME NOT NULL; '; END;
补充说明
动态SQL里的单引号需要用两个单引号转义,确保字符串能正确解析。这样修改后,只有当列确实是varchar类型时,才会执行转换逻辑,不会触发编译错误。
内容的提问来源于stack exchange,提问作者havmaage
相关产品推荐
相关产品推荐

