Sql 在不知道字符串长度的情况下删除其他逗号

Sql 在不知道字符串长度的情况下删除其他逗号,sql,sql-server,tsql,sql-server-2014,Sql,Sql Server,Tsql,Sql Server 2014,我的桌子 我的桌子 dependentId包含类似14的值;77;120 MyDependentable 背景 我必须从MyTable中选择数据,其中MyDependentTable中的每个依赖项都用逗号分隔 预期产出: +---------+-------------------------------------+ | Title | Dependencies | +---------+--------------------------

我的桌子

我的桌子

dependentId
包含类似
14的值;77;120


MyDependentable


背景

我必须从
MyTable
中选择数据,其中
MyDependentTable
中的每个依赖项都用逗号分隔

预期产出:

+---------+-------------------------------------+
| Title   | Dependencies                        |
+---------+-------------------------------------+
| Test    | ABC, One-two-three, Some Dependency |
+---------+-------------------------------------+
| Example | ABC                                 |
+---------+-------------------------------------+

我的查询

SELECT t.Title,
    (SELECT ISNULL((
        SELECT DISTINCT
        (
            SELECT dt.Name + '',
                   CASE WHEN DependencyIds LIKE '%;%' THEN ', ' ELSE '' END AS [text()]
            FROM MyDependentTable dt
            WHERE dt.DependencyId IN (SELECT Value FROM dbo.fSplitIds(t.DependencyIds, ';'))
            ORDER BY dt.DependencyId
            FOR XML PATH('')
        )), '')) Dependencies
FROM dbo.MyTable t

问题描述

查询可以工作,但当存在多个依赖项时,会添加一个额外的逗号:

+---------+---------------------------------------+
| Title   | Dependencies                          |
+---------+---------------------------------------+
| Test    | ABC, One-two-three, Some Dependency,  |
+---------+---------------------------------------+
| Example | ABC                                   |
+---------+---------------------------------------+
我无法使用
子字符串(ISNULL(…
),因为我无法访问字符串的长度,因此无法设置
子字符串的长度


有没有可能去掉不必要的额外逗号?

通常对于Sql Server中的组连接,人们会添加前导逗号,然后使用
STUFF
函数将其删除,但即使这样看起来也很难看

Outer Apply
方法看起来很整洁,可以这样做,而不是
相关子查询
。在这种方法中,我们不必将
选择
查询包装为
ISNULL
内容

SELECT DISTINCT t.title, 
                Isnull(LEFT(dependencies, Len(dependencies) - 1), '') 
                Dependencies 
FROM   dbo.mytable t 
       OUTER apply (SELECT dt.NAME + ',' 
                    FROM   mydependenttable dt 
                    WHERE  dt.dependencyid IN (SELECT value 
                                               FROM 
                           dbo.Fsplitids(t.dependencyids,';')) 
                    ORDER  BY dt.dependencyid 
                    FOR xml path('')) ou (dependencies) 

下面是使用
STUFF
的方法

SELECT  t.Title
       ,STUFF((SELECT ', ' + CAST(dt.Name AS VARCHAR(10)) [text()]
               FROM MyDependentTable dt
               WHERE dt.DependencyId IN (SELECT Value FROM dbo.fSplitIds(t.DependencyIds, ';'))
               ORDER BY dt.DependencyId
               FOR XML PATH(''), TYPE).value('.','NVARCHAR(MAX)'),1,2,' ') Dependencies
FROM dbo.MyTable  t
SELECT DISTINCT t.title, 
                Isnull(LEFT(dependencies, Len(dependencies) - 1), '') 
                Dependencies 
FROM   dbo.mytable t 
       OUTER apply (SELECT dt.NAME + ',' 
                    FROM   mydependenttable dt 
                    WHERE  dt.dependencyid IN (SELECT value 
                                               FROM 
                           dbo.Fsplitids(t.dependencyids,';')) 
                    ORDER  BY dt.dependencyid 
                    FOR xml path('')) ou (dependencies) 
SELECT  t.Title
       ,STUFF((SELECT ', ' + CAST(dt.Name AS VARCHAR(10)) [text()]
               FROM MyDependentTable dt
               WHERE dt.DependencyId IN (SELECT Value FROM dbo.fSplitIds(t.DependencyIds, ';'))
               ORDER BY dt.DependencyId
               FOR XML PATH(''), TYPE).value('.','NVARCHAR(MAX)'),1,2,' ') Dependencies
FROM dbo.MyTable  t