admin 管理员组

文章数量: 887021


2024年1月24日发(作者:网上网页设计课程)

【Word版本下载可任意编辑】

数据变换和转换注意事项(SQL)

使用数据转换服务(DTS)转变或转换异类数据和目的服务器之间的数据之前,请考虑不同程序、提供程序以及驱动程序支

持数据类型和SQL语句的方式的变化。

当使用Microsoft®SQLServer™作为数据源时,请考虑以下事项:

将real数据类型转换为int数据类型也许不能返回准确的值,因为SQLServer2000只支持准确度为6位数字的

real数据类型。例如,real型数字2147480000可能生成2147480065的int值。

从一个文本文件将string(DBTYPE_WSTR)列转换为date(DBTYPE_DATE)或time(DBTYPE_TIME)列时,OLEDB数据转

换服务组件只承受一种日期或时间格式(yyyy-mm-ddhh:mm:fff)。使用日期时间字符串转换,或者使用CDate

函数编码MicrosoftActiveX®脚本转换正确地转换日期。

SQLServer2000不支持OLEDB类型DBTYPE_DATE或DBTYPE_TIME。SQLServer2000只支持DBTYPE_DATETIME。

若要通过多步骤访问数据,请防止在转换过程中使用temp表。应使用全局temp表或在tempdb中创立永久表。

1 / 13

【Word版本下载可任意编辑】

从temp表返回行的存储过程不能用作转换源。可以使用存储过程从全局temp表或表返回行。

在转换数据任务、数据驱动的查询任务或DTS设计器中的执行SQL任务中使用临时表时,请记住:不能使用Transact-

SQL语句或调用temp表的存储过程作为源。

该限制并不应用于DTS设计器的外部。可使用通过编程方式访问SQLServertemp表的源语句或存储过程。

DTS导入/导出向导和DTS设计器

当使用DTS导入导出向导和DTS设计器创立包时,请考虑以下事项:

DTS用户界面允许共享任务中现有的连接,但是同一个连接不能既用在一个转换的源中又用在该转换的目的中。

使用DTS设计器或DTS导入/导出向导,有可能为一些只作为数据源的提供程序指定只读或正在使用状态(例如,

MicrosoftAccess和ODBCDSN)。单击"连接属性"对话框中的"高级"选项卡,然后在"高级连接属性"对话框中,将模式

属性值设置为1。

使用DTS导入/导出向导或DTS设计器创立表时,在目的地上创立的表的所有者为当前用户(通常是dbo),与谁是源表

的所有者无关。这将产生这种情况:dbo试图在目的地

2 / 13

【Word版本下载可任意编辑】

创立一个表,而该表的名称已经存在,从而导致尝试失败。

当使用DTS设计器定义数据驱动的查询时,数据目的地必须能够支持OLEDBICommand接口。由于这种限制,类似文本

文件的目的不被支持。

如果text、ntext和image类型的字段长度超过8388602字节,则DTS的复制SQLServer对象任务将截断超出的部

分。DTS设计器或DTS导入/导出向导不显示任何错误信息,而是显示任务已成功完成。

唯一的失败指示是一条写入日志文件的日志消息,此文件的名称为..log,位于"复制SQLServer对

象任务属性"对话框的"复制"选项卡所指定的脚本文件目录中。此日志消息详细说明表和列,但不指出发生截断的行。无任

何错误记录写入DTS错误文件或SQLServer日志。

MicrosoftSNAServer

当使用MicrosoftSNAServer作为数据源时,请考虑以下事项:

AS/400和VSAM的MicrosoftOLEDB提供程序不支持DTS导入/导出向导用来创立或截断表的SQL语句。

MicrosoftAccess

使用Access时,应考虑以下事项:

3 / 13

【Word版本下载可任意编辑】

当从SQLServer2000中将数据导出到MicrosoftAccess97或更早的版本中,Access的MicrosoftOLEDB提供程序

在内存中为所有插入设置缓冲区,并且只在DTS导入/导出向导完成操作时提交它们。结果是,可以在导出大量表时,面

对内存较小的形势。然而,可以通过构造在多个传递中发送较少行数的SELECT语句解决该问题。

MicrosoftVisualFoxPro

MicrosoftVisualFoxPro®只支持numeric数据类型的(15,9)精度。如果导出到VisualFoxPro的数据超出该精

度,则会被截断并四舍五入。

VisualFoxPro不支持SELECTINTO语句。

DTS查询设计器支持VisualFoxProINSERTVALUE语句,但不支持使用SELECT语句的INSERT语句。

ODBC的MicrosoftOLEDB驱动程序无法使用FoxProODBC驱动程序将BLOB写入VisualFoxPro,因为Visual

FoxPro不支持动态游标。

ODBC

当连接到ODBC数据源时,请考虑以下事项:

ODBC的MicrosoftOLEDB提供程序在执行导出操作时需要一个在带有BLOB数据列的所有目标表上的唯一键。

4 / 13

【Word版本下载可任意编辑】

当使用带有SQLServerODBC驱动程序的ODBC的MicrosoftOLEDB提供程序时,在安排带有源行集中其它数据类型的

列之后安排所有BLOB列。可以使用SELECT语句重新将BLOB列安排到源行集的末尾。DTS导入/导出向导自动地执行该

操作。

重要当使用带有SQLServerODBC驱动程序的ODBC的MicrosoftOLEDB提供程序时,请尝试预览带有连接忙错误的

存储过程失败。如果使用SQLServer的MicrosoftOLEDB提供程序,该问题就不会发生。

如果一个用于SQLServer的MicrosoftODBC驱动程序连接由多个线程共享,此连接可能会失败,并返回错误信

息"Connectionisbusywithresultsforanotherhstmt"(此连接正忙于其它hstmt的结果)。在某些情况下,这将

影响通过DTS导入/导出向导生成的包。使用以下方法之一解决此问题:

将MaxConcurrentSteps属性设置为1以消除竞争的线程。

创立其它的ODBC连接以消除连接共享。

使用用于SQLServer的MicrosoftOLEDB提供程序(SQLOLEDB)连接数据库。如果需要连接SQLServer6.5数

5 / 13

【Word版本下载可任意编辑】

库,则运行以启用通过用于SQLServer的MicrosoftOLEDB提供程序开展访问。

Oracle

当使用Oracle作为数据源时,请考虑以下事项:

用于Oracle的MicrosoftODBC和OLEDB驱动程序支持Oracle7.3BLOB数据类型,不支持Oracle8.0数据类型。

例如,不支持BLOB、CLOB、NCLOB和BFILE。

用于Oracle的MicrosoftOBDC驱动程序不支持将Unicode字符串发送到Oracle服务器中。Oracle要求在Unicode

字符串前加上前缀字母N。

用于Oracle的MicrosoftOBDC驱动程序不支持Oraclenumber数据类型的负向缩放。

用于Oracle的MicrosoftOBDC驱动程序报告无指定精度的Oraclenumber数据类型的长度为20位数字。当从

Oracle(不考虑目的)中导入时,如果有多于20位的数字,并且如果目的表还不存在,可能必须手工地增加精度。

在表中Oracle仅支持一个LONG(BLOB)数据列。

不能导入或导出拥有混合或小写名称的Oracle列。也不能通过使用Oracle列名称(包含使用DTS导入/导出向导的空

6 / 13

【Word版本下载可任意编辑】

格)来转换或复制数据。Oracle要求准确指定并引用区分大小写的列名称。

若要在SQLServer2000和Oracle之间执行分布式事务,必须使用Oracle8.0.4.1版本或更新版本。有关更多信息,

请参见分布式事务。

由于用于Oracle的MicrosoftOLEDB提供程序不支持IcommandWithParameters,所以它不能用作数据驱动的查询任务

的目的地。在DTS设计器中使用此提供程序时,转换数据任务、数据驱动的查询任务以及执行SQL任务上的"参数"按钮

将被禁用。

IBMAS/400上的DB2

当连接到DB2数据源时,请考虑以下事项:

在AS/400系统上不支持Unicode或BLOB。

在AS/400服务器上不能转换任何有NULL列值的表,因为AS/400在其CREATETABLE语句中不支持NULL语法。然

而,如果编辑CREATETABLE语法以去除对NULL的引用时,则可以发送NULL值。AS/400不支持NOTNULL;如果没指

定就假定为NULL。

使用SybaseODBC驱动程序

7 / 13

【Word版本下载可任意编辑】

当连接到一个SybaseODBC数据源时,请考虑以下事项:

当使用DTS导入/导出向导将数据从SQLServer转换到Sybase11版本时:

默认情况下,SQLServernumeric(3,0)数据类型映射为Sybasesmallmoney。为防止数据丢失,请更改此设置。

默认情况下,SQLServernumeric(18,x或19,x)数据类型映射为Sybasemoney数据类型。为防止数据丢失,请更改

此设置。

将数据移动到一个新的Sybase表时,如果单击了"列映射和转换"对话框中的"确定"按钮,向导会返回错误信息"表已存

在"。应该忽略此消息。

不能使用DTS导入/导出向导除去并且重新创立Sybase表。必须不使用向导来执行此操作。

DTS查询设计器不支持SybaseSQLAnywhereCREATETABLE语句。

由于SQLAnywhere驱动程序中的限制,DTS导入/导出向导每次只能将一个表移动到SQLAnywhere数据库。可以使用

DTS设计器来克服此限制。然而,因为SQLAnywhere驱动程序不是安全线程,所以,必须将每个表的Step对象

8 / 13

【Word版本下载可任意编辑】

ExecuteInMainThread属性设置为True。

如果表中包含BLOB列,则不能将此表复制到Sybase目的中。

如果通过编程方式从Sybase中复制一个包含image数据类型的表,则更改默认的BLOB设置会导致失败。

dBase和Paradox

当连接到dBase和Paradox数据源时,请考虑以下事项:

dBase和Paradox中的表名称被限制为八个字符。dBase中的列名称被限制为10个字符。

文件导入或导出

当从文本文件导入或导出数据时,请考虑以下事项:

在char或varchar列中导入或导出数据时,如果客户端OEM代码页与服务器上的代码页不同,则某些扩展字符可能不

被复制。在nchar或nvarchar列中导入或导出数据时,所有字符均能正确复制。

如果将BLOB(包括SQLServer的text和ntext数据类型)列导出到固定长度的文本字段中,则将默认长度设置为

BLBO字段的最大长度(大约2GB)。通过选择较小的但足够的字段长度来防止磁盘溢出,或者在可能的时候使用

9 / 13

【Word版本下载可任意编辑】

分隔格

式。

DTS中使用的用于文本文件的OLEDB提供程序不能处理超过两兆字节(MB)的BLOB数据列。

代码页、排序规则和非Unicode数据问题

使用DTS在具有不同代码页和排序规则的SQLServer数据库间复制数据时,数据可能会丢失或转换不正确。

为防止出现转换问题,应以Unicode形式存储国际数据。一旦转换为Unicode后,便可很容易地将任何排序规则或代码

页中的数据传送到任何MicrosoftSQLServer2000或MicrosoftSQLServer7.0数据库,而不会出现数据丢失或转换

不正确这类问题。

在MicrosoftSQLServer2000中,排序规则与具体的代码页相关联并被指派给各个列。(MicrosoftSQLServer7.0

使用单个的默认代码页且不支持列级排序规则)。如果用于源列和目的列的代码页匹配,则非Unicode列不会发生数据丢

失。在非Unicode列间复制数据时,如果源列与目的列不匹配,则将发生数据丢失。在某些情况下,DTS执行最正确的匹配

映射。如果源代码页包含的字符在目的代码页中未出现,

10 / 13

【Word版本下载可任意编辑】

则将发生数据丢失。此外,DTS执行复制时不需要任何转换干

预,这将导致在两个代码页中不是由同一个二进制值表示的数据丢失。下面的问题及准则分别针对使用复制SQLServer

对象任务的情况,和使用复制列转换在不同排序规则或代码页之间复制数据的情况。

复制SQLServer对象任务

下面论述复制SQLServer对象任务如何处理非Unicode数据:

在SQLServer2000实例间复制数据时,只要设置复制SQLServer对象任务的UseCollation属性,便不会发生数据丢

失。

将数据从SQLServer2000实例复制到SQLServer7.0时,对于具有与数据库默认排序规则代码页相匹配的排序规则的

列,使用最正确匹配映射。而具有不同代码页的列中所存储的数据,则被解释为正在用默认代码页开展编码处理,转换过程

中将伴随数据丢失。

将数据从SQLServer7.0复制到SQLServer2000实例时,由于SQLServer7.0无法确定其默认代码页所映射的排

11 / 13

【Word版本下载可任意编辑】

规则,UseCollation属性不可用。执行复制SQLServer对象任务期间不支持任何排序规则,因此,将给非Unicode目

的列指派目的数据库的默认排序规则。如果与此排序规则相关联的代码页与源数据库的代码页不匹配,DTS将执行最正确匹

配映射。

将数据从SQLServer7.0复制到SQLServer7.0时,如果源数据库和目的数据库使用不同的默认代码页,DTS将执行

最正确匹配映射。

若要确保复制非Unicode时不发生数据丢失,可使用SQLServer大容量复制功能以Unicode格式导出数据,然后使用

大容量复制或DTS导入数据。

若要禁用默认排序规则脚本,请添加代码或使用脱接编辑或动态属性任务将SQLDMOScript2_70Only的值添加到复制SQL

Server对象任务的ScriptOptionEx属性中。

复制列转换

下面论述复制列转换如何在不同代码页之间处理非Unicode数据:

12 / 13

【Word版本下载可任意编辑】

如果源列为Unicode而目的列为非Unicode,则执行最正确匹配映射,并尝试在源列和目的列之间转换数据。

如果源列为非Unicode而目的列为Unicode,则不管实际使用的代码页是什么,DTS都将源列视为属于代码页1252。

如果源列和目的列都为非Unicode,原始数据不经转换即被复制,将发生部分数据丢失。

13 / 13


本文标签: 数据 使用 导出 转换 复制