One relational division approach using the ProductTags
table is
DECLARE @TagsToSearch TABLE (
TagId VARCHAR(50) PRIMARY KEY )
INSERT INTO @TagsToSearch
VALUES ('Red'),
('Large'),
('New')
SELECT PT.ProductID
FROM ProductTags PT
JOIN @TagsToSearch TS
ON TS.TagId = PT.TagId
GROUP BY PT.ProductID
HAVING COUNT(*) = (SELECT COUNT(*)
FROM @TagsToSearch)
The @TagsToSearch
table would ideally be a table valued parameter passed directly from your application but could also be populated by using a split function against your comma delimited parameter.