在分区上使用row_number()或dense_rank()的计算列

时间:2013-05-23 02:58:15

标签: sql sql-server tsql partitioning sql-function

此问题与之前的问题有关, Grouping by or iterating through partitions in SQL

我需要支持SQL Server 2005,2008,2008 R2,并且不能依赖于企业版或完整版(必须在SQL Server Express中工作)。

我要做的是创建一个用户定义的计算列,该列基本上是分区by子句的row_number()dense_rank()。这需要像索引一样,因为无论何时将行添加到表中,都会自动生成此用户定义的列。

我查看了以下Microsoft链接,该链接解释了如何基于函数http://msdn.microsoft.com/en-us/library/ms186755.aspx创建列。它并不完全到达那里。

可能无法实现,尤其是没有完整版本的SQL Server。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

分区的主要功能是将单个对象拆分为多个相对独立的数据库对象。分区允许:

  • 立即将分区从一个表切换到另一个表,因为它变为元数据操作,而不是物理副本。
  • 锁定单个分区而不是整个表,从而使多个进程同时独立访问每个分区。
  • 将单个表分布在多个db文件上,将每个分区存储在自己的文件中
  • 压缩数据并单独更改每个分区的一些其他属性。

不能通过任何其他手段来完成。

所以我认为你正在寻找一种方法来为一些密钥的每个组合分配一个ID,该密钥由多个列组成。根据您想要实现的结果,有多种方法可以实现:

  • 在多个列上创建索引。它可以是群集的,也可以是主键列。它将有助于搜索并为您提供数据排序(如果是聚簇索引)。
  • 使用所有主键列创建单独的表,并为每个组合分配唯一键(例如,使用IDENTITY属性)。将此密钥插入主表以用作“分区ID”。使用触发器或连接自动插入值。

请注意,SQL Server只能使用一列进行分区。