我收到此错误消息 "Invalid length parameter passed to the LEFT or SUBSTRING function."

I get this error Message "Invalid length parameter passed to the LEFT or SUBSTRING function."

enter image description here此代码应该 return 没有门牌号的街道地址。这些欧盟地址在地址末尾有其街道号码。我不确定为什么会发生错误。

    UPDATE STAGING_1_1_FACT_CUSTOMERS_B2B_LGP                       
        SET [StreetAddress] = SUBSTRING([Address], 1, PATINDEX('%[1-9]%', [Address])-1)             
    FROM    [dbo].[STAGING_1_1_FACT_CUSTOMERS_B2B_LGP]
    WHERE [Country Code] IN ('NL','DE','LT','AT','BE','ES','DK','IT', 'SE', 'CZ', 'SI', 'SUI', 'EE','PL','HU','LIE','FI','LV')

识别地址中没有数字的行:

SELECT * FROM dbo.STAGING_1_1_FACT_CUSTOMERS_B2B_LGP -- wow
WHERE PATINDEX('%[1-9]%', [Address]) = 0;

要在数字不出现时获取完整地址,您可以使用:

SUBSTRING(Address, 1, COALESCE(NULLIF(
  PATINDEX('%[1-9]%', [Address]), 0),LEN(Address)+1)-1)

这 - 找不到数字 - 会将长度加 1,因此您仍然可以减去 1 以获得整个字符串。那是假设在这种情况下您需要整个字符串。

为了执行更新,您仍然需要为您显然拥有(或者您不会在这里)但您没有包含在您的屏幕截图中的垃圾数据做准备(也 don't post data as screenshots).鉴于此样本数据:

CREATE TABLE dbo.STAGING_1_1_FACT_CUSTOMERS_B2B_LGP
(
  Address       nvarchar(255),
  StreetNumber  nvarchar(255),
  StreetAddress nvarchar(255)
);

INSERT dbo.STAGING_1_1_FACT_CUSTOMERS_B2B_LGP(Address) 
VALUES(N'Gewerbegebiet 5'),
(N'Spännigweg 1'),
(N'Hauptstr 113A'),
(N'Viale Francesco Redi 39'),
(N'Garbage your code does not handle.'),
(N'More garbage 20th promenade 225 W');

您可以运行进行以下更新:

; /* <--- ensure previous statement terminated */ 
WITH src AS
(
  SELECT *, FirstNumber = 
    COALESCE(NULLIF(PATINDEX('%[1-9]%', [Address]), 0),LEN(Address)+1)
  FROM dbo.STAGING_1_1_FACT_CUSTOMERS_B2B_LGP
  -- WHERE CountryCode IN ('some', 'list');
)
UPDATE src SET 
  StreetNumber  = SUBSTRING(Address, FirstNumber, 255),
  StreetAddress = LEFT(Address, FirstNumber-1);

输出(显示垃圾发生了什么):

Address StreetNumber StreetAddress
Gewerbegebiet 5 5 Gewerbegebiet
Spännigweg 1 1 Spännigweg
Hauptstr 113A 113A Hauptstr
Viale Francesco Redi 39 39 Viale Francesco Redi
Garbage your code does not handle. Garbage your code does not handle.
More garbage 20th promenade 225 W 20th promenade 225 W More garbage

此外,您不需要更新中的 FROM 行。您正在更新相同的 table.

最后,这个要求对我来说意义不大。

  • 为什么要 StreetAddress 是不包括数字的所有内容?
  • 如果街道名称中有数字会怎样?
  • 如果你想清理地址数据,有非常昂贵的软件可以做到这一点,但仍然不完美,所以尝试 re-invent 轮子会导致很多小挫折像这样的问题。