如何在SQL Server中删除诸如字符之类的尾随空格

时间:2018-11-16 00:50:49

标签: sql sql-server character special-characters trim

我编写了一个简单的选择查询,以使用名为“名称”的字段从表中选择一行。名称是连续的,并显示为“ RM001”,“ RM002”,“ RM003”...。问题是它没有通过以下查询

提取“ RM004”
-- Trim Name Field
UPDATE [dbo].[RoutineMaintenanceTask] SET  = LTRIM(RTRIM([dbo].[RoutineMaintenanceTask].Name));

-- Select the record
SELECT   *
FROM     [dbo].[RoutineMaintenanceTask]
WHERE    Name = 'RM004'

enter image description here

当我使用以下查询检查值的长度时,它显示的长度为7

-- Check the length
select (Name), len(Name) AS TextLength
from [dbo].[RoutineMaintenanceTask]
where Name = 'RM004'

很明显,此名称前后包含一些字符,但不是空格。

不仅如此,我还通过Visual Studio调试器检查了该值,并且没有发现任何异常。

enter image description here

尽管如此,当我从SQL结果窗格中复制“名称”的值并将其复制到具有特殊字符的notepad ++上时,我仍然能够看到它。

enter image description here

最终,我能够通过在select语句之前添加以下代码来解决此问题

-- Remove the tail
UPDATE [dbo].[RoutineMaintenanceTask] SET Name = substring(Name,1,5);

我只需要知道如何在这种情况下了解隐藏的字符,以及如何在不使用子字符串的情况下消除它们(因为在这种情况下,很容易,因为我知道长度)。

PS-我知道使用“名称”作为表的字段不是一个好习惯,但是在这种情况下,这与之无关。

2 个答案:

答案 0 :(得分:1)

可能是char(9),char(10)或char(13)(分别为tab,lf,cr;)。

您可以在这里阅读它们:https://docs.microsoft.com/en-us/sql/t-sql/functions/char-transact-sql?view=sql-server-2017

您可以使用REPLACE()删除它们。

例如:

DECLARE @VARIABLE VARCHAR(10)

SET @VARIABLE='RM004'+CHAR(10)+CHAR(10)

SELECT @VARIABLE, LEN(@VARIABLE)

SET @VARIABLE = REPLACE(@VARIABLE, CHAR(9),'')
SET @VARIABLE = REPLACE(@VARIABLE, CHAR(10),'')
SET @VARIABLE = REPLACE(@VARIABLE, CHAR(13),'')

SELECT @VARIABLE, LEN(@VARIABLE)

答案 1 :(得分:1)

DECLARE @string VARCHAR(8000) = 'RM004
     ';

WITH 
    cte_n1 (n) AS (SELECT 1 FROM (VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) n (n)), 
    cte_n2 (n) AS (SELECT 1 FROM cte_n1 a CROSS JOIN cte_n1 b),
    cte_Tally (n) AS (
        SELECT TOP (DATALENGTH(@string))
            ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
        FROM
            cte_n2 a CROSS JOIN cte_n2 b
        )
SELECT 
    position = t.n,
    char_value = SUBSTRING(@string, t.n, 1),
    ascii_value = ASCII(SUBSTRING(@string, t.n, 1))
FROM
    cte_Tally t;

enter image description here