【问题标题】:Concatenate columns strings for matching rows连接列字符串以匹配行
【发布时间】:2016-05-16 19:00:20
【问题描述】:

这是我的查询:

SELECT 
    sys.objects.object_id, sys.objects.name, sys.objects.type_desc, 
    sys.syscomments.text
FROM 
    sys.objects
LEFT JOIN 
    sys.syscomments ON sys.syscomments.id = sys.objects.object_id
WHERE 
    (type_desc LIKE 'SQL_STORED_PROCEDURE' OR type_desc LIKE 'SQL_SCALAR_FUNCTION')
ORDER BY 
    sys.objects.object_id;

这是输出的一部分:

那么我将如何连接具有相同“object_id”的行的“text”列,这样我就没有重复的 ID?如果没有字符串的聚合函数,在 T-SQL 中就不那么简单了……

我看过其他示例,但我似乎无法让它适用于我的场景。

【问题讨论】:

标签: sql sql-server tsql concatenation


【解决方案1】:

你需要创建一个函数来连接:

CREATE FUNCTION [dbo].[GetTexts](@id INT)
    RETURNS VARCHAR(4000)
AS
BEGIN
    DECLARE @res NVARCHAR(4000)

    SELECT  DISTINCT
            @res =
            SUBSTRING(
            (
                SELECT  ',' + SC1.[text]
                FROM    dbo.syscomments SC1
                WHERE   SC1.id = SC2.id
                FOR     XML PATH ('')
            ), 2, 4000)
    FROM    dbo.syscomments SC2
    WHERE   SC2.id = @id

    RETURN @res
END

然后,执行SELECT 查询。

SELECT  dbo.[objects].[object_id], dbo.[objects].name, dbo.[objects].type_desc, dbo.GetTexts([object_id])
FROM    dbo.[objects]

P.S.:我不确定架构名称,所以请根据需要更正它们。

【讨论】:

    【解决方案2】:

    进行串联聚合的 For XML Path 方法是执行您在此处要做的事情的更流行的方法之一。

    详情请见this post

    适用于您的情况的应用程序可能如下所示:

    SELECT B.object_id, B.name, B.type_desc, 
        STUFF((SELECT A.[text] 
                            FROM sys.syscomments AS A
                            WHERE A.id = B.[object_id]
                            FOR XML PATH('')), 1, 1, '' ) AS [text]
    FROM 
        sys.objects AS B
    WHERE type_desc LIKE 'SQL_STORED_PROCEDURE' OR type_desc LIKE 'SQL_SCALAR_FUNCTION'
    ORDER BY B.[object_id];
    

    【讨论】:

    • 是的,行得通!但是有没有办法不将所有 XML 标记都包含在结果中?
    • 通过更改 FOR XML PATH, TYPE).value('.[1]', 'nvarchar(max)'), 1, 1, '') 得到它
    猜你喜欢
    • 2015-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-30
    • 2019-04-29
    • 1970-01-01
    • 2018-04-09
    相关资源
    最近更新 更多