• 数据表列值转换为逗号分隔字符串


    在开发SQL Server语序中,可能需要这样一个要求,把表中某一列的所有值转换为使用逗号分隔的字符串去呈现出来。

    举个例子:

    IF OBJECT_ID('tempdb..#tempTable') IS NOT NULL
    BEGIN
     DROP TABLE #tempTable
    END
    
    CREATE TABLE #tempTable ([ID] INT NOT NULL,[Category] NVARCHAR(40) NULL)
    
    INSERT INTO #tempTable ([ID],[Category]) VALUES (1,'Table'),
                                                    (2,'View'),
                                                    (3,'Store Procedure'),
                                                    (4,'Table-valued Function'),
                                                    (5,'Scalar-valued Function'),
                                                    (6,'User-Defined Table Type')
    
    SELECT [ID],[Category] FROM #tempTable
    
    GO
    Source Code

    要求结果,[ID]或[Category]任意一列,呈现如下:

    日后,我们不清楚是哪一张表,哪一个字段。

    因此,可以写成一个动态的SQL 存储过程来处理:

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Author:      Insus.NET
    -- Create date: 2019-05-11
    -- Update date: 2019-05-11
    -- Description: 列值转换为逗号分隔字符串
    -- =============================================
    CREATE PROCEDURE [dbo].[usp_TableColumnValueToCommaDelimitedString] (
        @tableName SYSNAME, 
        @columnName    SYSNAME,
        @ReturnValue NVARCHAR(MAX) OUTPUT
    )    
    AS
    BEGIN        
        DECLARE @sql NVARCHAR(MAX) = N'
        DECLARE @temporary_table AS TABLE([multirow_comma-delimited_string] NVARCHAR(MAX))
        INSERT INTO @temporary_table ([multirow_comma-delimited_string])
        SELECT TOP(1) STUFF(
                            REPLACE(
                            RTRIM(
                                    (SELECT ''|'' + CAST('+ @columnName +' AS NVARCHAR(MAX)) FROM '+ @tableName +' FOR XML PATH('''') )
                                ),
                        ''|'','', ''),
                            1,1,'''') FROM '+ @tableName +'
        SELECT @ReturnValue = [multirow_comma-delimited_string] FROM @temporary_table'
    
    EXECUTE sp_executesql @sql,
                          N'@ReturnValue NVARCHAR(MAX) OUTPUT',
                          @ReturnValue OUTPUT
    
    END
    Source Code

    只要为上面存储过程传入表名,字段名等参数即可得到我们想要的结果:

     以下内容于2019-05-22 08:48:44.633更新

    存储过程,另一个版本:

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    
    ALTER PROCEDURE [dbo].[usp_TableColumnValueToCommaDelimitedString] (
        @tableName SYSNAME, 
        @columnName    SYSNAME,
        @Comma_Delimited_Column_Names NVARCHAR(MAX) OUTPUT
    )    
    AS
    BEGIN    
        DECLARE @query NVARCHAR(MAX) = N'SET @Comma_Delimited_Column_Names = STUFF((SELECT DISTINCT '','' + QUOTENAME('+ @columnName +') 
                FROM '+ @tableName +' 
                FOR XML PATH(''''), TYPE
                ).value(''.'', ''NVARCHAR(MAX)'') 
            ,1,1,'''')'
    
        EXECUTE sp_executeSql @query, N'@Comma_Delimited_Column_Names AS NVARCHAR(MAX) OUTPUT',@Comma_Delimited_Column_Names OUTPUT
    
    END
    Source Code

    得到的结果,就是使用QUOTENAME函数,把每一个列名使用"["和"]"括起来:

  • 相关阅读:
    bzoj 5028小Z的加油店(D12 序列gcd)(线段树+树状数组)
    蒲公英
    [APIO2012]派遣(可并堆)(D11)
    AT1219 歴史の研究(回滚莫队)
    [USACO05DEC] 布局
    小B的询问
    [HEOI2012]采花(树状数组)(暑假D11)
    [JLOI2011]飞行路线 (暑假D3 拆点+dijkstra堆优化)
    [POI2012]FES-Festival
    [国家集训队]拉拉队排练
  • 原文地址:https://www.cnblogs.com/insus/p/10848578.html
Copyright © 2020-2023  润新知