如何用 SQL 服务器中另一个 table 的值替换消息中的标签

How to replace tags in a message with values from another table in SQL Server

我有 2 个 table,其中一个包含带有某些标签的消息,这些标签可以替换为我系统特定区域的值。

另一个 table 包含标签值。

有没有办法让我写一个 SQL select 语句,这样我就可以查看消息描述,并将标签替换为实际值。这是我的 tables

的示例

Table 1 - MessageDescriptions

Id      Description
------------------------------------------------------
1       This message is for <<User.Name>>.       
2       <<User.Name>> uses the currency <<Currency.Code>>.

Table 2 - TagValues

Id      Tags                                               DescriptionId
----------------------------------------------------------------------------
5       [<<User.Name>>:Mr John Smith]                          1
6       [<<User.Name>>:Mr John Smith][<<Currency.Code>>:GBP]   2

这些标签存储在 table 的同一列中,这就是导致我出现问题的原因。有谁知道我可以替换标签值的方法,例如John Smith 先生在消息描述中使用标签?

这是我目前所有的,但这只是 select 每个 table 的 2 列。我现在需要用标签值替换标签:

SELECT
    TagValues.Tags, 
    MessageDescriptions.[Description]
FROM 
    TagValues 
INNER JOIN 
    MessageDescriptions ON TagValues.DescriptionId = MessageDescriptions.Id

对于这个例子,我希望我的输出是:

Description
------------------------------------------------------
This message is for Mr John Smith.       
Mr John Smith uses the currency GBP.

可能只是简单地使用替换我们就可以实现这一点

DECLARE @Table1 TABLE 
    (Id int, Description varchar(50))
;

INSERT INTO @Table1
    (Id, Description)
VALUES
    (1, 'This message is for <<User.Name>>.'),
    (2, '<<User.Name>> uses the currency <<Currency.Code>>.')
;
DECLARE  @Table2 TABLE 
    (Id int, Tags varchar(52), DescriptionId int)
;

INSERT INTO @Table2
    (Id, Tags, DescriptionId)
VALUES
    (5, '[<<User.Name>>:Mr John Smith]', 1),
    (6, '[<<User.Name>>:Mr John Smith][<<Currency.Code>>:GBP]', 2)
;

SELECT
TagValues.Tags, 
REPLACE(REPLACE(MessageDescriptions.[Description],'<<User.Name>>','Mr John Smith'),'<<Currency.Code>>','GBP')
FROM @Table2 TagValues 
INNER JOIN @Table1 MessageDescriptions ON TagValues.DescriptionId = MessageDescriptions.Id

好的,我希望这对其他人有帮助。我设法找到了一种方法,但它并不漂亮。 这是代码:

DECLARE @EntityId uniqueidentifier = ''

CREATE TABLE #AuditTags
(
    AuditId uniqueidentifier NOT NULL,
    TagField nvarchar(40),
    TagValue nvarchar(300)
)
CREATE TABLE #AuditDetails
(
    [AuditId] uniqueidentifier NOT NULL,
    [DateCreated] datetime,
    [Description] nvarchar(max),
    [UserId] uniqueidentifier
)

INSERT INTO #AuditTags (AuditId, TagField, TagValue)
SELECT A.AuditId, Split.a.query('field').value('.', 'VARCHAR(100)') AS Tag, Split.a.query('value').value('.', 'VARCHAR(100)') AS Value  
 FROM  
 (
     SELECT event_audit_id AS AuditId,  
         CAST ('<doc>' + REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(tag_value, ':', ''), '|', ''), '<<', '<field>'), '>>', '</field><value>'), '[', '<tag>'), ']', '</value></tag>') + '</doc>' AS XML) AS Data  
     FROM  TagValues
     WHERE [entity_id] = @EntityId
 ) AS A CROSS APPLY Data.nodes ('/doc/tag') AS SPLIT(a);

INSERT INTO #AuditDetails
SELECT event_audit_id, TagValues.date_created, MessageDescriptions.[description], [user_id]
FROM TagValues
INNER JOIN MessageDescriptions ON TagValues.content_template_id = MessageDescriptions.content_template_id 
WHERE TagValues.[entity_id] = @EntityId

DECLARE @AuditId uniqueidentifier, @TagField nvarchar(40), @TagValue nvarchar(300)
DECLARE tag_cursor CURSOR
    FOR SELECT AuditId, TagField, TagValue FROM #AuditTags
OPEN tag_cursor
FETCH NEXT FROM tag_cursor INTO @AuditId, @TagField, @TagValue
WHILE @@FETCH_STATUS = 0
BEGIN
    UPDATE #AuditDetails SET [Description] = REPLACE([Description], '<<'+@TagField+'>>', @TagValue) WHERE AuditId = @AuditId

    FETCH NEXT FROM tag_cursor INTO @AuditId, @TagField, @TagValue
END
CLOSE tag_cursor;
DEALLOCATE tag_cursor;

SELECT
AuditId,
DateCreated AS [Date and time],
[Description], 
[User].salutation + ' ' + [User].first_name + ' ' + [User].last_name AS Actioner
FROM #AuditDetails
INNER JOIN [User] ON #AuditDetails.UserId = [User].[user_id]

DROP TABLE #AuditTags
DROP TABLE #AuditDetails