If Russ' interpretation is right, then maybe this:
DECLARE @service TABLE (cServ INT, code CHAR(3))
INSERT INTO @service (cServ, Code) VALUES
(100, 'DHR'),(100, 'HYR'),(100, 'JTY'),(200, 'DHR'),(200, 'HYR'),(300, 'DHR'),(300, 'HYR'),(300, 'JTY'),(300, 'QTY')
DECLARE @publ TABLE (code CHAR(3))
INSERT INTO @publ (Code) VALUES
('DHR'),('HYR'),('JTY')
;WITH basePubl AS (
SELECT *, ROW_NUMBER() OVER (ORDER BY code) AS seq
FROM @publ
), rCTEPubl AS (
SELECT CAST(code AS VARCHAR(MAX)) AS code, seq
FROM basePubl
WHERE seq = 1
UNION ALL
SELECT a.code + ', ' + r.code, r.seq
FROM rCTEPubl a
INNER JOIN basePubl r
ON a.seq + 1 = r.seq
), baseService AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY cServ ORDER BY code) AS seq
FROM @service
), rCTEService AS (
SELECT cServ, CAST(code AS VARCHAR(MAX)) AS code, seq
FROM baseService
WHERE seq = 1
UNION ALL
SELECT r.cServ, a.code + ', ' + r.code, r.seq
FROM rCTEService a
INNER JOIN baseService r
ON a.seq + 1 = r.seq
AND a.cServ = r.cServ
)
SELECT *
FROM @service
WHERE cServ IN (
SELECT cServ
FROM (
SELECT *
FROM rCTEPubl
WHERE seq = (SELECT MAX(seq) FROM rCTEPubl)
) pub
LEFT OUTER JOIN (
SELECT *
FROM rCTEService s
WHERE seq = (SELECT MAX(seq) FROM rCTEService WHERE cServ = s.cServ)
) s
ON s.code+' ' LIKE pub.code+'%'
)
I think your solution is checking for the right number of entries, rather than the specific entries Russ.