发信人: chedong()
整理人: (1999-07-08 20:51:28), 站内信件
|
Ninia IngramMicrosoft 公司
1998年 11月
摘要:解释如何用Microsoft SQL 7.0和Visual Studio 6.0 数据库工具分析其它 数据库管理系统中的数据。(7页)
通过连接服务器(linked server)和数据库查询设计中的TOP特性,你可以:
通过连接服务器特性访问外部OLE 数据库数据源。
使用TOP子句来限制你希望返回的数据。
用文件组改善数据库性能和提高效率。
用GUID 数据类型产生唯一的标识符。
介绍
设想下面的情况:你正在分析你公司的前五十个创收项目。你的公司是一家跨国 公司,总公司在北美并在五个大陆有大型分公司。这些分公司专门生产不同的产 品,而包括你的公司在内的所有六个公司使用互不相同的数据库管理系统。比如 ,东京的分公司使用Microsoft Visual FoxPro数据库保存它的数据,伦敦使用O racle,布宜诺斯艾利斯在Sybase 系统上存储它的数据,总公司使用Microsoft SQL Server,同时约翰尼斯堡和堪培拉公司使用第三方的OLE数据库系统。你怎样 才能在总公司把所有数据集中在一个报告中呢?
这听起来像是一项艰难的工作?你为什么不采用新的Microsoft SQL Server 7.0 和Microsoft Visual Studio 6.0数据库工具?使用在线连接服务器和数据库查询 系统设计的TOP特性呢?你现在就可以动手了。
当然,实际操作比以上要多一些步骤,但最主要的是使用Visual Studio 6.0数据 库工具,你可以利用SQL Server 7.0的许多特色使你企业的数据管理任务变得更 容易而且效率更高。
首先
如果你有以下工具组合的任何一个,你就可以参考这篇文章中的信息:
Visual Studio 6.0数据库工具和SQL Server 7.0
Visual Studio 6.0数据库工具和包含更新了的客户工具的SQL Server 7.0
在安装SQL Server 7.0时更新数据库工具:
如果SQL Server 7.0被安装在一个服务器上,而在你的客户机上有Visual Studi o 6.0数据库工具,那么就在客户机上运行SQL Server 7.0安装程序并且选择客户 工具安装。
如果你的计算机安装了Visual Studio 6.0数据库工具和SQL Server,那么SQL S erver 7.0安装向导将自动更新数据库工具。
访问外部OLE数据库数据源
为了访问不同的OLE数据库数据源并且处理企业数据事务,一个强大而灵活的解决 方案是连接服务器(Linked Server)功能部件。
连接服务器是一种为SQL Server 7.0定义含有需访问的数据的信息的外部数据对 象的方法。这个定义是一个四段名称,它包括外部数据对象的服务器名,包含此 对象的目录或者数据库,此对象的规划或所有者,以及对象名(数据库中的表或 视图)。
这种四段名称采用以下语法:
linked_server_name.catalog.schema.object_name
定义了在线连接服务器后,你就可以在SQL处理语句中使用这个四段名称查询连接 服务器中的数据对象。你可以直接用SELECT, INSERT, UPDATE, 和 DELETE SQL处 理语句在外部数据源中查询表和视图。
因此,一个简单的SELECT语句,例如那个应用于跨国公司方案,将如下所示:
SELECT *FROM johann_sa.svs.dbo.products
其中:
johann_sa是在约翰尼斯堡的子公司的服务器的名称。
svs是数据库的名称。
dbo是对象所有者。
products是表的名称。
当客户程序执行一个分布式的查询时,SQL Server截获此命令并发送一个基于行 集合的请求,所谓行集合,即一组行,其中每行都包含指向OLE DB数据的列。因 为OLE DB提供者以行集合的形式提供数据,当它们接收到从SQL Server发送的行 集合请求时,它们就知道该做什么。
在数据库工具中,你使用SQL形式的连接服务器功能部件。
现在回到跨国公司方案,在访问约翰尼斯堡子公司的服务数据库中的产品表中的 净收入信息时,你的SELECT语句可以像这样:
SELECT Prod.name, Prod.netFROM johann_sa.svs.dbo.products AS ProdWHERE date between '07/01/97' and '06/30/98'AND Prod.net > 1ORDER BY Prod.n et desc你的查询结果集合将列出本财政年度直到一九九八年六月三十一日所有价 值大于一百万美元的由约翰尼斯堡子公司经销的产品的净收入。
限制查询结果集合
让我们扩充这一方案。为什么,因为约翰尼斯堡子公司的业务覆盖了美洲大陆和 中东,它有数百种产品而且大多数是受欢迎的并有利可图。你如何限制你获得的 数据清单呢?
非常简单:使用TOP子句。TOP子句是用来限制你所得到的查询结果集合中行的数 目的工具,这个查询结果集合中行的数目也许是很大的。使用TOP关键字,你可以 指定你希望的只是查询结果集合的前n行。或者,如果你联合使用PERCENT关键字 和TOP关键字,你可以指定查询结果集合的前百分之n。
这样,你可以在你的SELECT语句中以两种方法中的一种使用TOP:
SELECT TOP n *SELECT TOP n PERCENT *让我们回到约翰尼斯堡的查询,你使用 TOP子句来把你的清单限制在50行。子查询如下:
SELECT TOP 50 Prod.name, Prod.net
FROM johann_sa.svs.dbo.products AS Prod
WHERE date between '07/01/97' and '06/30/98'
AND Prod.net > 1
要使用数据库工具中的TOP项,只要选取属性(Properties)窗口中的查询栏就行 了。如果你想要特定数目的行,在Top文本输入框中输入整数就会生成适当的查询 。如果你希望用TOP 项的百分之n形式,你应该在Top文本输入框中打n和单词“p ercent”。
例如,在约翰尼斯堡的查询中你所需要做的是在属性窗口的查询标签的Top文本输 入框中输入“50”。
在限制的结果集合中排列行如果你在使用TOP子句的SELECT语句中指定ORDER BY, SQL Server将首先根据指定的顺序建立整个的查询结果集,再从所建立的表中提 出前n行或前百分之n。
用约翰尼斯堡的查询来说明:SELECT TOP 50 Prod.name, Prod.net
FROM johann_sa.svs.dbo.products AS Prod
WHERE date between '07/01/97' and '06/30/98'
AND Prod.net > 1
ORDER BY Prod.net desc
SQL Server 先取得所有净收入达到一百万美元的产品项目,然后按从大到小的顺 序对它们进行排列。当表被排好以后,提取前50项并将其返回到查询结果表中。
使数据库操作更有效当你对一个大数据库进行查询时,性能是很重要的。SQL Se rver 7.0含有两个新的数据库工具来改进数据库操作。文件组可以加速数据库操 作,而GUID数据类型则考虑公用的特殊的数据库对象,这对于企业来说是很有用 的棗例如跨国计划。
改进对数据库的访问文件组是一个数据库文件布局的管理机制,它允许你把一个 数据库创建在多个磁盘上。
当你创建一个SQL Server 7.0数据库时SQL Server 自动把所有文件安排在默认文 件组中。除非你把另外一个文件组指定为默认,默认的总是主文件组。(你可以 以后再为将来的数据库文件更改默认文件组。)而且,甚至指定一个不同的文件 组作为缺省的情况下,所有你的数据库系统文件也都将保留在主文件组中.
分配给数据库文件的文件组属性保持这些文件的轨迹,即使他们位于不同的磁盘上 。
例如,你把一个表格分配给一个文件组,但是把表格的索引文件保存在一个单独 的磁盘上。当你访问表格以获得数据时,你的查询将在两个磁盘之间交叉展开, 因此关于表格的各种文件的几个搜索将同时发生,这样就加快了结果设置的返回 。
文件组也有利于有关数据库的管理工作。你不必同时在你的数据库上执行备份操 作。而是,你可以同时在一个文件组上备份你的数据库。
在数据库工具中,在表属性页中指定Table 和 Text文件组。在Indexes/Keys属性 页指定Index文件组。
当你开始为你的数据库计划文件组属性时,注意以下几点:
文件组不能独立于数据库文件而创建。
一个文件组不能被多于一个的数据库使用。
任何时候只有一个文件组可以被设置为一个数据库的缺省文件组。
一个文件只能是一个文件组的成员。
一旦一个文件被加入到数据库并被分配到一个文件组,你就不能将这个文件移到 其他文件组。
系统对象和文件总是被分配到主文件组。
关于文件组的更深入讨论,请参考你的SQL Server 7.0文档。
保证数据对象的唯一性
当你正在处理被多个站点(像在跨国公司条件下)使用的大数据库时,你也许会 遇到保证表格对象唯一性这样的棘手问题。在这种情形下,可能只能靠UNIQUEID ENTIFIER来解决。UNIQUEIDENTIFIER是一个保存全局唯一标识符的GUID数据类型 。GUID是一个保证唯一的二进制数,因此几乎没有别的计算机会产生同一个值。
GUID的唯一值是由计算机网卡的标识数加上一个CPU时钟产生的唯一数而得到的。 网卡制造商至少在下一个100年内能保证网卡的唯一性。
UNIQUEIDENTIFIER值不能像IDENTITY属性那样自动产生。要想为你的表格对象产 生UNIQUEIDENTIFIER值,你必须指定NEWID函数为column的缺省值。
例如,如果你想要创建一个表格列出你的跨国公司的所有子公司的尖端产品的收 入,并且你希望指定一个GUID数据类型,那么你可以键入:
CREATE TABLE NetRevenueTable
(UniqueColumn UNIQUEIDENTIFIER DEFAULT NEWID(),
Characters VARCHAR(10))
在数据库工具中,你要在数据库图表中或当你正在设计一个表格时做这件事情。 为你想唯一确定的column选择Is RowGUID。缺省情况将是(newid()),它自动产生 RowGUID。
尽管在许多情况下你必须保证表格对象的唯一性,但是如果你决定使用UNIQUEID ENTIFIER数据类型,请注意以下特性:
这些值是长而且难懂的。
这些值是随机的,不带有对用户有意义的样式。
这些值在依靠连续增加的值的应用程序中很难使用。
这些值有16字节,很大,因此用这些钥匙构建索引会更慢。
有关GUID数据类型的更多的信息,请参考SQL Server 7.0文档。
为报告获得数据
总而言之,通过数据库工具你可以使用的新SQL Server 7.0特性将是企业数据库 任务更有效更可行,如跨国公司scenario。
使用连接服务器和TOP子句,你可以访问外部OLE DB数据资源并且将潜在长度结果 列表限定在你想要的并易于使用的尺寸上。另外,如果在数据库文件上适当地实 现文件组和GUID数据类型,这样的操作最终可以被更有效地和更容易地完成。
因此,回到跨国公司scenario,你怎样获得将是你收入分析基础的结果设置?
这有一个SELECT声名,当你在你的Chicago(主)办公室中使用数据库时,你可以 运行它。
SELECT TOP 50 NetRevenueTable.name, NetRevenueTable.net
FROM
(
SELECT Prod.name, Prod.net
FROM johann_sa.svs.dbo.products AS Prod
WHERE date between '07/01/97' and '06/30/98'
AND Prod.net > 1
UNION
SELECT Prod.name, Prod.net
FROM tokyo_jn.svs.dbo.products AS Prod
WHERE date between '07/01/97' and '06/30/98'
AND Prod.net > 1
UNION
SELECT Prod.name, Prod.net
FROM london_uk.svs.dbo.products AS Prod
WHERE date between '07/01/97' and '06/30/98'
AND Prod.net > 1
UNION
SELECT Prod.name, Prod.net
FROM buenosa_ag.svs.dbo.products AS Prod
WHERE date between '07/01/97' and '06/30/98'
AND Prod.net > 1
UNION
SELECT Prod.name, Prod.net
FROM canberra_au.svs.dbo.products AS Prod
WHERE date between '07/01/97' and '06/30/98'
AND Prod.net > 1
UNION
/*The following SELECT statement is for information*/
/*from the svs database in the Chicago Main Office*/
SELECT Prod.name, Prod.net
FROM products AS Prod
WHERE date between '07/01/97' and '06/30/98'
AND Prod.net > 1
)
as NetRevenueTable
ORDER BY NetRevenueTable.net desc
这些结果应该会向你描绘一个你的公司的最高收益产生者的概况棗用于分析的一 个好的开始点。祝你好运!
---------------------------------------------------------------------- ----------
-- 如果你觉得可笑的话,那么你错了
如果你觉得不可笑的话,那么我错了
※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 168.160.66.50]
|
|