如何删除 SQL 服务器中字符的尾随空格
How to remove trailing spaces like characters in SQL Server
我使用名为“Name”的字段编写了一个简单的 select 查询 select 来自 table 的单行。名称是按顺序排列的,显示为“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'
当我使用以下查询检查值的长度时,它显示的长度为 7
-- Check the length
select (Name), len(Name) AS TextLength
from [dbo].[RoutineMaintenanceTask]
where Name = 'RM004'
很明显这个名字前后有一些字符,但不是space。
不仅如此,我通过 Visual Studio 调试器检查了该值,并没有发现任何异常。
然而,当我从 SQL 结果窗格中复制“名称”的值并将其复制到记事本 ++ 时,带有特殊字符,我能够看到这个。
最终,我能够通过在 select 语句
之前添加以下代码来解决这个问题
-- Remove the tail
UPDATE [dbo].[RoutineMaintenanceTask] SET Name = substring(Name,1,5);
我只需要知道如何知道在这种情况下隐藏的字符是什么以及如何在不使用子字符串的情况下消除它(因为在这种情况下,这很容易,因为我知道长度)。
PS- 我知道使用关键字“name”作为 table 的字段不是一个好的做法,但在这种情况下与此无关。
可能是 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)
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;
我使用名为“Name”的字段编写了一个简单的 select 查询 select 来自 table 的单行。名称是按顺序排列的,显示为“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'
当我使用以下查询检查值的长度时,它显示的长度为 7
-- Check the length
select (Name), len(Name) AS TextLength
from [dbo].[RoutineMaintenanceTask]
where Name = 'RM004'
很明显这个名字前后有一些字符,但不是space。
不仅如此,我通过 Visual Studio 调试器检查了该值,并没有发现任何异常。
然而,当我从 SQL 结果窗格中复制“名称”的值并将其复制到记事本 ++ 时,带有特殊字符,我能够看到这个。
最终,我能够通过在 select 语句
之前添加以下代码来解决这个问题-- Remove the tail
UPDATE [dbo].[RoutineMaintenanceTask] SET Name = substring(Name,1,5);
我只需要知道如何知道在这种情况下隐藏的字符是什么以及如何在不使用子字符串的情况下消除它(因为在这种情况下,这很容易,因为我知道长度)。
PS- 我知道使用关键字“name”作为 table 的字段不是一个好的做法,但在这种情况下与此无关。
可能是 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)
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;