Если я знаю, какие символы я не хочу оставлять в своей строке, я могу легко удалить их с помощью REPLACE:
SELECT REPLACE(
REPLACE(
REPLACE(
'String with characters like #§$ I do not want to keep',
'#', ''
), '§', ''
), '$', ''
) AS repl_string
--- String with characters like I do not want to keep
Но что, если я хочу удалить все символы, не входящие в положительный список? С regex я бы сделал что-то вроде s/[^a-zA-Z0-9 :.]//g (при условии, что я хотел бы разрешить только буквы, цифры, пробел , точку . или двоеточие :)
Я ищу решение для Microsoft SQL Server 2016
SQL Server не поддерживает Regex, не говоря уже о замене Regex. Хотя, если вы просто хотите сохранить перечисленные там символы, вы можете использовать базовое сопоставление шаблонов SQL Server вместе с решением, которое у меня есть в этом ответе
@RhythmWasaLurker да, это так. Версия 13 — это SQL Server 2016.
Хм, когда я нажимаю на свойства в SSMS, он показывает именно это: Version: 13.0.6300.2
Это SQL Server 2016 SP2, @thothal.


В этом ответе используется решение, очень похожее на ответ , на который я ссылался выше, однако, поскольку OP использует SQL Server 2016, они не могут использовать STRING_AGG. Таким образом, вам нужно будет использовать «старый» метод FOR XML PATH (и STUFF) для повторной агрегации строки:
CREATE OR ALTER FUNCTION [dbo].[PatternCharacterReplace_XML] (@String varchar(8000), @Pattern varchar(100), @ReplacementCharacter varchar(1))
RETURNS table
AS RETURN
WITH N AS(
SELECT N
FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL))N(N)),
Tally AS(
SELECT TOP(LEN(@String))
ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS I
FROM N N1, N N2, N N3, N N4)
SELECT (SELECT CASE WHEN V.C LIKE @Pattern THEN @ReplacementCharacter ELSE V.C END
FROM Tally T
CROSS APPLY (VALUES(SUBSTRING(@String,T.I,1)))V(C)
ORDER BY T.I
FOR XML PATH(''),TYPE).value('(./text())[1]','varchar(8000)') AS ReplacedString;
GO
SELECT *
FROM dbo.PatternCharacterReplace_XML('String with characters like #§$ I do not want to keep','[^A-Za-z0-9 .:]','');
Обратите внимание, что в этой конкретной версии используются значения varchar. Если ваше значение равно nvarchar, я бы предложил создать отдельную версию, которая использует этот тип данных для параметров.
Пожалуйста, добавьте ясности с примерными данными и ожидаемыми результатами. Звучит как работа для
translateвозможно.