[原創]SQL 把表中字段存儲的逗號隔開內容轉換成列表形式

  咱們平常開發中,無論是表設計問題抑或是其餘什麼緣由,或多或少都會遇到一張表中有一個字段存儲的內容是用逗號隔開的列表。node

  具體效果以下圖:sql

  ------》數據庫

     從左邊圖轉換成右邊圖,像這種需求,咱們不免會遇到。測試

     今天我寫了個存儲過程來解決這種問題。主要方式是利用master..spt_values表。spa

      具體存儲過程以下:設計

      

-- Author:        LHM
-- Create date: 2015-01-10
-- Description:    把表中某一個列按照逗號拼接列表
--示例: EXEC [Sp_StringsToTable] 'AgentId','UserId','Bse_GeneralAgent',''
-- =============================================
CREATE   PROCEDURE [dbo].[Sp_StringsToTable]
    @ColumnId VARCHAR(100) ,
    @ColumnName VARCHAR(2047) ,
    @TableName NVARCHAR(100) ,
    @Filter VARCHAR(1000)=''
AS
    BEGIN
        DECLARE @sql VARCHAR(500)
        IF (@Filter<>'')
            BEGIN 
                SET @Sql='
 select '+@ColumnId+', RTRIM( LTRIM( substring('+@ColumnName+'+'','',a.number,charindex('','','+@ColumnName+'+'','',a.number+1)-a.number)) )  Id
                 from master..spt_values a,'+@TableName+' b
                where  '+@Filter+'   and  a.type=''p'' and substring('',''+'+@ColumnName+',a.number,1)='','' '
        
            END
        ELSE
            BEGIN
                SET @Sql='
 select '+@ColumnId+', RTRIM( LTRIM( substring('+@ColumnName+'+'','',a.number,charindex('','','+@ColumnName+'+'','',a.number+1)-a.number)) )  Id
                 from master..spt_values a,'+@TableName+' b
                where    a.type=''p'' and substring('',''+'+@ColumnName+',a.number,1)='','' '
            END    
        EXEC   (@Sql)
    END 

 這個存儲過程有一個限制:就是@ColumnName的值不能超過2047個字節,也就是說,圖中的UserId的字段裏面的內容不能超過2047個字符。code

 緣由就是由於master..spt_values表的限制。你們能夠在數據庫中執行 SELECT * FROM  master..spt_values type='p' 就能夠知道限制的緣由了。blog

 有興趣的朋友能夠 試着創建如圖的表ip

CREATE TABLE [dbo].[Bse_GeneralAgent](
    [AgentId] [int] IDENTITY(1,1) NOT NULL,
    [UserId] [varchar](max) NULL,
 CONSTRAINT [PK_Bse_GeneralAgent] PRIMARY KEY CLUSTERED 
(
    [AgentId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

 

 隨意添加一些測試數據進行測試 。只需執行存儲過程開發

 EXEC [Sp_StringsToTable] 'AgentId','UserId','Bse_GeneralAgent',''

 但願給遇到此類需求的朋友帶來幫助,謹此記錄。

 若是以爲有用,能夠推薦一下,謝謝。

------------------------------------------------------------如下是指尖流淌的思路,感謝---------------------------------------------------

-- Author:        LHM
-- Create date: 2015-01-10
-- Description:    把表中某一個列按照逗號拼接列表
--示例: EXEC Sp_StringsToTableExtend 'AgentId','UserId','Bse_GeneralAgent' 
-- =============================================
CREATE   PROCEDURE [dbo].Sp_StringsToTableExtend
    @ColumnId VARCHAR(MAX) ,
    @ColumnName VARCHAR(MAX) ,
    @TableName NVARCHAR(100)
AS
    BEGIN
        DECLARE @sql VARCHAR(500) 
        SET @Sql='SELECT  A.'+@ColumnId+' ,  B.StrColumn
FROM    (SELECT StrXml = CONVERT(XML, ''<root><v>''+REPLACE('+@ColumnName+', '','', ''</v><v>'')+''</v></root>'') ,     '+@ColumnId+'  ,    UserId    FROM   '
            +@TableName+'   ) A OUTER APPLY (SELECT StrColumn = N.v.value(''.'', ''nvarchar(40)'')  FROM   A.StrXml.nodes(''/root/v'') N (v)   ) B '
        EXEC  (@Sql)
    END 
GO
相關文章
相關標籤/搜索