「テキスト {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
関数が意図したとおりに機能するように修正するもの、またはより良いアプローチがあるだけのもの (動的クエリの構築を含まないことを願っています)。