我尝试在视图上创建索引视图和唯一聚簇索引。我的问题是如何在select子句中生成主键。 E.g。
Create view ssrs.vMyView
with schemabinding
as
select firstname, lastname, other columns --example columns
from mytable
如何动态生成每一行的主键?
更新
问题是它没有唯一的列或列的组合,因此我需要动态生成唯一的ID。 名字和姓氏只是示例。基表有主键。
提前致谢!
答案 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
写了这篇文章