如何提取特定格式字符串中Bucket #:与Run间的Bucket Number?
解决提取Bucket Number时的SUBSTRING/LEFT函数错误
你遇到的"Invalid length parameter passed to the LEFT or SUBSTRING function."错误,本质是计算子串长度时得到了非正数值——比如当你的字符串里找不到Bucket #: 或者Run #: 标记,或者Run标记出现在Bucket标记之前时,CHARINDEX会返回0,用它计算长度就会导致参数无效。
针对你的固定格式字符串,这里提供一个安全且可靠的SQL解决方案,既能正确提取Bucket Number,又能避免报错:
DECLARE @inputString NVARCHAR(MAX) = 'PROJECT CODE: CUSTOMER PO #: ORDER #: N2: BUCKET #: OKL-1335-081417-A1 RUN #: OKL-1335-081417-A BUILD #: 1 NOTES:' SELECT CASE -- 先检查两个标记是否存在,且Run标记在Bucket标记的内容之后 WHEN CHARINDEX('Bucket #: ', @inputString) > 0 AND CHARINDEX('Run #: ', @inputString) > (CHARINDEX('Bucket #: ', @inputString) + LEN('Bucket #: ')) THEN SUBSTRING( @inputString, -- 起始位置:Bucket #: 之后的第一个字符 CHARINDEX('Bucket #: ', @inputString) + LEN('Bucket #: '), -- 长度:Run #: 的起始位置 减去 Bucket #: 结束的位置 CHARINDEX('Run #: ', @inputString) - (CHARINDEX('Bucket #: ', @inputString) + LEN('Bucket #: ')) ) -- 如果标记不存在或者顺序不对,返回友好提示 ELSE '无法找到有效的Bucket #或Run #标记' END AS BucketNumber
代码说明:
- 边界检查:用
CASE语句先验证两个关键标记的存在性和顺序,确保不会出现无效的长度计算。 - 精准定位:通过
CHARINDEX找到Bucket #:的结束位置,以及Run #:的起始位置,两者的差值就是我们要提取的内容长度。 - 容错处理:如果字符串格式异常(比如标记缺失、顺序颠倒),会返回提示信息而非抛出错误,增强代码的健壮性。
运行这段代码后,就能正确提取出OKL-1335-081417-A1作为Bucket Number啦。
内容的提问来源于stack exchange,提问作者eggwhites
相关产品推荐
相关产品推荐

