当前位置: 首页 > 图文教程 > 数据库 > MSSQL > SQL Server数据在不同数据库中的应用

MSSQL
SQL Server导出表到EXCEL文件的存储过程
如何利用触发器实现两个数据库间的同步
SQL Server数据库连接查询的种类及其应用
SQL Server 2005中利用xml拆分字符串序列
Microsoft SQL Server数据库SA权限总结
用SQL语句生成带有小计合计的数据集脚本
深入剖析SQL Server的六种数据移动方法
为导入文件加上时间戳标记的两种方法
SQL Server与Oracle、DB2的优劣对比
带你深入了解SQL Server 2008的独到之处
通过视图修改数据时所应掌握的基本准则
SQL Server中如何优化磁带备份设备性能
教你轻松解决几种常见的SQL疑难问题
怎样取得局域网中所有SQL Server的实例
在系统崩溃的时候如何恢复原有的数据
获得当前数据库对象依赖关系的实用算法
SQL Server如何才能访问Sybase中的表
如何才能保护好我们的SQL Server数据库
从两个方面讲解SQL Server口令的脆弱性
SQL Server数据库日志清除的两个方法

MSSQL 中的 SQL Server数据在不同数据库中的应用


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-17   浏览: 74 ::
收藏到网摘: n/a

在软件开发的初始阶段,开发商们总是想把整个系统的最小的细节设计好了,然后再去单线程的编写代码。这样软件开发完成需要很长时间,但开发商们一直都在这么做。

所以开发者不得不去缩小他们的野心,先设计好一个小系统,然而这个小系统只是解决了整个系统难题中的一部分。这导致了由不同的团队设计和创建的许多小系统几乎都不能相互之间兼容。

目前,许多组织都聘请了数据库建模者或者DBA,这些人能监督数据库设计和开发。不幸的是,那些组织只有在出现某些状况后,才会意识到在他们的员工中需要这样的人。

数据建模者和DBA面对的一个非常普遍的问题就是,如何在不同的数据库中解析SQL数据。本文将通过一个可靠的方法来说明这个问题。

一个实例

在这个实例方案中,有两个包含相似数据的数据库:一个使用术语OrderNumber,另一个使用术语OrderNo。第一个数据库有关键字而第二个数据库没有。

首先,你会在两个数据库中发现它们的顺序是相似的。清单A创建了两个数据库(Test_Cross_1和Test_Cross_2),每个数据库中有一个表(分别是Orders_1和Orders_2)。

假设Orders_1包括这些行:

OrderNumberOrderDate

2007-02-23 00:00:00.000

2007-02-24 00:00:00.000

2007-02-25 00:00:00.000

假设Orders_2包括这些行:

OrderNo  OrderDate

2007-02-23 00:00:00.000

2  2007-02-24 00:00:00.000

2007-02-24 00:00:00.000

3011 2007-02-25 00:00:00.000

一旦你明白了如何引用表SQL执行合并操作是很简单的。简而言之,你要有合法的名字。如清单B所示。这将不会成功,因为Order_2包括一行Order_1没有的数据。改变连接,加入对外连接符也不会成功,就像你在清单C中看到的那样。第二个查询得到跟第一个查询相同的结果,因为OrderNo 301不存在于第一个表中。找到这一行,你必须在第二个查询中,将这个表的顺序反转。如清单D。现在你就能发现不匹配的行了。

OrderNo   OrderDate   OrderNumberOrderDate

1   2007-02-23 00:00:00.0001  2007-02-23 00:00:00.000

2   2007-02-24 00:00:00.0002  2007-02-24 00:00:00.000

2007-02-24 00:00:00.000 NULL NULL

2007-02-25 00:00:00.0003 011 2007-02-25 00:00:00.000

假设有一些行存在于Order_1中而不存在于Order_2中。你将上面的查询翻转,它也能工作,然而,随后你会得到两个查询和两个结果集,并结束你的查询,这些你都必须手动比较。如果每个表只有四行,这是不困难的,但是想象一下如果有4,000行记录的话,怎么使用这种不切实际的方法进行比较呢。你必须对两个表的每行没出现在另外那张表的记录进行检查。

CREATE DATABASE [Test_Cross_1] ON PRIMARY

( NAME = N'Test_Cross_1', FILENAME = N'

C:Program FilesMicrosoft SQL ServerMSSQL.1MSSQLDATATest_Cross_1.mdf',

SIZE = 2048KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )

LOG ON ( NAME = N'Test_Cross_1_log',

FILENAME = N'C:aProgram FilesMicrosoft

SQL ServerMSSQL.1MSSQLDATATest_Cross_1_log.ldf',

SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)GO

USE [Test_Cross_1]

GO

CREATE TABLE [dbo].[Orders_1]

( [OrderNumber] [int] NOT NULL,

[OrderDate] [datetime] NOT NULL,

CONSTRAINT [PK_Orders_1] PRIMARY KEY CLUSTERED

( [OrderNumber] ASC)WITH (PAD_INDEX = OFF,

STATISTICS_NORECOMPUTE = OFF,

IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,

ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY]

CREATE DATABASE [Test_Cross_2] ON PRIMARY

( NAME = N'Test_Cross_2',

FILENAME = N'C:Program FilesMicrosoft

SQL ServerMSSQL.1MSSQLDATATest_Cross_2.mdf',

SIZE = 2048KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )

LOG ON ( NAME = N'Test_Cross_2_log',

FILENAME = N'C:Program FilesMicrosoft

SQL ServerMSSQL.1MSSQLDATATest_Cross_2_log.ldf',

SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)GO

CREATE TABLE [dbo].[Orders_2]

( [OrderNo] [int] NOT NULL, [OrderDate] [datetime]

NOT NULL CONSTRAINT [DF_Orders_2_OrderDate]

DEFAULT (getdate()), CONSTRAINT [PK_Orders_2]

PRIMARY KEY CLUSTERED ( [OrderNo] ASC)WITH

(PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,

IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,

ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

清单A

SELECT * FROM Test_Cross_1.dbo.Orders_1INNER

JOIN Test_Cross_2.dbo.Orders_2

ON Test_Cross_1.dbo.Orders_1.OrderNumber

清单B

SELECT * FROM Test_Cross_1.dbo.Orders_1LEFT OUTER

JOIN Test_Cross_2.dbo.Orders_2

ON Test_Cross_1.dbo.Orders_1.OrderNumber

清单C

SELECT * FROM Test_Cross_2.dbo.Orders_2LEFT OUTER

JOIN Test_Cross_1.dbo.Orders_1

ON Test_Cross_2.dbo.Orders_2.OrderNo

清单D