此示例使用 SQL TRANSFORM 子句创建交叉表查询显示 1994 年每一季每位员工所接的订单的数目。 该 SQLTRANSFORMOutput 函数对此过程的完成是必须的。
SubSub()
Dim dbs As Database
Dim strSQL As String
Dim qdfTRANSFORM As QueryDef
strSQL = "PARAMETERS prmYear SHORT; TRANSFORM " _
& "Count(OrderID) " _
& "SELECT FirstName & "" "" & LastName AS " _
& "FullName FROM Employees INNER JOIN Orders " _
& "ON Employees.EmployeeID = " _
& "Orders.EmployeeID WHERE DatePart" _
& "(""yyyy"", OrderDate) = [prmYear] "
strSQL = strSQL & "GROUP BY FirstName & " _
& """ "" & LastName " _
& "ORDER BY FirstName & "" "" & LastName " _
& "PIVOT DatePart(""q"", OrderDate)"
' 在您的计算机中修改此行使其正确指到 Northwind 的路径。
Set dbs = OpenDatabase("Northwind.mdb")
' 对运费超过 $100 的订单,
Set qdfTRANSFORM = dbs.CreateQueryDef _
("", strSQL)
SQLTRANSFORMOutput qdfTRANSFORM, 1994
dbs.Close
End Sub
此示例使用 SQL TRANSFORM 子句创建一个稍微复杂的交叉表查询,来显示出每位员工在 1994 年所接订单的总金额。
SubSub()
Dim dbs As Database
Dim strSQL As String
Dim qdfTRANSFORM As QueryDef
strSQL = "PARAMETERS prmYear SHORT; TRANSFORM " _
& "Sum(Subtotal) SELECT FirstName & "" """ _
& "& LastName AS FullName " _
& "FROM Employees INNER JOIN " _
& "(Orders INNER JOIN [Order Subtotals] " _
& "ON Orders.OrderID = " _
& "[Order Subtotals].OrderID) " _
& "ON Employees.EmployeeID = " _
& "Orders.EmployeeID WHERE DatePart" _
& "(""yyyy"", OrderDate) = [prmYear] "
strSQL = strSQL & "GROUP BY FirstName & "" """ _
& "& LastName " _
& "ORDER BY FirstName & "" "" & LastName " _
& "PIVOT DatePart(""q"",OrderDate)"
' 在您的计算机中修改此行使其正确指到 Northwind 的路径。
Set dbs = OpenDatabase("Northwind.mdb")
' 对运费超过 $100 的订单,
Set qdfTRANSFORM = dbs.CreateQueryDef _
("", strSQL)
SQLTRANSFORMOutput qdfTRANSFORM, 1994
dbs.Close
End Sub
Function SQLTRANSFORMOutput(qdfTemp As QueryDef, _
intYear As Integer)
Dim rstTRANSFORM As Recordset
Dim fldLoop As Field
Dim booFirst As Boolean
qdfTemp.PARAMETERS!prmYear = intYear
Set rstTRANSFORM = qdfTemp.OpenRecordset()
Debug.Print qdfTemp.SQL
Debug.Print
Debug.Print , , "Quarter"
With rstTRANSFORM
booFirst = True
For Each fldLoop In .Fields
If booFirst = True Then
Debug.Print fldLoop.Name
Debug.Print , ;
booFirst = False
Else
Debug.Print , fldLoop.Name;
End If
Next fldLoop
Debug.Print
Do While Not .EOF
booFirst = True
For Each fldLoop In .Fields
If booFirst = True Then
Debug.Print fldLoop
Debug.Print , ;
booFirst = False
Else
Debug.Print , fldLoop;
End If
Next fldLoop
Debug.Print
.MoveNext
Loop
End With
End Function
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
CREATE TABLE 语句,CONSTRAINT 子句示例
此示例命名查询为 CategoryList。
此示例调用过程 EnumFields 过程,且可以在 SELECT 语句示例中找到该过程。
Sub ProcedureX()
Dim dbs As Database, rst As Recordset
Dim qdf As QueryDef, strSql As String
' 在您的计算机中修改此行使其正确指到 Northwind 的路径。
Set dbs = OpenDatabase("Northwind.mdb")
' 对运费超过 $100 的订单,
strSql = "PROCEDURE CategoryList; " _
& "SELECT DISTINCTROW CategoryName, " _
& "CategoryID FROM Categories " _
& "ORDER BY CategoryName;"
' 创建基于 SQL 语句的 QueryDef 的名称。
'
Set qdf = dbs.CreateQueryDef("NewQry", strSql)
' 创建暂时的快照类型记录集。
Set rst = qdf.OpenRecordset(dbOpenSnapshot)
' populateRecordset。
rst.MoveLast
' 调用 EnumFields 来打印记录集的内容。
'传递记录集对象和要求的字符宽度。
'
EnumFields rst, 15
' 删除 QueryDef 因为这是一个演示。
'
dbs.QueryDefs.Delete "NewQry"
dbs.Close
End Sub
PROCEDURE 子句
给查询定义一个名称和可选参数s。
注意: PROCEDURE 子句 已被 PROCEDURE 语句取代。尽管PROCEDURE 子句仍受支持,但 PROCEDURE 语句会提供PROCEDURE 子句容量的超集,而且语句也是推荐语法。
语法
PROCEDURE name [param1 datatype[, param2 datatype[, ...]]
PROCEDURE 子句可分为以下几个部分:
部分 | 说明 |
---|---|
name | 过程的名称。它应遵循标准命名公约。 |
param1, param2 | 一个或更多的字段名或参数。例如: PROCEDURE Sales_By_Country [Beginning Date] DateTime, [Ending Date] DateTime; 欲知更多参数信息,请看参数. |
datatype | 基本 Microsoft Jet SQL数据类型或其同义字之一。 |
说明
由 PROCEDURE 子句(指定过程名称的)、可选的参数定义列表和单个 SQL 语句组成的 SQL 过程。例如,过程 Get_Part_Number 可以运行一个检索指定部分的号码的查询。
注意
请参阅
DELETE 语句 (Microsoft Jet SQL) | PARAMETERS 声明 (Microsoft Jet SQL) |
EXECUTE 语句 (Microsoft Jet SQL) | SELECT 语句 (Microsoft Jet SQL) |
Microsoft Jet 数据库引擎 SQL 的数据类型 | UPDATE 语句 (Microsoft Jet SQL) |
示例
CREATE PROCEDURE 语句,PROCEDURE 子句示例