我有以下查询:
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函数。 该声明已终止。
我如何找到导致失败的数据并修复更新语句,以便将来不会失败?
答案 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。因为对于LEFT
,RIGHT
和SUBSTRING
函数仅接受大于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;