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