【问题标题】:Invalid length parameter passed to the RIGHT function MESSAGE传递给 RIGHT 函数 MESSAGE 的长度参数无效
【发布时间】: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


【解决方案1】:

您可能需要验证名称是否符合此语法。一种方法是使用like

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) 
    WHERE Name LIKE '% % %';

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-01
    • 2016-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多