2016-11-22 19 views
0

После небольшого исследования я узнал, как удалить ряд нежелательных символов из строки. Я планирую бросить это в функцию и вызвать ее, когда это необходимо.Функция удаления нежелательных символов - SQL Server

Как правило, когда я программирую или кодирую что-то, я просто хочу, чтобы он работал, а не работал хорошо, поэтому мне было интересно узнать, есть ли у вас эксперты SQL Server, что-нибудь, что могло бы сделать код более изящным, и если вы сможете обнаружить любой потенциальный SQL вопросы для инъекций:

IF OBJECT_ID('tempdb..#tmpMNHArrayOfChars') IS NOT NULL DROP TABLE #tmpMNHArrayOfChars 
IF OBJECT_ID('tempdb..#ExcludedChars') IS NOT NULL DROP TABLE #ExcludedChars 
    GO 

DECLARE @SomeString VARCHAR(300); 
SET @SomeString = 'Fluffy=the_rab bit_'; 

DECLARE @Count INT; 
SET @Count = 0; 

DECLARE @Len INT; 
SET @Len = LEN(@SomeString); 

DECLARE @CharVal VARCHAR; 
DECLARE @CharPos INT; 

--Create a table for each char in the string 
CREATE TABLE #tmpMNHArrayOfChars (CharPos INT, CharVal VARCHAR) 

WHILE @Count <= @Len 
BEGIN 
    SET @CharVal = RIGHT(LEFT(@SomeString, @Count),1) 

    INSERT INTO #tmpMNHArrayOfChars (CharPos, CharVal) VALUES (@Count, @CharVal) 

    SET @Count = @Count + 1; 
END 

-- Set up Tmp table of excluded chars 
CREATE TABLE #ExcludedChars 
(
    CharId INT NOT NULL PRIMARY KEY, 
    CharString VARCHAR(12) 
) 
INSERT INTO #ExcludedChars (CharId, CharString) 
VALUES 
    (001, '!'), 
    (002, '£'), 
    (003, '$'), 
    (004, '%'), 
    (005, '^'), 
    (006, '&'), 
    (007, '*'), 
    (008, '('), 
    (009, ')'), 
    (010, '_'), 
    (011, '+'), 
    (012, '='), 
    (013, '@'), 
    (014, '~'), 
    (015, '#'), 
    (016, '\'), 
    (017, '/'), 
    (018, '|'), 
    (019, '{'), 
    (020, '}'), 
    (021, '['), 
    (022, ']'), 
    (023, '<'), 
    (024, '>'), 
    (025, '.'), 
    (026, ','), 
    (027, '¬') 

--Compare two tables and remove uneeded chars 
DECLARE @SomeInt INT 
DECLARE @SomeCount INT 

DELETE SC FROM #tmpMNHArrayOfChars SC 
CROSS JOIN #ExcludedChars EC WHERE SC.CharVal=EC.CharString 

SELECT * FROM #tmpMNHArrayOfChars SC 
+0

expedted выход должен быть – Chanukya

+0

С точкой зрения производительности, я не думаю, что это лучший способ, чем вложенное 'REPLACE' заявления я боюсь. – Bridge

+0

Возможный дубликат [Символьное сопоставление/поиск и замена символа по символу в SQL Server 2008 R2] (http://stackoverflow.com/questions/10070643/character-mapping-search-and-replace-character-by-character-in -sql-server-2008) – Bridge

ответ

0
DECLARE @SomeString VARCHAR(300); 
    SET @SomeString = 'Fluffy=the_rab bit_'; 
    SELECT CONVERT (VARCHAR, 
     (SELECT SUBSTRING(@SomeString,sv.number,1) FROM master.dbo.spt_values AS sv 
     WHERE sv.type='P' AND sv.number BETWEEN 1 AND LEN(@SomeString) 
     AND NOT EXISTS(SELECT 0 FROM #ExcludedChars AS e WHERE e.CharString= SUBSTRING(@SomeString,sv.number,1)) 
     FOR XML PATH(''),TYPE) 
    ) 
+0

Обратите внимание, что это будет поддерживать строки, содержащие не более 2047 символов по умолчанию – Bridge

+0

Спасибо! Заглядывая в мое плохое решение и вашу более чистую версию, я обнаружил, что я не могу включить это в какую-либо функцию, поскольку это использует временные таблицы, которые, кажется, не допускаются. – user2230423

+0

@ user2230423 ... ваш вопрос также использует временные таблицы ... – Bridge

Смежные вопросы