2009-05-13 14 views
4

ユーザーのSQLServer 2005 で複数のインスタンスを交換することは、私はとこだわっている文字列の例です。 ;} {\ F1 \ fnil \ fcharset0のArial;}} \ viewkind4 \ UC1 \ PARD \ F0 \ fs54 1000年\ F1 \ FS20 \パー}select文ここ

私は 'のTimes New Roman' で任意のフォント名を置き換えたい

Select Replace(textlong1, 
     CASE When CharIndex(';',textlong1)> 10 Then 
     SubString(textlong1 
     , Charindex('fcharset',textlong1)+10 
     , CharIndex(';',textlong1) - Charindex('fcharset',textlong1)-10) 
     Else '' End 
     , 'Times New Roman') From exampletable 

私はケースのstatemeを使用しています:

私は(textlong1がフィールドである)との最初のものを得ることができますサブストリングがエラーにならないようにします。

私はループしても 'fcharset'を置き換えないので、2番目のインスタンスを見つけることができません(常に最初のものに固執します)。

答えて

1

最初のものを交換できる場合は、最初のものがなくなるまで交換してください。新しい変数に

declare @done bit 
while @done <> 1 
    begin 
    UPDATE ... 
    if @@rowcount = 0 set done = 1 
    end 

または選択:アップデートやっている場合は

declare @cur varchar(4000) 
declare @next varchar(4000) 
set @cur = 'The string to operate on' 
set @next = '' 
while @cur <> @next 
    begin 
    set @next = @cur 
    select @cur = REPLACE(@next,...) 
    end 

を最終的な結果は、今@curに保存されている(そして、あまりにも@next。)され

+0

私は 'fcharset'を置き換えていないので、最初に修正したものをスキップすることはできません(編集を参照)。 – JeffO

+0

開始する前に、すべての "fcharset0 Times New Roman"を "fcharset0 Arial Rounded MT Bold"に置き換えてください。ループの繰り返しごとに、索引1で検索を開始するか、または最初に "fcharset0 Times New Roman"が出現した後に検索を開始します。 – Andomar

+0

助けてくれてありがとう。私は以下を追加しました declare @Start int - すべてのCharIndex関数でこれを開始点として含めます - Whileループの最後の行: SET @Start = Charindex( ';'、@ next、@Start) – JeffO

0

いつでも区切り文字を使用して、フォントリストのインスタンスの周りの文字列を分割し、新しいローマ字に置き換えることができます。

+0

あなたをしました平均デリミタ?検索をしようとしています。 – JeffO

+0

はい、それは私が意味するものです – DForck42

2

.NET CLRの機能(MSDNにはそのための例がたくさんあります)を統合することができれば、正規表現の置き換えを使用してタスクを非常に簡単にすることができます。

+0

これは、このデータベースを使用しているサードパーティのアプリケーションです(フロントエンドをもっとコントロールしていれば、このナンセンスは許されません)。私はこれが問題を生み出すかどうかを見なければならないでしょう。 – JeffO

+0

ええ、.NET CLRの統合は実用的ではありません(MSDNがどれくらいプッシュしていても、それが私が「できれば」と言った理由です)。できない場合は、他の回答に示唆されている回避策をすべて残しておきます。 –

+0

唯一の本当の問題は、私がCLRの非効率的な使用を聞いたことから、非常に高いオーバーヘッドが生じるということです。 – DForck42