T-SQL在选择时删除行

时间:2015-04-27 15:56:07

标签: sql-server tsql

使用SQL Server 2008R2,我试图调用存储过程,暂时将结果存储在TABLE变量中,然后将该TABLE拆分为多个结果集。

我相信完成我想要的最简单的方法是:

SELECT * FROM @MyTable WHERE columnA = true

SELECT * FROM @MyTable WHERE columnA = false

但是,对于手头的数据,大约95%的行columnA = true,所以两个过滤器似乎有点浪费。在选择行时,我想将它们从表中删除,因此下表中的表格较小。

我对程序和程序更加熟悉面向对象的语言比SQL,所以这里有一些伪C#代码描述了我想做的事情。

foreach (Row r in myTable) {
    if (r.columnA == true) {
        r.Select();
        myTable.Delete(r);
    }
}

我可以在SQL中执行此操作吗?

(我知道在C#中我必须实际使用for (i=Count -1; i>=0; i--),但对于演示目的而言则不太清楚。)

2 个答案:

答案 0 :(得分:0)

您可以使用DELETE statementOUTPUT clause作为第一个语句。

DELETE @MyTable
OUTPUT DELETED.*
WHERE columnA = ...

DELETE t
OUTPUT DELETED.*
FROM @MyTable AS t
WHERE t.columnA = ...

答案 1 :(得分:0)

您还可以考虑在table variable上创建基于聚簇索引的约束(即主键或唯一约束)。然后你可以使用普通选择而不用担心删除任何记录。

DECLARE @MyTable TABLE (
    uid INT IDENTITY(1, 1) NOT NULL,
    ...,
    columnA BIT NOT NULL,
    UNIQUE CLUSTERED (columnA, uid)
)

注意:此示例中的uid只是一个人工唯一符。如果表中的唯一列对于索引键而言足够窄,请将uid替换为这些列。

这应该鼓励SQL服务器寻找索引而不是扫描表。由于插入heap和聚簇表之间存在差异,这可能会减慢插入表变量的速度。

我还鼓励您将任何基于表变量的解决方案与临时表进行比较。差异可能非常大。