SQL Server 2005 - DataType переменной для хранения RowSet

В типичной хранимой процедуре, в которой я работаю, есть различные проверки с одним и тем же запросом, как показано ниже.

SELECT ... FROM Projects WHERE ProjectId IN (SELECT ProjectId FROM Tasks)

я хотел бы заменить запрос (SELECT ProjectId FROM Tasks) с variable но я в замешательстве относительно того, что datatype должно быть. Ты знаешь? также кэширование этого результата вредно или есть более простой способ сделать это.

2 ответа

Решение

Вы можете создать переменную с типом таблицы и использовать ее несколько раз, например:

CREATE @Projects TABLE(Id INT NOT NULL)

INSERT @Projects SELECT ProjectId FROM Tasks

SELECT ... FROM Projects WHERE ProjectId IN (SELECT ProjectId FROM @Projects)
SELECT ... FROM Projects WHERE ProjectId NOT IN (SELECT ProjectId FROM @Projects)

Althought - это не замена запроса на переменную, это сделать более многократным использование результатов подзапроса

Но

при определенных условиях это может ухудшить производительность ваших запросов

Эта форма предпочтительна (хотя оптимизатор должен выполнить эту оптимизацию):

SELECT ... FROM Projects p
INNER JOIN Tasks t ON t.ProjectID = p.ProjectId

Затем добавьте условие в качестве предложения WHERE (вместо внутреннего выбора и попытки поместить список ProjectId в переменную):

SELECT ... FROM Projects p
INNER JOIN Tasks t ON t.ProjectID = p.ProjectId
WHERE someCondtionOnTasksTable
Другие вопросы по тегам