2012-02-28 8 views
4

私はストアドプロシージャに取り組んでいて、2つの本当に恐ろしい行があるところにヒットしました。ストアドプロシージャ内でこれを明確に書き直す方法はありますか?そうでない場合は、これを行う関数を作成するにはどうしたらいいですか?リファクタリング - 2つの恐ろしい行

, REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(l.tenant_trading_name,'~','-'), '"','-'), '#','-'), '%','-'), '*','-'), ':','-'), '<','-'), '>','-'), '?','-'), '/','-'), '\','-'), '{','-'), '|','-'), '}','-') as trading_name 
    , REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(l.suite_name,'&','-'), '~','-'), '"','-'), '#','-'), '%','-'), '*','-'), ':','-'), '<','-'), '>','-'), '?','-'), '/','-'), '\','-'), '{','-'), '|','-'), '}','-') as suite_name 
+1

は役立つかもしれない:http://stackoverflow.com/questions/1864838/remove-trailing-empty-space-in-a-field-content –

+3

ジャストアイデア:T-SQLは、基本的には、文字列操作で吸うので、 :C#で "文字列ヘルパー"アセンブリを作成し、SQL CLRを使用してSQL Serverに組み込む方法はありますか?文字列操作のための.NETのものは、T-SQLの限られた機能よりもはるかに強力です(使いやすく!)。 –

+0

@marc_s興味をそそる、それを考慮していませんでした。それをもっと調べて、オプションとして探検します。どうもありがとうございました – Codingo

答えて

2

さてあなたは単にあなたのために汚い仕事を行う機能かもしれない。そして、

CREATE FUNCTION dbo.CleanCharacters 
(
    @InputString VARCHAR(64), 
    @UseAmp BIT 
) 
RETURNS VARCHAR(64) 
AS 
BEGIN 
    RETURN(SELECT REPLACE(REPLACE(REPLACE(...REPLACE(
     @InputString, CASE WHEN @UseAmp = 1 THEN '&' ELSE '-' END, '-'), 
     '~', '')...etc etc...))) 
); 
END 
GO 

あなたが言うことができます。これは、少なくともアウト醜いREPLACE()呼び出しを抽象化し

SELECT dbo.CleanCharacters(l.tenant_trading_name, 0), 
dbo.CleanCharacters(l.suite_name, 1) FROM ... 

をの手順。

(私はかなり他の違いがあったかどうかを確認するために行全体を解析しませんでしたが、唯一の違いはsuite_nameが&が、取引名でしを持つことができませんでしたように私には思えたことに注意してください。)

もう1つの方法は、あなたの「悪い」文字をテーブルに保存して、それらの置換のメンテナンスを少し簡単にすることです(そして、テーブルにデータが取り込まれると、関数がもっときれいになります)。

CREATE TABLE dbo.DirtyCharacters(x CHAR(1)); 

INSERT dbo.DirtyCharacters SELECT '~' 
    UNION ALL SELECT '&' 
    UNION ALL SELECT '*' 
-- ... 
; 

今、あなたはあなたの機能を持たせることができるだけで言う:

ALTER FUNCTION dbo.CleanCharacters 
(
    @InputString VARCHAR(64), 
    @UseAmp BIT 
) 
RETURNS VARCHAR(64) 
AS 
BEGIN 
    SELECT @InputString = REPLACE(@InputString, x, '-') 
    FROM dbo.DirtyCharacters 
    WHERE x <> CASE WHEN @UseAmp = 1 THEN '' ELSE '&' END; 

    RETURN (@InputString); 
END 
GO 
+0

これまでのところ、最も良い選択肢のようです。 – Codingo

0

が、それは例えば、あなたの最初の文字列のために働くようです。

SELECT @Str = REPLACE(@Str , chr , '-') 
     FROM (SELECT '~' UNION 
     SELECT '"' UNION 
     SELECT '#' UNION 
       SELECT '%' UNION 
       SELECT '*' UNION 
       SELECT ':' UNION 
       SELECT '<' UNION 
       SELECT '>' UNION 
       SELECT '?' UNION 
       SELECT '/' UNION 
       SELECT '\' UNION 
       SELECT '{' UNION 
       SELECT '|' UNION 
       SELECT '}' UNION 
       SELECT '%') D (chr) 
    WHERE CHARINDEX(chr , @Str) > 0 ; 
    SELECT @str ; 
+1

2つのクイックコメント:(1)すべてのREPLACE行よりもクエリの方がきれいです。(2)変数の割り当てが疑わしいですこれが複数行のクエリの 'SELECT'リストの一部である場合、ここで有効です。 –

関連する問題