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