将存储过程中的行连接到SQL中的另一个表中

时间:2012-02-22 13:10:51

标签: sql tsql string-concatenation

我有一个表格,其中包含电子邮件字段中的大量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语句来获取包含所有必要电子邮件的行,而不是使用存储过程。我基本上需要做的是将这些返回的电子邮件连接成一行。

1 个答案:

答案 0 :(得分:4)

从此:http://geekswithblogs.net/nagendraprasad/archive/2009/03/13/convert-multiple-rows-into-one-row---sql-server.aspx

将多行转换为一行 - 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;

受影响的一行。