我在SQL Server中有一些视图,这些视图已作为表链接到Access。例如,当我在视图上创建唯一索引时:
CurrentProject.connection.Execute "CREATE UNIQUE INDEX PK ON viewTable (BookID);"
我看到链接表实际上是SQL Server中的一个视图,链接表旁边有主键符号。但是,如果我进入SQL Server的视图,即使存在字段ID和InfoID,也似乎没有创建唯一索引。
答案 0 :(得分:3)
您看到的是正确的。
该“索引”创建仅适用于Access客户端。它不会在服务器端创建索引。
请记住,在99%的情况下,您都不希望在SQL中使用“索引”视图。
SQL Server将利用服务器端存在的ALL和ANY现有索引。再次:如果基表具有适当的索引,则无需索引视图。
执行该命令时,仅“通知”客户端该列实际上是PK。在任何其他情况下,使用index命令都会对Access使用零,并且在sql服务器端也会使用零。
对于给定的示例,除非您希望视图可更新,否则不需要该索引命令。
使用Access界面链接到SQL视图时,Access会提示您输入PK列。因此,如果使用VBA代码创建喜欢的表,则仅需要该“ index”命令。使用访问代码创建链接表时,它不会提示您输入PK。并且,如果未定义PK,则Access将把该视图视为只读。
因此,唯一需要执行该命令的情况是,是否用代码(而不是Access接口)创建了喜欢的表。
您实际上没有在服务器端显示您的命令示例,而只是告诉Access(客户端)将哪一列用作PK。
在“基本”表中在sql服务器上设置的任何索引将始终被视图使用。您当然可以在sql server上为视图建立索引,但是仅当您要为基表中尚未建立索引的某些数据建立索引时,或者您拥有海量数据集,并且想要使用出于性能原因的索引。除非该视图以某种方式特别限制了sql服务器上基表的数据,否则这种索引是没有用的,并且如前所述,SQL Server将始终为该视图使用基表的索引(即使当该视图没有索引。)
我怀疑所涉及的视图来自SQL Server上的基表,并且如果该基表具有索引(例如PK上的索引),则该视图不需要也不需要索引。
在您的示例中,create index命令仅用于告诉访问权将哪个列用于PK。如果您不告诉access要在PK中使用哪一列,则该视图将为只读。
因此,如果您在sql服务器设计工具中调出该视图,则将显示涉及的表的PK。 sql server上的视图没有PK的概念。由于视图没有PK(它使用基表中的PK),因此Access无法猜测或知道或告诉将哪个列用作PK。 (sql服务器知道,但是Access不知道)。因此,在这些情况下,您必须执行index命令,或使用Access接口,当您创建指向视图的链接时,该接口将提示您输入PK列。
因此该索引命令不会发送到sql服务器-它仅用于“告诉”或“通知” Access客户端将哪个列用作PK列–仅此而已。
我还应该指出,尽管您可以在sql server上为视图创建索引,但是仍然不能在视图中定义PK。因此,即使您确实在sql视图上创建了索引,创建此类索引也仍然无法定义PK。