1

我有一个具有模板 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

什么将修复该功能以使其按预期工作,或者是否有更好的方法(希望它们不涉及动态查询构建)。

4

2 回答 2

1
DECLARE @t AS templateVarsType

INSERT INTO @t
SELECT '{planet}','World'
UNION
SELECT '{galaxy}','MilkyWay'

SELECT dbo.applyTemplate( 'Hello, {planet}! Welcome to the {galaxy}.'
                         , @t )

检查这个小提琴http://sqlfiddle.com/#!3/edda3/10

于 2013-09-12T15:50:47.170 回答
1
-- Applying a template using a single replace
DECLARE @return NVARCHAR(MAX) = 'Hello, {planet}! Welcome to the {galaxy}.';

SELECT @return = REPLACE(@return, [search], [replacement])
FROM
(VALUES 
  ('{planet}', 'World')
, ('{galaxy}', 'MilkyWay')
) AS templateVars([search], [replacement]);

SELECT @return;
于 2017-09-20T05:33:19.970 回答