使用CTE连接SQL Server中的值

使用CTE连接SQL Server中的值,sql,sql-server-2012,concatenation,Sql,Sql Server 2012,Concatenation,我一直在尝试连接特定行的值。假设我有一个问题: SELECT tblContacts_2.contactid, (COALESCE (tblSites_1.sitenm, '') + COALESCE (' / ' + tblSites_1.sitenmalt, '') + ' ' + COALESCE (tblSites_1.addr1, '') + ' ' + COALESCE (tblSites_1.zipcodeid, '') )

我一直在尝试连接特定行的值。假设我有一个问题:

SELECT 
    tblContacts_2.contactid, 
    (COALESCE (tblSites_1.sitenm, '') 
     + COALESCE (' / ' + tblSites_1.sitenmalt, '') 
     + ' ' + COALESCE (tblSites_1.addr1, '') + ' ' 
     + COALESCE (tblSites_1.zipcodeid, '') ) AS SiteNameAddr, 
    tblSites_1.siteid 
FROM   
    dbo.tblcontacts AS tblContacts_2 
INNER JOIN 
    dbo.tjncsitecontacts AS tjncSiteContacts_1 ON tblContacts_2.contactid = tjncSiteContacts_1.contactid 
INNER JOIN 
    dbo.tblsites AS tblSites_1 ON tblSites_1.siteid = tjncSiteContacts_1.siteid 
此操作的输出为

ContactID   SiteNameAddr                              SiteID
--------------------------------------------------------------
 329        TWIN PARKS SOUTHWEST / TWIN PARKS SOUTH...   1
1788        TWIN PARKS SOUTHWEST / TWIN PARKS S....      1
我想要的是,这种格式的输出,其中一个联系人id的sitenameaddrs与它关联的站点id计数连接起来,如下所示:

ContactID    SiteNameAddr                                     CountSite
-----------------------------------------------------------------------
321          RIVERSIDE PARK /  3333 BROADWAY 10035, URBAN...      8
322          WESTVIEW 625 MAIN ST 10044                           1
问题是,执行此操作时以下代码失败-

SELECT 
    tblContacts_2.contactid, 
    dbo.Removelastchar(dbo.Strconcat(COALESCE (tblSites_1.sitenm, '') 
                                    + COALESCE (' / ' + 
                                    tblSites_1.sitenmalt, '') 
                                    + ' ' + COALESCE (tblSites_1.addr1, '') 
                                    + ' ' 
                                    + COALESCE (tblSites_1.zipcodeid, '') + 
                                    ', ')) 
                            AS SiteNameAddr, 
    Count(tblSites_1.siteid) AS CountSite 
FROM   
    dbo.tblcontacts AS tblContacts_2 
INNER JOIN 
    dbo.tjncsitecontacts AS tjncSiteContacts_1 ON tblContacts_2.contactid = tjncSiteContacts_1.contactid 
INNER JOIN 
    dbo.tblsites AS tblSites_1 ON tblSites_1.siteid = tjncSiteContacts_1.siteid 
GROUP BY 
    tblContacts_2.contactid  
错误:

在执行用户定义的过程中发生.NET Framework错误 常规或聚合“strconcat”:
System.Data.SqlServer.TruncationException:正在尝试转换返回值 将大小为8086字节的值或输出参数设置为具有 8000字节的较小大小限制

这是因为其中一个联系人ID有92个与之关联的站点,并且连接的字符串变得太大。另外,
dbo.Removelastchar
dbo.Strconcat
是标量函数,因此它们只能返回
nvarchar
,因此不能在其中使用
ntext
。数据类型的类型转换也不起作用


请让我知道有什么替代方案。连接的字符串由Access中的VBA代码拾取

您不能使用最多可容纳10亿个字符的
nvarchar(max)
吗?这还不够吗?@marc_s我读到在Dr.Evil.t-SQL函数的声音中CONCAT应该能够处理nvarchar(max)值,如果它不能自动返回nvarchar(max),将其中一个输入转换为nvarchar(max)以强制返回值你不能使用容纳10亿字符的
nvarchar(max)
?这还不够吗?@marc_s我在Dr.Evil.t-SQL函数的声音中读到,如果CONCAT不能自动返回nvarchar(max),它应该能够处理nvarchar(max)值,将其中一个输入转换为nvarchar(max)以强制返回值