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

djp7away  于 2023-02-03  发布在  SQL Server
关注(0)|答案(3)|浏览(250)

我有一个表的EmailAddress列包含空格。我执行了一个批量更新来删除所有空格,它对大多数记录都有效。我随机检查,其中一个电子邮件地址的末尾有一个空格(第32个字符),但没有被删除。我尝试了很多方法,但没有成功。
下面是我的成批更新查询:

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

对于末尾有空格的电子邮件地址,我将其复制并粘贴到下面的查询中,列出所有带有ASCII数字的字符,看看它是否真的是第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)

有什么建议吗?先谢了。

332nm8kg

332nm8kg1#

使用length(LEN)函数确定手动删除多余空格前后是否有任何更改。如果长度有更改,则可以尝试使用它来确定具有提取空格的电子邮件地址。

ia2d9nvy

ia2d9nvy2#

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

clj7thdc

clj7thdc3#

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

相关问题