1

「テキスト {var1} テキスト {othervar}」としてフォーマットされたテンプレート html を持つデータベース テーブルがあります。以下よりも実用的な方法で文字列置換を適用したいと思います。

set @template = replace(@template, '{var1}', field.value);
set @template = replace(@template, '{othervar}', field.othervalue);
-- notice I don't have matching template variables and data fields

テンプレートを適用する数十の変数と数百のサブジェクトがあります。私はむしろこれを SQL の外で行いたいのですが、それは選択肢ではありません。

私は次のことを思いつきましたが、TABLE の近くで間違った構文を取得します。これを Microsoft SQL Server バージョン 10.50.2500 (2008) で実行しました。DB は互換性 90 (2005) に設定されていましたが、100 (SQL Server 2008) に変更した後でも、同じエラーが発生しました。

CREATE FUNCTION applyTemplate 
(
  @subject nvarchar(max),
  @replacements as TABLE (
    search nvarchar(64),
    replacement nvarchar(max)
  )
)
RETURNS nvarchar(max)
AS BEGIN
  DECLARE @return nvarchar(max)
  set @return = @subject

  select @return = replace(@return, search, replacement) from @replacements
  RETURN @return
END

SELECT applyTemplate(
  'Hello, {planet}! Welcome to the {galaxy}.', 
  (select '{planet}','World' union select '{galaxy}', 'MilkyWay')
)

applyTemplate 関数に入る実際のソース データ クエリは、おそらくこのようなユニオンからではなく、相関サブクエリである可能性があります。

select 
  person.email,
  applyTemplate(
    template.body,
    (select n,v from person_vars pv where pv.person=person.id)
  ) as body 
from template 
cross join person 
where template.id = 1

関数が意図したとおりに機能するように修正するもの、またはより良いアプローチがあるだけのもの (動的クエリの構築を含まないことを願っています)。

4

2 に答える 2