我有一个具有模板 html 的数据库表,格式为“text {var1} text {othervar}”。我想以比以下更实用的方式应用字符串替换:
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) 上运行它。数据库设置为 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
什么将修复该功能以使其按预期工作,或者是否有更好的方法(希望它们不涉及动态查询构建)。