我有一个表格,其中包含电子邮件字段中的大量NULL。我需要做的是更新所有NULL行。对于每个NULL行,我需要执行存储过程,该存储过程基本上获取与该用户的ID相关的所有电子邮件。因此,对于每个NULL行,都会调用此存储过程,并且需要将此存储过程中找到的所有电子邮件字段连接在一起,并插入来自另一个表的NULL电子邮件字段。
任何人都知道如何在TSQL中实现它?
非常感谢提前
编辑:
我找到了这段代码:
WITH Ranked ( CategoryId, rnk, ProductName )
AS ( SELECT CategoryId,
ROW_NUMBER() OVER( PARTITION BY CategoryId ORDER BY CategoryId ),
CAST( ProductName AS VARCHAR(8000) )
FROM Northwind..Products),
AnchorRanked ( CategoryId, rnk, ProductName )
AS ( SELECT CategoryId, rnk, ProductName
FROM Ranked
WHERE rnk = 1 ),
RecurRanked ( CategoryId, rnk, ProductName )
AS ( SELECT CategoryId, rnk, ProductName
FROM AnchorRanked
UNION ALL
SELECT Ranked.CategoryId, Ranked.rnk,
RecurRanked.ProductName + ', ' + Ranked.ProductName
FROM Ranked
INNER JOIN RecurRanked
ON Ranked.CategoryId = RecurRanked.CategoryId
AND Ranked.rnk = RecurRanked.rnk + 1 )
SELECT CategoryId, MAX( ProductName )
FROM RecurRanked
GROUP BY CategoryId;
但是我无法在我的案例中使用它。
基本上,我可以简单地使用select语句来获取包含所有必要电子邮件的行,而不是使用存储过程。我基本上需要做的是将这些返回的电子邮件连接成一行。
答案 0 :(得分:4)
将多行转换为一行 - SQL Server 由于我需要向许多人发送电子邮件,我需要将多个电子邮件转换为由分号(;)分隔的单行,我有很多解决方案,但这是一种需要更多代码行的旧式解决方案。由于我想使用一个或两个可以解决的行代码,我找到了三种解决方案,非常简单。
方法1:
DECLARE @str varchar(4000)
SET @str = (SELECT CONTACT_EMAIL + ';' FROM table FOR XML PATH(''))
SET @str = SUBSTRING(@str,1,LEN(@str)-1)
SELECT @str
方法2:
DECLARE @str varchar(4000)
SELECT @str = COALESCE(@str + ';', '') + CONTACT_EMAIL FROM table
SELECT @str
方法3:
DECLARE @str varchar(4000)
SELECT DISTINCT STUFF( (SELECT CONTACT_EMAIL + ';' from table FOR XML PATH('')),1,1,'')
SELECT @str
返回了多行:
CONTACT_EMAIL
abc1@domain.com
abc2@domain.com
abc3@domain.com
3行受影响。
执行其中一个方法后,我得到了结果
CONTACT_EMAIL
abc1@domain.com;abc2@domain.com;abc3@domain.com;
受影响的一行。