【发布时间】:2016-02-26 11:25:32
【问题描述】:
我有一个问题。我在一个 8700 万行的文件上运行名称解析脚本。它设置为解析NAME 列,其中包含SMITH、STEVE S 等数据。
当我运行以下命令将名称分解为名字、中间名和姓氏列时,这在我的所有其他表中都有效,但这个顽固的表中,我收到此错误:
传递给 RIGHT 函数的长度参数无效
不太清楚为什么。请任何帮助都会很棒。
UPDATE table6
SET lastName = LEFT(Name, CHARINDEX(', ', Name) - 1),
firstname = SUBSTRING(Name, CHARINDEX(', ', Name) + 2, CASE WHEN CHARINDEX(' ', Name, CHARINDEX(', ', Name) + 2) = 0 THEN LEN(Name) + 1 ELSE CHARINDEX(' ', Name, CHARINDEX(', ', Name) + 2) END - CHARINDEX(', ', Name) - 2),
middlename = RIGHT(Name, LEN(Name) - CASE WHEN CHARINDEX(' ', Name, CHARINDEX(', ', Name) + 2) = 0 THEN LEN(Name) ELSE CHARINDEX(' ', Name, CHARINDEX(', ', Name) + 2) END)
【问题讨论】:
-
我们可以购买一些样本输入和预期输出吗?对代码进行一点格式化也会产生奇迹。然后我们可能会理解
case表达式之一上的else子句是基于一个轻率的假设。或者可能是一个 NULL 潜入。 -
当然,基本上如前所述,有一个名为 NAME 的列,其中包含姓氏、名字中间名格式的各种名称,例如:smith、steve ryan smith、steven smith、steve r 等。 .. 上面的解析器根据代码将其拆分为列名、中间名、姓氏……除了这张表之外,它对所有内容都很好。在执行该 TSQL 脚本之前,我确实运行了一个清理脚本,它是: select top 10 name delete from table6 where CHARINDEX(', ', name) = 0 delete from table6 where name = '' delete from table6 where name is null delete从 table6 where NAME like '%,%,'
-
所以每一行都有一个
LAST,␢FIRST␢I?形式的名字 -
所以我尝试找到坏数据,然后清理它.. 我确实这样做了.. 但仍然有错误。但并非名称列中的每一行都有中间名。但是脚本允许这样做。我在想,因为它是对 RIGHT 的错误,是不是名字(或姓氏)不够长,脚本无法识别并解析它?
-
像
WHO, CINDY这样带有尾随空格的名称会导致该错误,但它不可能那么简单。select Name from Table6 where Name like '% ';(如果您需要修剪所有 Unicode 空白,您可以使用this 回答。)
标签: sql sql-server tsql