データベースからデータを返すクエリがあります。!markerstart!
1 つのフィールドに、セグメントを含むかなり長いテキスト コメントがあり、や などのマーキング タグで明確に定義されています!markerend!
。2 つのマーカーの間の文字列セグメントが削除された (およびマーカーも削除された) クエリを返したいと思います。
私は通常、データを取得した後にクライアント側でこれを行いますが、問題は、クエリがステートメントINSERT
からデータを取得するクエリであることです。SELECT
テキスト セグメントをアーカイブ/レポート テーブル (ここでは OLTP アプリケーションで作業) に保存したくないので、SELECT
挿入する内容を正確に返すステートメントを取得する方法を見つける必要があります。ケースでは、SELECT
後処理クライアント側で行うのではなく、不要なフレーズを削除するステートメントを取得することを意味します。
SUBSTRING
私の唯一の考えは、 、CHARINDEX
、およびの複雑な組み合わせを使用することですが、より良い方法があることを望んでいますが、これCONCAT
に基づいて、方法がわかりません。誰にもアイデアがありますか?
サンプル:
これは、削除する必要があるセグメントを持つデータベース内のフィールドにある長いテキスト文字列です。!マーカースタート! これは、削除されるセグメントです。長さは不明で可変です。!マーカーエンド! マーカーの後に表示されるこのフィールドの部分はそのままにしておく必要があります。
結果:
これは、削除する必要があるセグメントを持つデータベース内のフィールドにある長いテキスト文字列です。マーカーの後に表示されるこのフィールドの部分はそのままにしておく必要があります。
スタッフを使用したソリューション:
これがどれほど冗長であるかは本当に好きではありませんが、本当に必要な場合は関数に入れることができます。これは理想的ではありませんが、CLR ルーチンよりも簡単で高速です。
SELECT STUFF(CAST(Description AS varchar(MAX)), CHARINDEX('!markerstart!', Description), CHARINDEX('!markerend!', Description) + 11 - CHARINDEX('!markerstart!', Description), '') AS Description
FROM MyTable