CHARINDEX函数未返回搜索字符串正确索引的问题排查
以下是导致CHARINDEX(',', @AddressCity, 0)始终返回8的常见原因:
函数参数长度定义过短:
如果你的fnBuildCityState函数中,@AddressCity参数被声明为varchar(8)(或更短的长度),传入的完整地址会被自动截断为前8个字符。若截断后的字符串恰好包含逗号,CHARINDEX就会返回8;即使原地址的逗号在更靠后位置,若函数逻辑存在默认赋值等错误,也可能出现始终返回8的情况。调用函数时传入的参数被错误截断:
你在拆分多行地址的过程中,可能用了错误的字符串处理逻辑(比如错误的SUBSTRING长度、拆分换行符时的错误截取),导致每行地址都被截断为前8个字符后才传入函数。此时不管原地址的逗号位置,传入函数的内容长度仅为8,若包含逗号就返回对应位置,若没有则可能因函数内部默认处理返回8。函数内部存在硬编码或默认值错误:
如果函数里对@AddressCity做了硬编码赋值(比如SET @AddressCity = 'TestCity,'),或者参数设置了包含逗号的默认值(比如@AddressCity varchar(50) = 'abcdefg,'),且调用函数时未正确传入参数,CHARINDEX就会一直返回这个默认字符串中逗号的位置(刚好为8)。地址数据包含不可见控制字符:
若存储的地址中存在不可见控制字符(如NULL字符、制表符、非打印ASCII字符),这些字符会占用字符位置,导致CHARINDEX计算的逗号位置偏移到8。可以用ASCII(SUBSTRING(@AddressCity, 8, 1))查看第8位字符是否为普通逗号(ASCII码44),或用DATALENGTH(@AddressCity)对比LEN(@AddressCity),排查是否存在额外隐藏字符。
- 检查函数参数定义:确认
@AddressCity的类型和长度足够容纳完整地址(比如varchar(100)或nvarchar(100))。 - 验证传入参数值:调用函数前先打印或查询要传入的
@AddressCity值,确保是完整的单行地址,未被截断。 - 检查函数内部逻辑:查看是否有对
@AddressCity的硬编码赋值,或参数是否设置了不合理的默认值。 - 检测隐藏字符:对有问题的地址字段使用
ASCII、DATALENGTH函数排查不可见字符。
内容的提问来源于stack exchange,提问作者Jonathan Small

