Use Jeff Moden's splitter function (copied below for convenience).
/* Sample Data */
IF OBJECT_ID('tempdb..#TempTable') IS NOT NULL
DROP TABLE #TempTable
CREATE TABLE #TempTable (
[ID] INT IDENTITY(1,1) NOT NULL,
[Type] CHAR(1) NULL,
[TypeDesc] CHAR(1) NULL,
PRIMARY KEY (ID),
UNIQUE (ID))
INSERT INTO #TempTable
SELECT 'T','A'
UNION
SELECT 'P','B'
UNION
SELECT 'M','C'
UNION
SELECT 'B','D'
UNION
SELECT 'X','X'
UNION
SELECT 'Y','Y'
UNION
SELECT 'Z','Z'
/* Display sample data */
SELECT
[Type]
,[TypeDesc]
FROM
#TempTable
/* Show just the rows that match the delimited string */
DECLARE @strTypes VARCHAR(50)
SET @strTypes = 'T,P,M,B'
SELECT DISTINCT
[Type]
,[TypeDesc]
FROM
#TempTable AS tt
CROSS APPLY
dbo.tvfDelimitedSplit8K(@strTypes,',') AS ds
WHERE
tt.[Type] = ds.Item
CREATE FUNCTION [dbo].[tvfDelimitedSplit8K]
(
@pString VARCHAR(8000)
,@pDelimiter CHAR(1)
)
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN
WITH E1(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
E2(N)
AS (
SELECT
1
FROM
E1 a
,E1 b
), --10E+2 or 100 rows
E4(N)
AS (
SELECT
1
FROM
E2 a
,E2 b
), --10E+4 or 10,000 rows max
cteTally(N)
AS (
SELECT TOP (ISNULL(DATALENGTH(@pString),0))
ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
FROM E4
),
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 ;
GO