2016-11-22 28 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出力は私が怖い入れ子になった 'REPLACE'文より良い方法はないと思う、 – Chanukya

+0

パフォーマンスが賢明でなければなりません。 – 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

関連する問題