如何将查询结果转换为字符串并将其插入 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
我收到一个错误,子查询 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