SELECTPARSENAME(REPLACE([Subject],';','.'),1) AS Subject1,PARSENAME(REPLACE([Subject],';','.'),2) AS Subject2,PARSENAME(REPLACE([Subject],';','.'),3) AS Subject3FROM YourTable
SELECTID,PARSENAME(REPLACE([Subject],';','.'),1) AS Split1,PARSENAME(REPLACE([Subject],';','.'),2) AS Split2,PARSENAME(REPLACE([Subject],';','.'),3) AS Split3INTO #SplitTableFROM YourTableSELECT ID, CASE WHEN Split2 IS NULL AND Split3 IS NULL THEN Split1WHEN Split3 IS NULL THEN Split2 ELSE Split3 END AS Subject1, CASE WHEN Split2 IS NULL AND Split3 IS NULL THEN NULLWHEN Split3 IS NULL THEN Split1ELSE Split2 END AS Subject2,CASE WHEN Split3 IS NULL THEN NULLELSE Split1 END AS Subject3 FROM #temp2DROP TABLE #SplitTable
;WITH data AS (SELECT 101 AS StudentID, 'EJB;C++;PERL' AS Subject UNION ALLSELECT 102,'Dotnet' UNION ALLSELECT 103,'Java' UNION ALLSELECT 104,'Oracle;Java;Sql' UNION ALLSELECT 105,'Sql;SSIS')
IF OBJECT_ID('tempdb..#TempTable') IS NOT NULLDROP TABLE #TempTableCREATE TABLE #TempTable ( [RowNum] INT IDENTITY(1,1), [StudentID] INT NOT NULL, [Subj] NVARCHAR(50) NULL, PRIMARY KEY (RowNum))INSERT INTO #TempTable SELECT 101,'EJB;C++;PERL'INSERT INTO #TempTable SELECT 102,'Dotnet'INSERT INTO #TempTable SELECT 103,'Java'INSERT INTO #TempTable SELECT 104,'Oracle;Java;Sql'INSERT INTO #TempTable SELECT 105,'Sql;SSIS'DECLARE @strInput VARCHAR(8000) ,@Delimiter1 CHAR(1) ,@Delimiter2 CHAR(1) ,@Delimiter3 CHAR(1) SET @Delimiter1 = '|'SET @Delimiter2 = ','SET @Delimiter3 = ';'SELECT @strInput = REPLACE(COALESCE(@strInput+@Delimiter1,'') +CAST(CAST(t.StudentID AS VARCHAR(5)) +@Delimiter2+t.Subj AS VARCHAR(MAX)),@Delimiter3,@Delimiter2)FROM #TempTable AS tSELECT StudentID = (MAX(CASE c.itemnumber WHEN 1 THEN c.item END)) ,Subj1 = (MAX(CASE c.itemnumber WHEN 2 THEN c.item END)) ,Subj2 = (MAX(CASE c.itemnumber WHEN 3 THEN c.item END)) ,Subj3 = (MAX(CASE c.itemnumber WHEN 4 THEN c.item END))FROM ( SELECT @strInput ) a (parameter)CROSS APPLY dbo.tvfDelimitedSplit(parameter,@Delimiter1) bCROSS APPLY dbo.tvfDelimitedSplit(item,@Delimiter2) cGROUP BY b.ItemNumber
CREATE FUNCTION dbo.tvfDelimitedSplit ( @pString VARCHAR(8000) ,@pDelimiter CHAR(1) )RETURNS TABLE WITH SCHEMABINDING ASRETURNWITH cteTally(N) AS ( SELECT TOP (ISNULL(DATALENGTH(@pString),0)) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM dbo.Tally ) ,cteStart(N1) AS ( SELECT 1 UNION ALL SELECT t.N + 1 FROM cteTally t WHERE SUBSTRING(@pString,t.N,1) = @pDelimiter ) ,cteLen(N1,L1) AS ( SELECT s.N1 ,ISNULL( NULLIF( CHARINDEX(@pDelimiter,@pString,s.N1),0) - s.N1,8000) FROM cteStart s ) SELECT ItemNumber = ROW_NUMBER() OVER (ORDER BY l.N1) ,Item = SUBSTRING(@pString,l.N1,l.L1) FROM cteLen l;
;WITH data AS (SELECT 101 AS StudentID, 'EJB;C++;PERL' AS Subject UNION ALLSELECT 102,'Dotnet' UNION ALLSELECT 103,'Java' UNION ALLSELECT 104,'Oracle;Java;Sql' UNION ALLSELECT 105,'Sql;SSIS')SELECT StudentID, [1],[2],[3]FROM (SELECT StudentID, ItemNumber, Item FROM data CROSS APPLY udf_DelimitedSplit8K (Subject,';'))pPIVOT(MAX(Item) FOR ItemNumber IN ([1],[2],[3]))pvt
;WITH data AS (SELECT 101 AS StudentID, 'EJB;C++;PERL' AS Subject UNION ALLSELECT 102,'Dotnet' UNION ALLSELECT 103,'Java' UNION ALLSELECT 104,'Oracle;Java;Sql' UNION ALLSELECT 105,'Sql;SSIS')SELECT StudentID, MAX(CASE WHEN ItemNumber = 1 THEN Item ELSE NULL END), MAX(CASE WHEN ItemNumber = 2 THEN Item ELSE NULL END), MAX(CASE WHEN ItemNumber = 3 THEN Item ELSE NULL END)FROM(SELECT StudentID, ItemNumber, Item FROM data CROSS APPLY udf_DelimitedSplit8K (Subject,';'))x GROUP BY StudentID