Stawiałem czoła temu problemowi kilka lat temu, więc napisałem funkcję SQL, aby załatwić sprawę. Here is the original article (został użyty do skasowania tekstu z HTML). I od tego czasu aktualizowany funkcję w następujący sposób:
IF (object_id('dbo.fn_CleanString') IS NOT NULL)
BEGIN
PRINT 'Dropping: dbo.fn_CleanString'
DROP function dbo.fn_CleanString
END
GO
PRINT 'Creating: dbo.fn_CleanString'
GO
CREATE FUNCTION dbo.fn_CleanString
(
@string varchar(8000)
)
returns varchar(8000)
AS
BEGIN
---------------------------------------------------------------------------------------------------
-- Title: CleanString
-- Date Created: March 26, 2011
-- Author: William McEvoy
--
-- Description: This function removes special ascii characters from a string.
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
declare @char char(1),
@len int,
@count int,
@newstring varchar(8000),
@replacement char(1)
select @count = 1,
@len = 0,
@newstring = '',
@replacement = ' '
---------------------------------------------------------------------------------------------------
-- M A I N P R O C E S S I N G
---------------------------------------------------------------------------------------------------
-- Remove Backspace characters
select @string = replace(@string,char(8),@replacement)
-- Remove Tabs
select @string = replace(@string,char(9),@replacement)
-- Remove line feed
select @string = replace(@string,char(10),@replacement)
-- Remove carriage return
select @string = replace(@string,char(13),@replacement)
-- Condense multiple spaces into a single space
-- This works by changing all double spaces to be OX where O = a space, and X = a special character
-- then all occurrences of XO are changed to O,
-- then all occurrences of X are changed to nothing, leaving just the O which is actually a single space
select @string = replace(replace(replace(ltrim(rtrim(@string)),' ', ' ' + char(7)),char(7)+' ',''),char(7),'')
-- Parse each character, remove non alpha-numeric
select @len = len(@string)
WHILE (@count <= @len)
BEGIN
-- Examine the character
select @char = substring(@string,@count,1)
IF (@char like '[a-z]') or (@char like '[A-Z]') or (@char like '[0-9]')
select @newstring = @newstring + @char
ELSE
select @newstring = @newstring + @replacement
select @count = @count + 1
END
return @newstring
END
GO
IF (object_id('dbo.fn_CleanString') IS NOT NULL)
PRINT 'Function created.'
ELSE
PRINT 'Function NOT created.'
GO
Widzę, że każdy poleca funkcje. \t Podoba mi się pomysł użycia funkcji zdefiniowanej przez użytkownika, ale potem musi przejść przez kontrolę zmian, aby dostać się do środowiska produkcyjnego. Nie ma możliwości, aby w zapytaniu była funkcja in-line, prawda? Nie jestem pewien, jakiego języka używają do wywoływania zapytania SQL, może VBScript lub Powershell, ale teraz myślę, że dużo łatwiej będzie zrobić stripping w tym języku. – NealWalters
Podobnie jak tabelę numerów lub tabelę kalendarza lub funkcje, które dzielą lub łączą łańcuchy, funkcja, która może wykonywać tego typu rzeczy, jest przydatnym modułem do obejrzenia. Nawet jeśli nie nastąpi od razu, powinieneś rozważyć posiadanie tych rzeczy w bazie danych narzędzi. Nie wiem, czy wykonanie tego w kodzie jest zawsze najlepszą odpowiedzią, szczególnie, jeśli wiele różnych aplikacji musi zrobić to samo ... –
@Alex K., Lubię to rozwiązanie lepiej niż moje własne. Nigdy nie lubiłem, gdybym badał ciąg po jednej postaci naraz.Czy masz sposób na zastąpienie dodatkowych spacji i znaków specjalnych (cr/lf, tab)? – datagod