Мне известно о ДАННЫХ (). Просто любопытно, почему лечится одно место
как "тянущийся", если перед ним ничего нет.
Это трейлинг, потому что он в конце строки. Это также ведущий, так как это в начале.
Но если функция вызывается с @lookfor = '', это отключает ошибку
То, что мешает многим людям использовать SQL, это то, как '' = ''; Обратите внимание на этот запрос:
DECLARE @blank VARCHAR(10) = '', @space VARCHAR(10) = CHAR(32);
SELECT CASE WHEN @blank = @space THEN 'That the...!?!?' END;
Вы можете изменить @space на CHAR (32) + CHAR (32) + .... и @space и @blank все равно будут равны.
Сложнее немного заметить, что DATALENGTH
для пустого / пустого значения равно 0, когда это VARCHAR (N), но DATALENGTH равно N, когда для значений CHAR (N). Другими словами,
SELECT DATALENGTH(CAST('' AS CHAR(1)))
возвращает 1 и SELECT DATALENGTH(CAST('' AS CHAR(10)))
возвращает 10.
Это означает, что если ваша переменная-разделитель скажет CHAR (1) - это запутает вас. Вот функция для вас:
CREATE FUNCTION dbo.CountDelimiters(@string VARCHAR(8000), @delimiter VARCHAR(1))
RETURNS TABLE WITH SCHEMABINDING AS RETURN
SELECT DCount = MAX(DATALENGTH(@string)-LEN(REPLACE(@string,@delimiter,'')))
WHERE DATALENGTH(@delimiter) > 0;
Обратите внимание, что @delimter - это VARCHAR (1), а NOT - тип данных CHAR.
Формула для подсчета разделителей в @string:
DATALENGTH(@string)-LEN(REPLACE(@string,@delimiter,''))
или
(DATALENGTH(@string)-LEN(REPLACE(@string,@delimiter,'')))/DATALENGTH(@delimiter)
при работе с разделителями длиннее 1`.
WHERE DATALENGTH(@delimiter) > 0
заставит функцию игнорировать NULL или пустое значение. Это известно как Startup Predicate .
Установка MAX вокруг DATALENGTH(@string)-LEN(REPLACE(@string,@delimiter,''))
заставляет функцию возвращать значение NULL, если вы передаете ему пустое значение или значение NULL.
Это вернет 10 для количества пробелов в моей строке:
SELECT f.DCount FROM dbo.CountDelimiters('one space two spaces three ', CHAR(32)) AS f;
Против таблицы вы бы использовали такую функцию (обратите внимание, что я считаю количество раз, когда появляется буква "A":
-- Sample Strings
DECLARE @table TABLE (SomeText VARCHAR(36));
INSERT @table VALUES('ABCABC'),('XXX'),('AAA'),(''),(NULL);
SELECT t.SomeText, f.DCount
FROM @table AS t
CROSS APPLY dbo.CountDelimiters(t.SomeText, 'A') AS f;
Что возвращает:
SomeText DCount
------------------------------------ -----------
ABCABC 2
XXX 0
AAA 3
0
NULL NULL