Here is some test script. After a long time, I'm back on this and still no solution....
DECLARE @Shows TABLE (ID INT)
INSERT INTO @Shows (ID) VALUES (1)
INSERT INTO @Shows (ID) VALUES (1546)
DECLARE @Songs TABLE (ID INT, Name VARCHAR(256))
INSERT INTO @Songs (ID, Name) VALUES (1, 'Song 1')
INSERT INTO @Songs (ID, Name) VALUES (2, 'Song 2')
INSERT INTO @Songs (ID, Name) VALUES (3, 'Song 3')
INSERT INTO @Songs (ID, Name) VALUES (654, 'Song 4')
INSERT INTO @Songs (ID, Name) VALUES (321, 'Song 5')
INSERT INTO @Songs (ID, Name) VALUES (322, 'Song 6')
DECLARE @ShowSongRef TABLE (ID INT, ShowID INT, SongID INT, SongOrder INT, PRIMARY KEY (ID))
INSERT INTO @ShowSongRef (ID, ShowID, SongID, SongOrder) VALUES (1, 1, 1, 1)
INSERT INTO @ShowSongRef (ID, ShowID, SongID, SongOrder) VALUES (2, 1, 2, 2)
INSERT INTO @ShowSongRef (ID, ShowID, SongID, SongOrder) VALUES (3, 1, 321, 3)
INSERT INTO @ShowSongRef (ID, ShowID, SongID, SongOrder) VALUES (4, 1, 3, 4)
INSERT INTO @ShowSongRef (ID, ShowID, SongID, SongOrder) VALUES (5, 1546, 3, 1)
INSERT INTO @ShowSongRef (ID, ShowID, SongID, SongOrder) VALUES (6, 1546, 1, 2)
INSERT INTO @ShowSongRef (ID, ShowID, SongID, SongOrder) VALUES (7, 1546, 654, 3)
INSERT INTO @ShowSongRef (ID, ShowID, SongID, SongOrder) VALUES (8, 1546, 321, 4)
INSERT INTO @ShowSongRef (ID, ShowID, SongID, SongOrder) VALUES (9, 1546, 322, 5)
DECLARE @Keyword TABLE (ID INT)
INSERT INTO @Keyword (ID) VALUES ('654')
INSERT INTO @Keyword (ID) VALUES ('321')
INSERT INTO @Keyword (ID) VALUES ('322')
INSERT INTO @Keyword (ID) VALUES ('1')
SELECT DISTINCT sh.ID AS ShowID, s.Name FROM @Songs s
INNER JOIN @ShowSongRef ref ON ref.SongID = s.ID
INNER JOIN @ShowSongRef ref2 ON ref2.SongID = s.ID
and ref2.SongOrder = ref.SongOrder-- + 1
and ref.ShowID = ref2.ShowID
INNER JOIN @Shows sh ON sh.ID = ref.ShowID
--WHERE CONTAINS (ref.SongID, @Keyword)
--WHERE CONTAINS (ref.SongID, '654' AND '321' AND '322' AND '1')
WHERE ref.SongID IN (SELECT ID FROM @Keyword)
--AND ref.SongID NOT IN (SELECT ID FROM @Keyword)
--WHERE ref.SongID LIKE ('654', '321', '322', '1')
--WHERE ref.SongID LIKE '654'
--AND ref.SongID LIKE '321'
--AND ref.SongID LIKE '322'
--AND ref.SongID LIKE '1'
--ORDER BY ref.SongOrder
SELECT DISTINCT ID, Name, ShowID FROM (
SELECT s.ID, s.Name, ref.ShowID
FROM @Songs s
INNER JOIN @ShowSongRef ref ON ref.SongID = s.ID
INNER JOIN @ShowSongRef ref2 ON ref2.SongID = s.ID
WHERE s.ID IN (SELECT ID FROM @Keyword)
GROUP BY s.id, Name, ref.ShowID
--ORDER BY ref.SongOrder
) a
--SELECT distinct s.ID, Name, ref.ShowID
-- FROM @Songs s
-- INNER JOIN @ShowSongRef ref ON ref.SongID = s.ID
-- INNER JOIN @ShowSongRef ref2 ON ref2.SongID = s.ID
-- WHERE ref.SongID = '654'
-- INTERSECT
--SELECT distinct s.ID, Name, ref.ShowID
-- FROM @Songs s
-- INNER JOIN @ShowSongRef ref ON ref.SongID = s.ID
-- INNER JOIN @ShowSongRef ref2 ON ref2.SongID = s.ID
-- WHERE ref.SongID = '321'
-- INTERSECT
--SELECT distinct s.ID, Name, ref.ShowID
-- FROM @Songs s
-- INNER JOIN @ShowSongRef ref ON ref.SongID = s.ID
-- INNER JOIN @ShowSongRef ref2 ON ref2.SongID = s.ID
-- WHERE ref.SongID = '322'
-- INTERSECT
--SELECT distinct s.ID, Name, ref.ShowID
-- FROM @Songs s
-- INNER JOIN @ShowSongRef ref ON ref.SongID = s.ID
-- INNER JOIN @ShowSongRef ref2 ON ref2.SongID = s.ID
-- WHERE ref.SongID = '1'
-- ORDER BY Name
--Should return Song 4 and Song 5 and Song 6 and Song 1
-- and only showid 1546