Sql server 如何从stuff函数变量中提取值进行处理

Sql server 如何从stuff函数变量中提取值进行处理,sql-server,string,string-concatenation,for-xml-path,stuff,Sql Server,String,String Concatenation,For Xml Path,Stuff,您好,我想知道在SQL server 2012中,如何将列的值分配给变量 例如,考虑下面的场景,在其中,我检索记录ID并将多个电子邮件作为逗号分隔为单个行中的多人字段中所提到的人的列表 spd看起来像下面包含许多连接 整个spd的示例结构如下所示 BEGIN DECLARE @VAR1 VARCHAR(50) DECLARE @VAR2 VARCHAR(50) DECLARE @FINAL NVARCHAR(MAX) DECLARE @DEFAULT VARCHAR(50) SET @DEFAU

您好,我想知道在SQL server 2012中,如何将列的值分配给变量

例如,考虑下面的场景,在其中,我检索记录ID并将多个电子邮件作为逗号分隔为单个行中的多人字段中所提到的人的列表 spd看起来像下面包含许多连接 整个spd的示例结构如下所示

BEGIN
DECLARE @VAR1 VARCHAR(50)
DECLARE @VAR2 VARCHAR(50)
DECLARE @FINAL NVARCHAR(MAX)
DECLARE @DEFAULT VARCHAR(50)
SET @DEFAULTE = 'defautemail@xyz.com'

select  @var1 = isnull( email,@DEFAULTE) from usertable inner join userdet on 
                 usertable .recid = userdet.recid and usertable.uid=1 

SET @var2 = isnull (email,@DEFAULTE)  from usertable inner join userdet on 
            usertable .recid = userdet.recid and usertable.uid=1  
SET @FINAL= @var1 + "," +@var2


SELECT FORM.RECORD ID AS [RECORD ID],
       PRODUCT.DESCRIPTION AS [DESCRIPTION],
       SUP.NAME AS [SUPPLIER],
    --  @FINAL AS [FINALEMAILS]
       ABC AS [RESULTEMAILS]
     
     FROM DB1.FORM F INNER JOIN
          DB1.PROJTYPE P
          ON F.RECORDID= P.RECORDID
      LEFT OUTER JOIN
       (select Sup.formid,Supdet.name
       From DB1.Formdet fdet
       inner join DB1.Form Fo on Fo.recordid= Sup.formid)SupRec
       On RecSup.formid = form.recordid
       LEFT OUTER JOIN 
       ( Select FData.Formid,FDDesc.description 
       From DB1.FormDetails FData , DB1.FormDesc F
       on Fdata.formid= F.Formid) Desc on Desc.Formid= form.recordid
     
LEFT OUTER JOIN
(SELECT distinct formid , abc= STUFF((Select ',' + a.email from Db1.User b, 
Db1.formfields c
DB1.Userdetails a, DB1.FormRecordmapping d
where
where b.UserAddressid= a.id
and d.formfieldid= c.id
and b.Userid= d.FormValue
and c.id='3000'
and d.formid = ep.id
FOR XML PATH (''),TYPE).value('text()[1]','nvarchar(max)'),1,1,'') 
FROM [DB1.FORMRecordmapping ep) OPS
on OPS.formid= formid
WHERE  F.NOTIFREQ ='yes'
AND P= 300
END
示例输出如下所示:

Record Id     Descripton  Supplier  ResultEmails
---------------------------------------------------------------------------------
22222          DescrTest   Sup1     abc@xyz.com,yrc@hotmail.com,h@xyz.com
33333          DescTest2   Sup2     abc@gmail.com
-------------------------------------------------------------
我的要求是: 如何将上述代码中stuff函数返回的电子邮件列表的值逗号分隔分配给字符串变量varchar或nvarchar type进行进一步处理,而不修改上述代码中的太多内容?。 任何帮助都将不胜感激。
谢谢

您不能在派生表中嵌入变量赋值-一般来说,只有在选择列表中才允许这样的赋值。假设您的查询生成或至少可以生成一个多行结果集-那么您希望将该结果集中的哪一行用作分配的源?这听起来像是一个错误。你将需要一个非常不同的方法,但如果没有更多的细节,就不可能提出建议。并且不断发展!没有人应该使用。你好,斯莫尔:谢谢你的回复。我需要上述查询中STUFF函数返回的值。stuff函数返回的值,在本例中是逗号分隔电子邮件的串联列表,例如,采用以下格式:abc@gmail.com,xyz@hotmail.com最多6封电子邮件。在上面的查询中,我知道我们可以这样做:SELECT distinct,formid,Stemail=STUFFSelect','+a.email from Db1.User b,Db1.formfields c,Db1.Userdetails a,Db1.FormRecordmapping d。。。。但这只显示电子邮件列表。我想将STUFF fn返回的值提取到一个变量中。SMor:此查询的背景:用于连接在表单的多人字段中选择的人员的电子邮件。连接到spd以发送通知的服务需要此列表。在查询中,我加入表单、数据字段、用户、userdet表,以获取表单的多人DF中所选人员的电子邮件,并使用STUFF函数创建电子邮件的串联列表,以便传递给服务。spd还包含用于获取要传递给服务的其他值的其他联接。如果您需要更多详细信息,请告诉我。假设您希望查询中有一条记录,并且希望将合并的电子邮件分配给一个变量。您可以首先将查询结果插入临时表。然后从YourTestable中选择@YourVariable=ABC。