在多个替换和子字符串中将字段转换为小数

Cast Field as Decimal Inside Multiple Replace's and Substring

我正在尝试将客户数据从旧供应商导入我们的数据库 - 之前的供应商是一个 varchar(10) 字段,我在其中看到了诸如“)”、“(”和“-”之类的字符.

我正在尝试导入我们的 table,它在两列中存储一个 phone 号码 - phone1AreaCode 和 phone1Number。 phone1AreaCode 是 decimal(3,0) 数据类型,phone1Number 是 decimal(7,0)。

我尝试了各种方法将子字符串转换或转换为小数,但我一直 运行 出错。

这是我在 SELECT 中工作但在尝试插入时失败的方法:

REPLACE(REPLACE(REPLACE(REPLACE(SUBSTRING(PHONE,1,3),'(',''),')',''),'-',''),' ','') AS phone1AreaCode,
REPLACE(REPLACE(REPLACE(REPLACE(SUBSTRING(PHONE,4,7),'(',''),')',''),'-',''),' ','') AS phone1Number ,

错误:

Error converting data type varchar to numeric.

我尝试了 CAST 或 CONVERT 的各种位置,但它们都给我同样的错误:

Argument data type decimal is invalid for argument 1 of substring function.

尝试失败:

REPLACE(REPLACE(REPLACE(REPLACE(SUBSTRING(CAST(PHONE AS DECIMAL(3,0)),1,3),'(',''),')',''),'-',''),' ','') AS phone1AreaCode,

从谷歌搜索看来,SUBSTRING 可能无法处理十进制数据类型。如果这是真的,我该如何解决这个问题?

我能够通过首先将字段转换为 INT 然后将其转换为 DECIMAL 来解决此问题:

CASE
    WHEN s.PHONE IS NULL OR s.PHONE = '' THEN NULL
    ELSE CONVERT(DECIMAL(3,0),CONVERT(INT,REPLACE(REPLACE(REPLACE(REPLACE(SUBSTRING(PHONE,1,3),'(',''),')',''),'-',''),' ','')))
END AS phone1AreaCode,

CASE
    WHEN s.PHONE IS NULL OR s.PHONE = '' THEN NULL
    ELSE CONVERT(DECIMAL(7,0),CONVERT(INT,REPLACE(REPLACE(REPLACE(REPLACE(SUBSTRING(PHONE,4,7),'(',''),')',''),'-',''),' ','')))
END AS phone1Number,