In SQL Server  ,we can split a string delimited by dot(.) using PARSENAME function.

PARSENAME function will help in splitting only if dot(.) is used as delimiter,even if the string is delimited by other delimiters we can replace it with dot(.) before passing to PARSENAME function.

If there are strings delimited with varying number of delimiters ,to dynamically split them into separate columns i have created below code sample .

For example :

 If the input is passed like A , B.A

Expected Output :

Column1 Column2
A NULL
A B

 

The code is pretty much self explanatory if you are familiar with looping using WHILE and functions like PARSENAME,REPLICATE,CHARINDEX,SUBSTRING,REPLACE...

Create the below function as the first step :

SQL
Edit|Remove
CREATE FUNCTION [dbo].[Split_CSV] 
(@input VARCHAR(MAX)) 
 
RETURNS @Split TABLE(Columnslist VARCHAR(MAX)) 
 
AS 
 
BEGIN 
 
DECLARE     
         @l_len INT, 
         @i INT=1, 
         @N INT=1, 
         @csv_string VARCHAR(MAX), 
         @csv_strings VARCHAR(MAX)= @input + ',';   
        
        
 SET @l_len = LEN(@csv_strings) 
          WHILE @i<=@l_len 
          BEGIN 
            IF SUBSTRING(@csv_strings,@i,1)=',' 
             BEGIN 
               SET @csv_string = SUBSTRING(@csv_strings,@N,@i-@N) 
               
               INSERT INTO @Split(Columnslist) 
               SELECT @csv_string 
               
               SET @N = @i+1; 
             END 
             SET @i = @i+1; 
          END 
           
RETURN ; 
END 
GO
Below code uses PARSENAME function and above function to split delimited string into separate columns :
SQL
Edit|Remove
SET NOCOUNT ON 
 
DECLARE @temp1 TABLE ( 
ID INT IDENTITY(1,1), 
String VARCHAR(MAX), 
Dots INT, 
Query NVARCHAR(MAX)) 
 
INSERT @temp1 (String) SELECT 'A' 
INSERT @temp1 (String) SELECT 'B.A' 
INSERT @temp1 (String) SELECT 'C.B.A' 
INSERT @temp1 (String) SELECT 'D.C.B.A'  
 
 
UPDATE A SET  Dots = (SELECT LEN(String)-LEN(REPLACE(String,'.',''))  
FROM @temp1 B WHERE A.ID = B.ID) 
FROM @temp1 A   
 
UPDATE A SET Query = ( 
SELECT 'PARSENAME('+CHAR(39)+String+CHAR(39)+',' FROM @temp1 B WHERE A.ID = B.ID) 
FROM @temp1 A 
 
UPDATE @temp1 SET Dots = Dots+1 
 
UPDATE A SET Query = ( 
SELECT REPLICATE(Query , Dots ) FROM @temp1 B WHERE A.ID = B.ID) 
FROM @temp1 A 
 
DECLARE @finaltemp TABLE ( 
Id INT, 
Query NVARCHAR(MAX), 
Dots INT) 
 
INSERT @finaltemp 
SELECT ID , 
Columnslist+','+CONVERT(VARCHAR(5),ROW_NUMBER()OVER(PARTITION BY Query ORDER BY Query))+')', 
Dots FROM @temp1 A  
CROSS APPLY [dbo].[Split_CSV](A.Query)  as split 
WHERE ColumnsList <> ' ' 
 
DECLARE @MaxDots INT,@MaxRno INT,@i TINYINT = 1 
 
SELECT @MaxDots = MAX(Dots-1) FROM @temp1 
 
INSERT @finaltemp(Query) 
SELECT LEFT(Query+','+REPLICATE('NULL,',@MaxDots-(Dots-1)),LEN(Query+','+REPLICATE('NULL,',@MaxDots-(Dots-1)))-1)  
FROM ( 
SELECT MAX(ID) ID, MAX(Dots) Dots, 
       'SELECT'+STUFF((SELECT ' , ' + Query 
              FROM   @finaltemp X WHERE X.ID = Y.ID GROUP  BY ID,Query 
              FOR XML PATH('')), 12'') Query                 
FROM   @finaltemp Y 
GROUP  BY ID ) tmp 
 
DECLARE @Querytemp TABLE ( 
Id INT IDENTITY(1,1), 
Query NVARCHAR(MAX)) 
 
INSERT @Querytemp 
SELECT 'EXEC('+CHAR(39)+REPLACE(Query,CHAR(39),CHAR(39)+CHAR(39))+CHAR(39)+')'   
FROM @finaltemp WHERE ID IS NULL 
 
SELECT @MaxRno = MAX(Id) FROM @Querytemp   
 
DECLARE @table TABLE (Columns VARCHAR(MAX)) 
DECLARE @k INT = 1 
 
WHILE @k <= @MaxDots+1 
 
BEGIN 
 
INSERT @table SELECT 'Columns'+CONVERT(CHAR(2),@k) 
 
SET @k = @k + 1 
 
END 
 
 
CREATE TABLE ##temp(dummy BIT); 
 
DECLARE @Script  VARCHAR(8000), 
 @Script_prepare  VARCHAR(8000); 
 
SET @Script_prepare = 'ALTER TABLE ##temp ADD [?] VARCHAR(100);' 
SET @Script = '' 
 
SELECT  @Script = @Script + REPLACE(@Script_prepare, '?', [Columns]) 
FROM    @table 
 
EXEC (@Script) 
 
ALTER TABLE ##temp DROP COLUMN dummy; 
 
DECLARE @Query NVARCHAR(MAX) 
 
WHILE @i <= @MaxRno 
 
BEGIN 
 
SET @Query = (SELECT Query FROM @Querytemp WHERE Id = @i) 
 
INSERT ##temp 
EXEC(@Query) 
 
SET @i = @i + 1 
 
END 
 
 
SELECT * FROM ##temp 
 
--DROP TABLE ##temp