如何用 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
我有 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