Sql server 2005 SQL Server 2005-用于存储行集的变量的数据类型

Sql server 2005 SQL Server 2005-用于存储行集的变量的数据类型,sql-server-2005,tsql,sqldatatypes,sql-in,Sql Server 2005,Tsql,Sqldatatypes,Sql In,在我正在处理的一个典型存储过程中,使用以下相同的查询进行各种检查 SELECT ... FROM Projects WHERE ProjectId IN (SELECT ProjectId FROM Tasks) 我想用一个变量替换查询SELECT ProjectId FROM Tasks,但对它必须是什么数据类型感到困惑。你知道吗?此外,缓存这个结果是有害的,或者有更简单的方法来实现这一点 尽管Optimizer应执行此优化,但最好使用此表格: SELECT ... FROM Project

在我正在处理的一个典型存储过程中,使用以下相同的查询进行各种检查

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

我想用一个变量替换查询SELECT ProjectId FROM Tasks,但对它必须是什么数据类型感到困惑。你知道吗?此外,缓存这个结果是有害的,或者有更简单的方法来实现这一点

尽管Optimizer应执行此优化,但最好使用此表格:

SELECT ... FROM Projects p
INNER JOIN Tasks t ON t.ProjectID = p.ProjectId
然后将条件添加为WHERE子句,而不是执行内部select并尝试将ProjectId列表放入变量中:

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

您可以创建表类型变量并多次使用它,如下所示:

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)
虽然它不是用变量替换查询,但它使子查询结果更具可重用性

但是


在某些情况下,这可能会降低查询的性能

在哪些特定情况下?你能添加一个fewIf吗?如果你只使用一次,或者行数相对较少,最好用索引而不是表变量创建临时表。Sql Server不创建关于表变量的统计信息,而创建临时表-因此,临时表的性能可能优于表变量