格式字段中的LEN()和CHARINDEX()问题

时间:2019-02-04 11:22:11

标签: sql sql-server tsql

我有以下查询:

UPDATE P
SET Street = TRIM(LEFT(FormattedAddress, CHARINDEX(',', FormattedAddress)-1)),
    Town = TRIM(RIGHT(FormattedAddress, LEN(FormattedAddress)-CHARINDEX(',', FormattedAddress)))
FROM Person P

突然开始出现以下错误:

  

第537级消息,州2,第3行,

     

无效的长度参数传递给LEFT或SUBSTRING函数。   该声明已终止。

我如何找到导致失败的数据并修复更新语句,以便将来不会失败?

3 个答案:

答案 0 :(得分:2)

  

如何找到导致失败的数据并修复   更新语句,以便将来不会失败?

尝试这样查找。您将获得破坏查询的行。

SELECT * FROM
Person P
WHERE CHARINDEX(',', FormattedAddress) <=0 

按照 Jeroen Mostert 的建议编写相同查询的更好方式如下。

SELECT * FROM
Person P
WHERE FormattedAddress NOT LIKE '%,%'

答案 1 :(得分:1)

您将收到错误消息,因为FormattedAddress中有一些不带“,”的值,因此CHARINDEX函数会将这些值返回为0。因为对于LEFTRIGHTSUBSTRING函数仅接受大于0的正整数,所以这些行将引发错误。

您可以使用以下查询轻松确定导致问题的行

SELECT
    *
    FROM Person P
        WHERE CHARINDEX(',', FormattedAddress) = 0 

有多种方法可以克服相同的问题

方法#1

LEFT / RIGHT内的用例

UPDATE P
SET
    Street = TRIM(LEFT(FormattedAddress, 
                            CASE WHEN CHARINDEX(',', FormattedAddress)>1
                                    THEN CHARINDEX(',', FormattedAddress)-1
                                ELSE LEN(FormattedAddress) END)
                                ),
    Town = TRIM(RIGHT(FormattedAddress, 
                                CASE WHEN CHARINDEX(',', FormattedAddress)>0
                                        THEN LEN(FormattedAddress)-CHARINDEX(',', FormattedAddress)
                                    ELSE LEN(FormattedAddress) END)
                                    )
    FROM Person P

方法#2

过滤WHERE子句中的记录

UPDATE P
SET
    Street = TRIM(LEFT(FormattedAddress, CHARINDEX(',', FormattedAddress)-1)),
    Town = TRIM(RIGHT(FormattedAddress, LEN(FormattedAddress)-CHARINDEX(',', FormattedAddress)))
    FROM Person P
        WHERE CHARINDEX(',', FormattedAddress) > 1

答案 2 :(得分:0)

您可以使用WHERE stop:

WHERE FormattedAddress LIKE '%,%'

但是,您也可以执行以下操作:

UPDATE P
     SET Street = TRIM(LEFT(FormattedAddress, CHARINDEX(',', FormattedAddress + ',')-1)),
     Town = TRIM(RIGHT(FormattedAddress, LEN(FormattedAddress)-CHARINDEX(',', FormattedAddress)))
FROM Person P;