首页 > 解决方案 > 在 SQL Server 2014 中迭代临时表以构建字符串的最佳方法

问题描述

我创建了一个临时表,想法是我想遍历它,匹配具有相同电子邮件地址的所有记录,然后填充一个字符串,该字符串将进入电子邮件,然后删除表。这将作为存储过程运行。

我使用了一个游标,它首先抓取所有唯一的电子邮件地址,然后合并记录,但可能有 100k-500k 记录的性能将无法接受,而且我知道必须有一种更有效的方法来做到这一点。

示例数据(抱歉,不知道如何正确格式化)

#temptable

temp_email, temp_string

test@test.com string1
test@test.com string2
test2@test.com string3
test2@test.com string4
test3@test.com string5

然后我想用这个数据填充另一个表

emailto...   emailbody

test@test.com   'string1<br / > string2'
test2@test.com   'string3<br / > string4'
test3@test.com   'string5'

谢谢你。

标签: sqlsql-server

解决方案


STUFFandFOR XML PATH方法在 SQl Server 2014 及更早版本中很好地实现了这一点。因为你有角色<>但是,他们需要在之后“未转义”:

WITH VTE AS(
    SELECT *
    FROM (VALUES('test@test.com','string1'),
                ('test@test.com','string2'),
                ('test2@test.com','string3'),
                ('test2@test.com','string4'),
                ('test3@test.com','string5')) V(Email, String))
SELECT Email,
       STUFF(REPLACE(REPLACE((SELECT '<br/>' + sq.String
                              FROM VTE sq
                              WHERE sq.Email = V.Email
                              FOR XML PATH('')),'&lt;','<'),'&gt;','>'),1,5,'')
FROM VTE V
GROUP BY Email;

推荐阅读