Как удалить конечные пробелы, такие как символы в SQL Server - PullRequest
0 голосов
/ 16 ноября 2018

Я написал простой запрос на выбор, чтобы выбрать одну строку из таблицы, используя поле с именем «Имя». Имена являются последовательными и представлены как «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

В конечном итоге мне удалось решить эту проблему, добавив следующий код перед оператором выбора

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

Мне просто нужно знать, как узнать, что такое скрытые символы в подобном случае, и как устранить их без использования подстроки (потому что в этом случае это было легко, потому что я знал длину).

PS. Я понимаю, что использование ключевого слова 'name' в качестве поля таблицы не является хорошей практикой, но в этом контексте это не имеет никакого отношения.

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018
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

0 голосов
/ 16 ноября 2018

Вероятно, это было либо 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)
...