使用T SQL在索引视图上生成主键

时间:2011-11-01 16:03:46

标签: sql-server

我尝试在视图上创建索引视图和唯一聚簇索引。我的问题是如何在select子句中生成主键。 E.g。

Create view ssrs.vMyView
with schemabinding
as
  select firstname, lastname, other columns  --example columns
  from mytable

如何动态生成每一行的主键?

更新

问题是它没有唯一的列或列的组合,因此我需要动态生成唯一的ID。 名字和姓氏只是示例。基表有主键。

提前致谢!

2 个答案:

答案 0 :(得分:7)

创建此视图后,如果您服从all the rules and requirements for an indexed view,您应该能够像这样创建聚簇索引:

CREATE CLUSTERED INDEX cix_vMyView ON dbo.vMyView(....)

您需要选择一个好的,有效的群集密钥 - 最好是根据NUSE原则:

  • 独特
  • 静态
  • 不断增加

INT IDENTITY是完美的 - 或类似BIGINT或INT和DATETIME的组合。

更新:看到您的基表甚至没有主键(这是一个更大的问题,您需要尽快修复!如果它没有主键,它不是表,您可以在视图定义中使用ROW_NUMBER()之类的内容:

CREATE VIEW ssrs.vMyView
WITH SCHEMABINDING
AS
  SELECT firstname, lastname,
     ROW_NUMBER() OVER(ORDER BY Lastname, FirstName) AS 'ID'
  FROM dbo.mytable

为您提供“人工”独特且不断增加的主键。

(更新2014年4月25日:不幸的是,与我在发布此信息时的信念相反,此无效,因为您无法在视图上创建聚簇索引包含像ROW_NUMBER .....)这样的排名函数。感谢@jspaey指出这一点。因此,在基表上包含主键并将其包含在视图定义中更为重要!)

但是又一次:如果您的基本表没有主键 - 请先修复!!

更新#2:确定,所以你的基本表确实毕竟有一个主键 - 那么为什么不是你的视图定义的那部分?我总是包含我视图中所有基表的所有主键 - 只有那些PK才能让您清楚地识别基表中的行,并且它们允许您使您的视图可更新。

答案 1 :(得分:2)

Pingpong,Marc是对的,你需要一些独特的东西来添加一个主键。请记住,这不需要是一个列,所以如果你有两个独特的列,它们可以很好地工作。

如果没有列的组合是唯一的,您可能希望重新考虑您的视图,甚至添加列,以便有一些独特的内容。

作为相关说明,请记住企业版将自动利用索引视图。但是在Enterprise Edition之外,您可能需要通过noexpand提示明确告诉优化器使用索引。我之前在On Indexes and Views

写了这篇文章