如何将查询结果转换为字符串并将其插入 table 行

How can I cast a query result to string and insert it into a table row

我收到一个错误,子查询 returns 多于一个值,我知道它确实如此,现在我想将该子查询结果转换为一个字符串,然后将该字符串插入 table在同一个位置

我已经尝试过使用循环,但由于我不能在查询之外的任何地方使用循环,所以它没有太大帮助。

这就是我正在使用的查询

SELECT DISTINCT LiveCampaign_SubscriberList_Email.Email, Firstname, Lastname, dbo.spValueToString(Subscribed) AS Subscribed,

dbo.spValueToString((SELECT COUNT(*) 
    FROM tblEmailBlackList
    WHERE tblEmailBlackList.Email = LiveCampaign_SubscriberList_Email.Email and tblEmailBlackList.PortalID = -2)) As GeneralBlockList,

(SELECT DISTINCT PortalLocalization.PortalName
    FROM tblEmailBlackList
    LEFT JOIN tblLiveCampaignSettings ON tblLiveCampaignSettings.ModuleID = tblEmailBlackList.ModuleID
    LEFT JOIN PortalLocalization ON PortalLocalization.PortalID = tblEmailBlackList.PortalID AND PortalLocalization.CultureCode = 'sl-SI'
    LEFT JOIN #tmp ON tblEmailBlackList.Email = #tmp.Email COLLATE Slovenian_CI_AS
    WHERE LiveCampaign_SubscriberList_Email.Email = #tmp.Email COLLATE Slovenian_CI_AS
    AND tblEmailBlackList.PortalID >= 0 OR tblEmailBlackList.PortalID =- 1)
    AS LocalBlockList

FROM LiveCampaign_SubscriberList_Email

这是我需要转换成字符串的部分:

(SELECT DISTINCT PortalLocalization.PortalName
    FROM tblEmailBlackList
    LEFT JOIN tblLiveCampaignSettings ON tblLiveCampaignSettings.ModuleID = tblEmailBlackList.ModuleID
    LEFT JOIN PortalLocalization ON PortalLocalization.PortalID = tblEmailBlackList.PortalID AND PortalLocalization.CultureCode = 'sl-SI'
    LEFT JOIN #tmp ON tblEmailBlackList.Email = #tmp.Email COLLATE Slovenian_CI_AS
    WHERE LiveCampaign_SubscriberList_Email.Email = #tmp.Email COLLATE Slovenian_CI_AS
    AND tblEmailBlackList.PortalID >= 0 OR tblEmailBlackList.PortalID =- 1)

结果将是一个字符串,然后将其插入到 table 的同一行中,因为此子查询的结果应该是

因此您需要将返回的行聚合为一个行。由于您使用的是 SQL Server 2014,STRING_AGG 不可用,因此我们将使用 XML aggregation trick。试试这个:

SELECT DISTINCT LiveCampaign_SubscriberList_Email.Email, Firstname, Lastname, dbo.spValueToString(Subscribed) AS Subscribed,

dbo.spValueToString((SELECT COUNT(*) 
    FROM tblEmailBlackList
    WHERE tblEmailBlackList.Email = LiveCampaign_SubscriberList_Email.Email and tblEmailBlackList.PortalID = -2)) As GeneralBlockList,
STUFF((
    SELECT DISTINCT ',' + PortalLocalization.PortalName
    FROM tblEmailBlackList
    LEFT JOIN tblLiveCampaignSettings ON tblLiveCampaignSettings.ModuleID = tblEmailBlackList.ModuleID
    LEFT JOIN PortalLocalization ON PortalLocalization.PortalID = tblEmailBlackList.PortalID AND PortalLocalization.CultureCode = 'sl-SI'
    LEFT JOIN #tmp ON tblEmailBlackList.Email = #tmp.Email COLLATE Slovenian_CI_AS
    WHERE LiveCampaign_SubscriberList_Email.Email = #tmp.Email COLLATE Slovenian_CI_AS
    AND tblEmailBlackList.PortalID >= 0 OR tblEmailBlackList.PortalID =- 1
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
    AS LocalBlockList

FROM LiveCampaign_SubscriberList_Email