使用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--)
,但对于演示目的而言则不太清楚。)
答案 0 :(得分:0)
您可以使用DELETE statement和OUTPUT 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和聚簇表之间存在差异,这可能会减慢插入表变量的速度。
我还鼓励您将任何基于表变量的解决方案与临时表进行比较。差异可能非常大。