我编写了一个简单的选择查询,以使用名为“名称”的字段从表中选择一行。名称是连续的,并显示为“ 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'
很明显,此名称前后包含一些字符,但不是空格。
不仅如此,我还通过Visual Studio调试器检查了该值,并且没有发现任何异常。
尽管如此,当我从SQL结果窗格中复制“名称”的值并将其复制到具有特殊字符的notepad ++上时,我仍然能够看到它。
最终,我能够通过在select语句之前添加以下代码来解决此问题
-- Remove the tail
UPDATE [dbo].[RoutineMaintenanceTask] SET Name = substring(Name,1,5);
我只需要知道如何在这种情况下了解隐藏的字符,以及如何在不使用子字符串的情况下消除它们(因为在这种情况下,很容易,因为我知道长度)。
PS-我知道使用“名称”作为表的字段不是一个好习惯,但是在这种情况下,这与之无关。
答案 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;