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

Pin*_*ong 2 sql-server

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

Create view ssrs.vMyView
with schemabinding
as
  select firstname, lastname, other columns  --example columns
  from mytable
Run Code Online (Sandbox Code Playgroud)

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

更新

问题是它没有唯一的列或列的组合,所以我需要动态生成一个唯一的id.名字和姓氏只是一个例子.基表有主键.

提前致谢!

mar*_*c_s 8

创建此视图后,如果您遵循索引视图的所有规则和要求,则应该能够像这样创建聚簇索引:

CREATE CLUSTERED INDEX cix_vMyView ON dbo.vMyView(....)
Run Code Online (Sandbox Code Playgroud)

您需要选择一个好的,有效的群集密钥 - 最好根据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
Run Code Online (Sandbox Code Playgroud)

给你一个"人为的"独特的,不断增加的主键.

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

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

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

  • @Pingpong:添加一些独特的东西!我确定你的基表有某种主键,不是吗? (5认同)
  • @Pingpong - 如果您的基表确实有一个主键(与您上面所说的相反),那么请在您的视图定义中包含它. (2认同)
  • 您无法在使用 ROW_NUMBER() 或任何其他窗口排名或聚合函数的视图上创建索引。 (2认同)