Во-первых, вы не «мыслите в наборах».Язык SQL имеет только одну структуру данных, являющуюся таблицей, т.е. строками столбцов.Тип данных столбца должен быть скалярным, чтобы соответствовать первой нормальной форме.Таким образом, нет никаких массивов, списков и т. Д.
Хотя вы можете сгенерировать список значений PeriodID
, затем добавить список в текст запроса SQL, а затем использовать возможности динамического SQL для его выполнения, это не так.путь.
Считайте, что ваш
Where P.PeriodID in (36, 37)
... может быть переписан как
Where P.PeriodID IN (
SELECT 36
UNION ALL
SELECT 37
)
... или даже
WHERE EXISTS (
SELECT *
FROM (
SELECT 36
UNION ALL
SELECT 37
) AS DT1 (PeriodID)
WHERE P.PeriodID = DT1.PeriodID
);
... и, надеюсь, у вас появится идея работать с таблицами, а не со списками идентификаторов.
Тем не менее, делая шаг назад, это похоже на случай, когда вам лучше работать с естественным ключом в течение периодов, являясь составным (StartDate, EndDate)
, а не искусственным / суррогатным ключом PeriodID
.Работа только с датами означает, что вам просто нужно найти совпадение, например
SELECT P1.PeriodID
FROM Periods AS P1
WHERE CASE
WHEN @StartDate > P1.StartDate THEN @StartDate
ELSE P1.StartDate
END
<=
CASE
WHEN @EndDate > P1.EndDate THEN P1.EndDate
ELSE @EndDate
END;