If I understand your requirements, you can use a split function to parse the string of numbers into a table and then join to it. Here is a link to a very fast Split function:http://www.sqlservercentral.com/articles/Tally+Table/72993/Here is a sligh variation that returns a table of INTs: CREATE FUNCTION dbo.SplitString8KToInt( @String VARCHAR(8000), @Delimiter CHAR(1) = ',')RETURNS TABLE WITH SCHEMABINDING ASRETURN --"Inline" CTE Driven "Tally Table" produces values from 0 up to 10,000... -- enough to cover VARCHAR(8000) WITH Tens(N) AS ( SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 ), --10E+1 or 10 rows Hundreds(N) AS (SELECT 1 FROM Tens a CROSS JOIN Tens b), --10E+2 or 100 rows Thousands(N) AS (SELECT 1 FROM Hundreds a CROSS JOIN Hundreds b), --10E+4 or 10,000 rows max Tally(N) AS (SELECT 0 UNION ALL SELECT TOP (DATALENGTH(ISNULL(@String,1))) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM Thousands ), cteStart(N1) AS (--==== This returns N+1 (starting position of each "element" just once for each delimiter) SELECT t.N+1 FROM Tally t WHERE (SUBSTRING(@String,t.N,1) = @Delimiter OR t.N = 0) )--===== Do the actual split. The ISNULL/NULLIF combo handles the length for the final element when no delimiter is found. SELECT ROW_NUMBER() OVER(ORDER BY s.N1) AS Position ,CAST(SUBSTRING(@String,s.N1,ISNULL(NULLIF(CHARINDEX(@Delimiter,@String,s.N1),0)-s.N1,8000)) AS INT) AS Value FROM cteStart AS s;
Using a split function you can then get your actual results in one of seveal ways.. here is one way:DECLARE @T TABLE (Val VARCHAR(30))INSERT @T (Val) VALUES('06,12,22'), ('08,03,22'),('04,12,19'),('05,10,20'),('01,11,21')DECLARE @StringToSplit VARCHAR(30) = '03,12,22'SELECT *FROM @T AS TINNER JOIN dbo.SplitString8KToInt(@StringToSplit, DEFAULT) AS S ON ',' + t.Val + ',' LIKE '%,' + CAST(S.Value AS VARCHAR(30)) +'%,'