Sometimes you may want to pass a comma separated string as an argument to stored procedure or SQL function and parse within the procedure. This sample code shows how to parse a string based any delimiter you specify.

CREATE FUNCTION dbo.CreateInlineTable (
    @Param AS VARCHAR(7999), -- Deliminated string
    @Deliminator AS VARCHAR(10) -- Deliminator
    )   RETURNS TABLE
AS
    RETURN ( SELECT Substring(@Deliminator + @Param + @Deliminator, Number + LEN(@Deliminator), 
                    CHARINDEX(@Deliminator, @Deliminator + @Param + @Deliminator, Number + LEN(@Deliminator)) - Number - LEN(@Deliminator) ) AS PARAM
               FROM InlineNumbers Numbers
              WHERE Number <= LEN(@Deliminator + @Param + @Deliminator) - LEN(@Deliminator)
                    AND Substring(@Deliminator + @Param + @Deliminator, Number,LEN(@Deliminator)) = @Deliminator)
 
GO

Imagine you have a user interface with a list of products. On the side of each product you have a delete checkbox and then a delete button below the list. Even though a user can delete multiple products at once, you only want to query the database once. One way to achieve this is by sending a comma separated string with product id’s to a stored procedure. The stored procedure will then separate the product ids using the above function and return a table.

CREATE PROCEDURE DeteteProductSP
(
    @ProductIds    VARCHAR(800)
)
AS  
BEGIN  
 
    DELETE 
      FROM Products
     WHERE ProductId IN ( SELECT PARAM 
                            FROM dbo.CreateInlineTable ( @ProductIds, ',')
                        )
   
END  

For the above function dbo.CreateInlineTable to separate the values, we need to create another table in our database, that returns the Substring position numbers, this table needs to be populated from 1 to 8000

CREATE TABLE dbo.InlineNumbers
(    
    Number                INT                    NOT NULL    
)
GO
 
--Populate this table with number from 1 to 8000
DECLARE @Key AS INT 
 
SET @Key = 1 
WHILE @Key < 8001 
BEGIN
 
    INSERT INTO InlineNumbers ( Number ) 
        VALUES ( @Key ) 
        
    SET @Key = @Key + 1
END