关于不同的查询类型(ADP)本主题中的信息仅适用于MicrosoftAccess项目(.adp)。查询是对数据库中的数据进行检索、创建、修改或删除的请求。有两种基本类型的查询:选择查询是通过使用SQLSELECT语句检索要显示数据的任一查询。操作查询是通过使用SQLINSERT、UPDATE和DELETE语句插入、修改或删除数据的存储过程。视图使用视图存储视图是作为数据库设计的一部分而存储的。设计数据库时,可基于以下原因而在设计中包含视图:许多用户对某些数据的子集感兴趣。由于每个视图均是存储在数据库中的,因此它将建立可被任何数据库用户使用的数据的特定子集。视图可以隐藏基础表。可以禁止所有用户访问数据库表,要求用户只能通过视图来处理数据。这种方法可以帮助防止用户和应用程序进行某些数据库修改操作。例如,可以创建名为“当月销售额”的视图。对各月而言,可以修改相应的视图定义。如果没有该视图,用户要想从相应的月中选择“销售额”行,就需要每月都重写其查询。对结果排序可以对视图进行排序,但前提是该视图中包含TOP子句。建立查询计划查询计划是一种内部策略,数据库服务器藉此可尝试快速创建结果集。保存视图后,数据库服务器即为该视图建立查询计划。使用索引视图和架构绑定关于索引视图和架构绑定索引视图是其结果仍在数据库中,但同时建立索引以供快速访问的视图。在MicrosoftAccess项目(MicrosoftAccess项目:与MicrosoftSQLServer数据库连接且用于创建客户端/服务器应用程序的Access文件。项目文件中不包含任何数据或基于数据定义的对象(如表和视图)。)连接MicrosoftSQLServer2000EnterpriseEdition或SQLServer2000DeveloperEdition的情况下将支持索引视图,但在MicrosoftSQLServer2000DesktopEdition中却不支持索引视图。下列条件下最好使用索引视图:数据为只读属性(例如决策支持系统);索引视图的查询未涉及聚合或联接;索引视图的基本表架构定义不可能进行更改。有关索引视图的详细信息,请参阅MicrosoftSQLServer文档。与其他视图类似,索引视图与其数据的基础表有关。这种相关性的含义是:如果更改决定索引视图的基础表,索引视图就可能无效。例如,重命名决定视图的列将会使视图失效。为防止上述情况发生,SQLServer支持创建带有“架构绑定”的视图。架构绑定可以防止任何会导致视图失效的表或列修改操作。利用“查询设计器”创建的任何索引视图均将自动进行架构绑定,这是因为SQLServer要求索引视图具有架构绑定功能。架构绑定并不意味着不能对视图进行修改。它的含义是对基础表或视图所作的修改不能改变视图的结果集。修改基础表或列会带来什么后果利用“表设计器”或“数据库设计器”,对于由架构绑定所定义的视图,您可能会试图修改决定该视图的基础表或列。如果这种修改会使视图失效,设计器就将予以警告,同时询问是否要继续。如果选择继续,将出现下列几种情况:修改基础表。所有与基础表视图有关的视图均将被更改,从而会删除“架构绑定”。这样,对基础表的后续更改过程中系统将不再进行警告。如果已建立相关视图的索引,则删除该索引。“表设计器”和“数据库设计器”仅在下列条件下才会在修改基础表之前发出警告:该基础表决定某个具有架构绑定的视图,或者所做修改涉及以下操作:删除基础表重命名基础表重建基础表删除基础表中的列或包含该列的视图重命名基础表和包含该列的视图中的列存储过程存储过程可以使得管理数据库和显示有关该数据库及其用户的信息变得更加容易。存储过程是以一个名称存储的SQL语句和可选流程控制语句的预编译的集合,并作为一个整体来执行。存储过程保存在数据库中;可通过应用程序中的一个调用来执行;并允许使用用户声明的变量、条件执行语句和其他强大的编程功能。存储过程可以包含针对数据库的程序流、逻辑运算和查询。存储过程也能接受参数,输出参数,返回单个或多个结果集或者返回值。使用存储过程能达到使用SQL语句要达到的目的,同时还有如下优点:可以在一个存储过程中执行一系列SQL语句。可以在存储过程的内部引用其他存储过程,从而简化一系列复杂的语句。存储过程在创建时就在服务器上进行了编译,因此执行速度要比执行单个SQL语句快。单语句存储过程只包含一个SQLSELECT语句。可以在“查询设计器”中以图形方式对其进行创建或编辑,并可定义除列属性外的扩展属性。多语句存储过程包含多个SQLSELECT语句。可以在“SQL文本编辑器”中对其进行创建或编辑,甚至还可使用“查询生成器”以图形方式编辑多语句存储过程中的SQLSELECT语句。但无法定义扩展属性。用户定义函数将MicrosoftAccess项目连接到MicrosoftSQLServer2000数据库时,可以创建和使用用户定义函数。下面的示例说明用户定义函数ListCust,该函数接受已命名参数并返回表,并用于SELECT语句的FROM子句中。SELECT*FROMListCust(@[EnteraName])用户定义函数的概述用户定义函数是一个查询,对用户定义函数,可以像视图或存储过程一样:在数据库窗口中进行查看。在“查询设计器”或“SQL文本编辑器”中进行创建。在数据表中检索数据和浏览结果。用作窗体、报表或组合框的记录源。注释无法将用户定义函数用作数据访问页的记录源。使用Access对象模型以编程方式来处理。用户定义函数将视图和存储过程的最佳功能合并到一个查询中,在该查询中可以嵌套、向其传递参数、排序并返回值。因为用户定义函数可以返回数据或标量值的单个表,还可隐藏该数据或标量值的创建方式的商务逻辑和细节,并且可简化SQL语句语法,因此在很多情况下,建议使用用户定义函数来代替视图和存储过程。有关用户定义函数的详细信息和示例,请参阅SQLServer文档。三种类型的用户定义函数根据返回值的类型的不同,每个用户定义函数可以分为下列三种类型之一:内嵌用户定义函数包含单个SELECT语句并返回数据的可更新表。可以在查询的FROM子句中使用该函数。使用“查询设计器”可以以图形方式创建和编辑内嵌用户定义函数。也可以定义扩展属性。表用户定义函数包含一个或多个SELECT语句并返回数据的不可更新表。可以在查询的FROM子句中使用该函数。使用“SQL文本编辑器”可创建和编辑表用户定义函数,甚至还可使用“查询生成器”在表用户定义函数中以图形方式编辑SQLSELECT语句。但是,您无法定义扩展属性。标量用户定义函数包含一个或多个SELECT语句并返回标量值,如int、decimal、varchar、sql_variant或“表”数据类型。可在任何使用列名称的查询中使用标量函数。使用“SQL文本编辑器”可创建和编辑标量用户定义函数,甚至还可使用“查询生成器”在标量用户定义函数中以图形方式编辑SQLSELECT语句。但无法定义扩展属性。参数查询参数查询的定义如果打算反复执行同一查询,但不同时间分别使用不同的值,则可使用参数查询。参数是某个值的占位符,这个值在查询运行时键入。例如,如果打算查找同一国家/地区“客户”表中的所有客户,但希望系统每次会提示输入不同的国家/地区,可在“查询设计器”内“设计”网格的“条件”单元格中键入@Enter_Country,并生成以下SQLSELECT语句:SELECT*FROMCustomersWHERECountry=@Enter_CountryEnter_Country参数前的at标记(@)字符告知Access显示“输入参数”对话框,这样可输入国家/地区名(例如“墨西哥”或“丹麦”),然后将其用作WHERE子句的值。使用参数可以将参数作为文本或数字字面值的占位符使用。通常情况下,参数在单独的行或组(即SQL语句的WHERE或HAVING子句)的搜索条件中作为占位符使用。也可以使用参数组合指定日期范围。例如,可以在查询的WHERE子句中创建两个参数:@Enter_Beginning_Date和@Enter_Ending_Date,然后在如下例所示执行查询时,指定雇佣日期的范围。SELECT*FROMORDERSWHEREShippedDateBETWEEN@Enter_Beginning_DateAND@Enter_Ending_Date还可以将参数用作表达式中的占位符。例如,可以通过在每次执行查询时提供不同的折扣值来计算折扣价格。为此,可以在“设计”网格的“列”单元格中输入表达式UnitPrice*@Enter_Discount,从而生成如下列表达式所示的SQLSELECT语句:SELECTProductName,UnitPrice,(UnitPrice*@Enter_Discount)ASDiscountPriceFROMProducts比较已命名和未命名参数可以指定两种类型的参数,即已命名参数和未命名参数。已命名参数已命名参数更便于读取和使用。如果查询中有多个参数,而又想使各个参数的输入内容更为清晰,已命名参数尤其有用。例如若要提示输入并搜索作者表中作者的名和姓,可创建以下SQLSELECT语句:SELECTau_idFROMauthorsWHEREau_fname=@Enter_First_NameANDau_lname=@Enter_Last_Name运行参数查询时,Access将使用“输入参数”对话框中的参数名对每个参数提示一次,这样用户就清楚地知道应输入哪个姓名。未命名参数也可以输入问号(?)字符作为未命名参数。例如,如果打算利用存储过程、嵌入式用户定义函数或SQL语句中的一个声明来检索窗体或报表记录源中的所有作者,可在“查询设计器”内“设计”网格的“条件”单元格中键入问号(?)字符,从而生成以下SQLSELECT语句:SELECTau_lname,au_fnameFROMstateWHEREstate=@Param1这种情况下,Access将自动赋予未命名参数生成的名称@Param1。注释对于窗体或报表记录源中的SQL语句,Access将不提供生成的名称。何时能或不能使用已命名参数下列情况下可使用已命名参数:MicrosoftAccess项目已连接MicrosoftSQLServer数据库2000版。处于存储过程或嵌入式用户定义函数的“查询设计器”中。处于存储过程、标量用户函数或表用户定义函数的“SQL文本编辑器”中。在“查询生成器”中创建的记录源SQL语句中,不能使用已命名参数。在视图(视图(对象):Access项目中的一种查询,它是基于SQLSELECT语句的虚拟表。例如,在两个表的联接中有10个可用列,一个视图可以仅含其中的3列,以限制对某些数据的访问。)中不能使用已命名或未命名参数。操作查询可以在“查询设计器”的“图表”和“网格”窗格(图形窗格)中创建以下类型的操作查询:追加值查询创建新行并将字面值插入到特定列中。这种类型的查询将创建SQLINSERTINTO…VALUES语句。追加查询通过将现有行从一个表复制到另一表中或将现有行作为新行复制到同一表中来创建新行。这种类型的查询将创建SQLINSERT…SELECT语句。更新查询在表中更改现有单行或多行中各个列的值。这种类型的查询将创建SQLUPDATE语句。删除查询从表中删除一行或多行。这种类型的查询将创建SQLDELETE语句。注释删除查询从表中删除整行。如果想从各个数据列中清除值,请使用更新查询。生成表查询创建新表并通过将查询结果复制到新表中来创建行。这种类型的查询将创建SQLSELECT…INTO语句。SQLSELECT语句可以将SQL语句用作窗体或报表的记录源,或者用作窗体上列表框或组合框的行来源。您可能通过该操作来防止在数据库窗口中显示查询。通过使用字段右侧的“生成”按钮来创建SQLSELECT语句,然后在“查询生成器”中以图形方式设计SQLSELECT语句,也可以通过在任意的文本编辑器中编辑自己的SQLSELECT语句,然后将其复制并粘