SQL Server - 替换字符(32)不起作用

时间:2017-06-22 17:58:54

标签: sql sql-server

我有一个包含空格的EmailAddress列表。我执行了批量更新以删除所有空格,它适用于大多数记录。我随机检查,其中一个电子邮件地址最后有一个空格(字符32),但没有删除。我尝试了很多东西,但没有用。

这是我的批量更新查询:

Update ContactTable
SET EmailAddress = REPLACE(EmailAddress, ' ', '')

对于末尾有空格的电子邮件地址,我在下面的查询中复制并粘贴它,以列出所有带有Ascii数字的字符,以查看它是否真的是Char 32,它是。

DECLARE @YourString   varchar(500)

SELECT @YourString='dept.com '

;WITH AllNumbers AS
(
    SELECT 1 AS Number
    UNION ALL
    SELECT Number+1
        FROM AllNumbers
        WHERE Number<DATALENGTH(@YourString)
)
SELECT SUBSTRING(@YourString,Number,1) AS CharText,ASCII(SUBSTRING(@YourString,Number,1)) AscNum, Number
, case when SUBSTRING(@YourString,Number,1) like '[ ]%'
    THEN 'y'
    ELSE 'n'
 END SpaceFound
FROM AllNumbers

-------------------------------------------------
Output Result (# 9 is the Char 32):
CharText    AscNum  Number  SpaceFound
d           100     1       n
e           101     2       n
p           112     3       n
t           116     4       n
.           46      5       n
c           99      6       n
o           111     7       n
m           109     8       n
            32      9       y

我尝试了此更新查询,但它也无效:

Update ContactTable
SET EmailAddress = REPLACE(EmailAddress, char(32), '')

当然,我可以手动删除此特定记录的尾随空格,但可能会有更多这样的记录。

更新:我甚至尝试使用下面的这个功能来替换,但是也没有用:

ALTER FUNCTION [dbo].[TRIM](@string VARCHAR(MAX))
RETURNS VARCHAR(MAX)
BEGIN

    --Horizontal Tab
    Set @string = Replace(@string,CHAR(9),'');
    --Line Feed
    Set @string = Replace(@string,CHAR(10),'');
    --Vertical Tab
    Set @string = Replace(@string,CHAR(11),'');
    --Form Feed
    Set @string = Replace(@string,CHAR(12),'');
    --Carriage Return
    Set @string = Replace(@string,CHAR(13),'');
    --Column Break
    Set @string = Replace(@string,CHAR(14),'');
    --Non-breaking space
    Set @string = Replace(@string,CHAR(160),'');

    Set @string = LTRIM(RTRIM(@string));
    Return @string
END

Update ContactTable
SET EmailAddress = dbo.Trim(EmailAddress)

有什么建议吗?提前谢谢。

3 个答案:

答案 0 :(得分:0)

使用长度(LEN)功能确定手动移除额外空间之前和之后是否有任何更改。如果长度发生变化,您可以尝试使用它来确定带有提取空间的电子邮件地址。

答案 1 :(得分:0)

函数len使用字符串的金额字符,而datalenght使用位数

答案 2 :(得分:0)

CHAR(32)是一个有趣的人物。如果它出现在字符串的末尾,则SQL Server只会忽略它。

SELECT CASE WHEN 'ABC' = 'ABC' + CHAR(32) THEN 'TRUE' ELSE 'FALSE' END;

将返回TRUE,但这仅是因为该字符位于字符串的末尾。

SELECT CASE WHEN 'ABC' = CHAR(32) + 'ABC' THEN 'TRUE' ELSE 'FALSE' END;

(按预期)将返回FALSE

计数长度也会受到影响。 LEN(CHAR(32))返回0,但是DATALENGTH(CHAR(32))返回1