【问题标题】:SQL Server 2005 - DataType of variable to store a RowSetSQL Server 2005 - 用于存储 RowSet 的变量的数据类型
【发布时间】:2012-02-13 21:11:30
【问题描述】:

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

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

我想用variable 替换查询(SELECT ProjectId FROM Tasks),但对datatype 必须是什么感到困惑。 你知道吗?缓存这个结果也是有害的,或者有更简单的方法来做到这一点。

【问题讨论】:

    标签: sql-server-2005 tsql sqldatatypes sql-in


    【解决方案1】:

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

    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)
    

    虽然 - 它不是替换变量查询,它是使子查询结果更可重用

    但是

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

    【讨论】:

    • 什么特定条件?可以加几个吗
    • 如果您只使用一次或相对较少的行数 - 最好使用索引而不是表变量创建临时表。 Sql Server 不会创建表变量的统计信息,而是创建临时表 - 因此,临时表的性能可能优于表变量
    【解决方案2】:

    这种形式更可取(尽管优化器应该执行这种优化):

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-17
      • 2014-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-12
      相关资源
      最近更新 更多