Предполагается, что это вызвано управляющими символами. Некоторые из которых невидимы. Но также включают вкладки, новые строки и пробелы. Пример для иллюстрации и как заставить их появляться.
--DROP TABLE #SillyTemp
DECLARE @InvisibleChar1 NCHAR(1) = NCHAR(28), @InvisibleChar2 NCHAR(1) = NCHAR(30), @NonControlChar NCHAR(1) = NCHAR(33);
DECLARE @InputString NVARCHAR(500) = N'Some |' + @InvisibleChar1 +'| random string |' + @InvisibleChar2 + '|' + '; Thank god Finally a normal character |' + @NonControlChar + '|';
SELECT @InputString AS OhNoInvisibleCharacters
DECLARE @ControlCharRange NVARCHAR(50) = N'%[' + NCHAR(1) + '-' + NCHAR(31) + ']%';
CREATE TABLE #SillyTemp
(
input nvarchar(500)
)
INSERT INTO #SillyTemp(input)
VALUES (@InputString),(N'A normal string')
SELECT @ControlCharRange;
SELECT input FROM #SillyTemp AS #SI WHERE input LIKE @ControlCharRange;
Это дает 3 результата. Строка с невидимыми символами внутри них, например:
Некоторые ||случайная строка ||;Слава богу, наконец, нормальный символ |! |
Обратите внимание, что на самом деле они невидимы внутри SQL. Но stackoverflow показывает их как таковые. Выходные данные в SQL Server просто.
Некоторые ||случайная строка ||;Слава богу, наконец, нормальный символ |! |
Но эти символы по-прежнему имеют соответствующее значение (N) CHAR (X). (N) CHAR (0) является символом NULL и очень маловероятно, что он будет в строке, в моей настройке, чтобы обнаружить их, он также создает некоторые проблемы при построении диапазона. (N) CHAR (32) - это символ пробела.
Принцип работы строкового оператора [XY] также основан на (N) числах CHAR. Поэтому мы можем сделать диапазон [NCHAR (1) -NCHAR (31)]
Последний выбор проходит через временную таблицу, в которой есть невидимые символы. Так как мы ищем любые NCHARS между 1 и 31, только условия с невидимыми символами (и часто недопустимыми символами или символами табуляции / перевода строки) удовлетворяют условию where. Таким образом, только они возвращаются. В этом случае в моем операторе select возвращается только «неисправная» строка.