Я имею дело с этим типом вещей все время.Для таких вещей NGrams8K и PatReplace8k и PATINDEX - ваши лучшие друзья.
Поместив то, что вы разместили в табличную переменную, мы можем проанализировать проблему:
DECLARE @table TABLE (txtID INT IDENTITY, txt NVARCHAR(100));
INSERT @table (txt)
VALUES ('Development'),('Staging'),('Test'),('Pre-Production'),('UNKNOWN'),(NULL),
('Need to be decommissioned'),('Production'),(''),('Pre-Production'),('Decommissioned'),
('Non-Production'),('Unsupported Edition');
Этот запрос будет определять элементы с символами, отличными от AZ, пробелов и дефисов:
SELECT t.txtID, t.txt
FROM @table AS t
WHERE PATINDEX('%[^a-zA-Z -]%',t.txt) > 0;
Возвращает:
txtID txt
----------- -------------------------------------------
10 Pre-Production
Чтобы определить плохого персонажа, мы можем использовать NGrams8k , например:
SELECT t.txtID, t.txt, ng.position, ng.token -- ,UNICODE(ng.token)
FROM @table AS t
CROSS APPLY dbo.NGrams8K(t.txt,1) AS ng
WHERE PATINDEX('%[^a-zA-Z -]%',ng.token)>0;
Что возвращает:
txtID txt position token
------ ----------------- -------------------- ---------
10 Pre-Production 11 ?
PatReplace8K позволяет легко и быстро убирать подобные вещи.Сначала запомните этот запрос:
SELECT OldString = t.txt, p.NewString
FROM @table AS t
CROSS APPLY dbo.patReplace8K(t.txt,'%[^a-zA-Z -]%','') AS p
WHERE PATINDEX('%[^a-zA-Z -]%',t.txt) > 0;
, который возвращает это в моей системе:
OldString NewString
------------------ ----------------
Pre-Produc?tion Pre-Production
Чтобы исправить проблему, вы можете использовать patreplace8K, например:
UPDATE t
SET txt = p.newString
FROM @table AS t
CROSS APPLY dbo.patReplace8K(t.txt,'%[^a-zA-Z -]%','') AS p
WHERE PATINDEX('%[^a-zA-Z -]%',t.txt) > 0;