数据库中的数据变换和转换注意事项
使⽤数据转换服务 (DTS) 转变或转换异类数据和⽬的服务器之间的数据之前,请考虑不同程序、提供程序以及驱动程序⽀
持数据类型和 SQL 语句的⽅式的变化。
当使⽤ Microsoft® SQL Server™ 作为数据源时,请考虑下列事项:
将 real 数据类型转换为 int 数据类型也许不能返回精确的值,因为 SQL Server 2000 只⽀持精确度为 6 位数字的
real 数据类型。例如,real 型数字 2147480000 可能⽣成 2147480065 的 int 值。
oracle 时间转换从⼀个⽂本⽂件将 string (DBTYPE_WSTR) 列转换为 date (DBTYPE_DATE) 或 time (DBTYPE_TIME) 列时,OLE DB 数据转
换服务组件只接受⼀种⽇期或时间格式 (yyyy-mm-dd hh:mm:ss.fffffffff)。使⽤⽇期时间字符串转换,或者使⽤ CDate
函数编码 Microsoft ActiveX® 脚本转换正确地转换⽇期。
SQL Server 2000 不⽀持 OLE DB 类型 DBTYPE_DATE 或 DBTYPE_TIME。SQL Server 2000 只⽀持 DBTYPE_DATETIME。 若要通过多步骤访问数据,请避免在转换过程中使⽤ temp 表。应使⽤全局 temp 表或在 tempdb 中创建永久表。
从 temp 表返回⾏的存储过程不能⽤作转换源。可以使⽤存储过程从全局 temp 表或表返回⾏。
在转换数据任务、数据驱动的查询任务或 DTS 设计器中的执⾏ SQL 任务中使⽤临时表时,请记住:不能使⽤ Transact-
SQL 语句或调⽤ temp 表的存储过程作为源。
该限制并不应⽤于 DTS 设计器的外部。可使⽤通过编程⽅式访问 SQL Server temp 表的源语句或存储过程。
DTS 导⼊/导出向导和 DTS 设计器
当使⽤ DTS 导⼊导出向导和 DTS 设计器创建包时,请考虑以下事项:
DTS ⽤户界⾯允许共享任务中现有的连接,但是同⼀个连接不能既⽤在⼀个转换的源中⼜⽤在该转换的⽬的中。
使⽤ DTS 设计器或 DTS 导⼊/导出向导,有可能为⼀些只作为数据源的提供程序指定只读或正在使⽤状态(例如,
Microsoft Access 和 ODBC DSN )。单击"连接属性"对话框中的"⾼级"选项卡,然后在"⾼级连接属性"对话框中,将模式
属性值设置为 1。
使⽤ DTS 导⼊/导出向导或 DTS 设计器创建表时,在⽬的地上创建的表的所有者为当前⽤户(通常是 dbo),与谁是源表
的所有者⽆关。这将产⽣这种情况:dbo 试图在⽬的地创建⼀个表,⽽该表的名称已经存在,从⽽导致尝试失败。
当使⽤ DTS 设计器定义数据驱动的查询时,数据⽬的地必须能够⽀持 OLE DB ICommand 接⼝。由于这种限制,类似⽂本
⽂件的⽬的不被⽀持。
如果 text、ntext 和 image 类型的字段长度超过 8388602 字节,则 DTS 的复制 SQL Server 对象任务将截断超出的部
分。DTS 设计器或 DTS 导⼊/导出向导不显⽰任何错误信息,⽽是显⽰任务已成功完成。
唯⼀的失败指⽰是⼀条写⼊⽇志⽂件的⽇志消息,此⽂件的名称为 <server>.<database>.log,位于"复制 SQL Server 对
象任务属性"对话框的"复制"选项卡所指定的脚本⽂件⽬录中。此⽇志消息详细说明表和列,但不指出发⽣截断的⾏。⽆任
何错误记录写⼊ DTS 错误⽂件或 SQL Server ⽇志。
Microsoft SNA Server
当使⽤ Microsoft SNA Server 作为数据源时,请考虑下列事项:
AS/400 和 VSAM 的 Microsoft OLE DB 提供程序不⽀持 DTS 导⼊/导出向导⽤来创建或截断表的 SQL 语句。
Microsoft Access
使⽤ Access 时,应考虑下列事项:
当从 SQL Server 2000 中将数据导出到 Microsoft Access 97 或更早的版本中,Access 的 Microsoft OLE DB 提供程序 在内存中为所有插⼊设置缓冲区,并且只在 DTS 导⼊/导出向导完成操作时提交它们。结果是,可以在导出⼤量表时,⾯
对内存较⼩的形势。然⽽,可以通过构造在多个传递中发送较少⾏数的 SELECT 语句解决该问题。
Microsoft Visual FoxPro
Microsoft Visual FoxPro® 只⽀持 numeric 数据类型的 (15,9) 精度。如果导出到 Visual FoxPro 的数据超出该精
度,则会被截断并四舍五⼊。
Visual FoxPro 不⽀持 SELECT INTO 语句。
DTS 查询设计器⽀持 Visual FoxPro INSERT VALUE 语句,但不⽀持使⽤ SELECT 语句的 INSERT 语句。
ODBC 的 Microsoft OLE DB 驱动程序⽆法使⽤ FoxPro ODBC 驱动程序将 BLOB 写⼊ Visual FoxPro,因为 Visual FoxPro 不⽀持动态游标。
ODBC
当连接到 ODBC 数据源时,请考虑下列事项:
ODBC 的 Microsoft OLE DB 提供程序在执⾏导出操作时需要⼀个在带有 BLOB 数据列的所有⽬标表上的唯⼀键。
当使⽤带有 SQL Server ODBC 驱动程序的 ODBC 的 Microsoft OLE DB 提供程序时,在安排带有源⾏集中其它数据类型的 列之后安排所有 BLOB 列。可以使⽤ SELECT 语句重新将 BLOB 列安排到源⾏集的末尾。DTS 导⼊/导出向导⾃动地执⾏该 操作。
重要 当使⽤带有 SQL Server ODBC 驱动程序的 ODBC 的 Microsoft OLE DB 提供程序时,请尝试预览带有连接忙错误的 存储过程失败。如果使⽤ SQL Server 的 Microsoft OLE DB 提供程序,该问题就不会发⽣。
如果⼀个⽤于 SQL Server 的 Microsoft ODBC 驱动程序连接由多个线程共享,此连接可能会失败,并返回错误信 息"Connection is busy with results for another hstmt"(此连接正忙于其它 hstmt 的结果)。在某些情况下,这将
影响通过 DTS 导⼊/导出向导⽣成的包。使⽤以下⽅法之⼀解决此问题:
将 MaxConcurrentSteps 属性设置为1 以消除竞争的线程。
创建其它的 ODBC 连接以消除连接共享。
使⽤⽤于 SQL Server 的 Microsoft OLE DB 提供程序 (SQLOLEDB) 连接数据库。如果需要连接 SQL Server 6.5 数据 库,则运⾏ Instcatl.sql 以启⽤通过⽤于 SQL Server 的 Microsoft OLE DB 提供程序进⾏访问。
Oracle
当使⽤ Oracle 作为数据源时,请考虑以下事项:
⽤于 Oracle 的 Microsoft ODBC 和 OLEDB 驱动程序⽀持 Oracle 7.3 BLOB 数据类型,不⽀持 Oracle 8.0 数据类型。
例如,不⽀持 BLOB、CLOB、NCLOB 和 BFILE。
⽤于 Oracle 的 Microsoft OBDC 驱动程序不⽀持将 Unicode 字符串发送到 Oracle 服务器中。Oracle 要求在 Unicode
字符串前加上前缀字母 N。
⽤于 Oracle 的 Microsoft OBDC 驱动程序不⽀持 Oracle number 数据类型的负向缩放。
⽤于 Oracle 的 Microsoft OBDC 驱动程序报告⽆指定精度的 Oracle number 数据类型的长度为 20 位数字。当从
Oracle (不考虑⽬的)中导⼊时,如果有多于 20 位的数字,并且如果⽬的表还不存在,可能必须⼿⼯地增加精度。
在表中 Oracle 仅⽀持⼀个 LONG (BLOB) 数据列。
不能导⼊或导出拥有混合或⼩写名称的 Oracle 列。也不能通过使⽤ Oracle 列名称(包含使⽤ DTS 导⼊/导出向导的空
格)来转换或复制数据。Oracle 要求精确指定并引⽤区分⼤⼩写的列名称。
若要在 SQL Server 2000 和 Oracle 之间执⾏分布式事务,必须使⽤ Oracle 8.0.4.1 版本或更新版本。有关更多信息,
请参见分布式事务。
由于⽤于 Oracle 的 Microsoft OLE DB 提供程序不⽀持 IcommandWithParameters,所以它不能⽤作数据驱动的查询任务
的⽬的地。在 DTS 设计器中使⽤此提供程序时,转换数据任务、数据驱动的查询任务以及执⾏ SQL 任务上的"参数"按钮
将被禁⽤。
IBM AS/400 上的 DB2
当连接到 DB2 数据源时,请考虑以下事项:
在 AS/400 系统上不⽀持 Unicode 或 BLOB。
在 AS/400 服务器上不能转换任何有 NULL 列值的表,因为 AS/400 在其 CREATE TABLE 语句中不⽀持 NULL 语法。然 ⽽,如果编辑 CREATE TABLE 语法以清除对 NULL 的引⽤时,则可以发送 NULL 值。AS/400 不⽀持 NOT NULL;如果没指 定就假定为 NULL。
使⽤ Sybase ODBC 驱动程序
当连接到⼀个 Sybase ODBC 数据源时,请考虑以下事项:
当使⽤ DTS 导⼊/导出向导将数据从 SQL Server 转换到 Sybase 11 版本时:
默认情况下,SQL Server numeric (3,0) 数据类型映射为 Sybase smallmoney。为避免数据丢失,请更改此设置。
默认情况下,SQL Server numeric (18,x 或 19,x) 数据类型映射为 Sybase money 数据类型。为避免数据丢失,请更改
此设置。
将数据移动到⼀个新的 Sybase 表时,如果单击了"列映射和转换"对话框中的"确定"按钮,向导会返回错误信息"表已存
在"。应该忽略此消息。
不能使⽤ DTS 导⼊/导出向导除去并且重新创建 Sybase 表。必须不使⽤向导来执⾏此操作。
DTS 查询设计器不⽀持 Sybase SQLAnywhere CREATE TABLE 语句。
由于 SQLAnywhere 驱动程序中的限制,DTS 导⼊/导出向导每次只能将⼀个表移动到 SQLAnywhere 数据库。可以使⽤
DTS 设计器来克服此限制。然⽽,因为 SQLAnywhere 驱动程序不是安全线程,所以,必须将每个表的 Step 对象的 ExecuteInMainThread 属性设置为 True。
如果表中包含 BLOB 列,则不能将此表复制到 Sybase ⽬的中。
如果通过编程⽅式从 Sybase 中复制⼀个包含 image 数据类型的表,则更改默认的 BLOB 设置会导致失败。
dBase 和 Paradox
当连接到 dBase 和 Paradox 数据源时,请考虑以下事项:
dBase 和 Paradox 中的表名称被限制为⼋个字符。dBase 中的列名称被限制为 10 个字符。
⽂件导⼊或导出
当从⽂本⽂件导⼊或导出数据时,请考虑以下事项:
在 char 或 varchar 列中导⼊或导出数据时,如果客户端 OEM 代码页与服务器上的代码页不同,则某些扩展字符可能不
被复制。在 nchar 或 nvarchar 列中导⼊或导出数据时,所有字符均能正确复制。
如果将 BLOB(包括 SQL Server 的 text 和 ntext 数据类型)列导出到固定长度的⽂本字段中,则将默认长度设置为
BLBO 字段的最⼤长度(⼤约 2GB)。通过选择较⼩的但⾜够的字段长度来防⽌磁盘溢出,或者在可能的时候使⽤分隔格 式。
DTS 中使⽤的⽤于⽂本⽂件的 OLE DB 提供程序不能处理超过两兆字节 (MB) 的 BLOB 数据列。
代码页、排序规则和⾮ Unicode 数据问题
使⽤ DTS 在具有不同代码页和排序规则的 SQL Server 数据库间复制数据时,数据可能会丢失或转换不正确。
为避免出现转换问题,应以 Unicode 形式存储国际数据。⼀旦转换为 Unicode 后,便可很容易地将任何排序规则或代码
页中的数据传送到任何 Microsoft SQL Server 2000 或 Microsoft SQL Server 7.0 数据库,⽽不会出现数据丢失或转换 不正确这类问题。
在 Microsoft SQL Server 2000 中,排序规则与具体的代码页相关联并被指派给各个列。(Microsoft SQL Server 7.0
使⽤单个的默认代码页且不⽀持列级排序规则)。如果⽤于源列和⽬的列的代码页匹配,则⾮ Unicode 列不会发⽣数据丢 失。在⾮ Unicode 列间复制数据时,如果源列与⽬的列不匹配,则将发⽣数据丢失。在某些情况下,DTS 执⾏最佳的匹配
映射。如果源代码页包含的字符在⽬的代码页中未出现,则将发⽣数据丢失。此外,DTS 执⾏复制时不需要任何转换⼲
预,这将导致在两个代码页中不是由同⼀个⼆进制值表⽰的数据丢失。下⾯的问题及准则分别针对使⽤复制 SQL Server
对象任务的情况,和使⽤复制列转换在不同排序规则或代码页之间复制数据的情况。
复制 SQL Server 对象任务
下⾯论述复制 SQL Server 对象任务如何处理⾮ Unicode 数据:
在 SQL Server 2000 实例间复制数据时,只要设置复制 SQL Server 对象任务的 UseCollation 属性,便不会发⽣数据丢 失。
将数据从 SQL Server 2000 实例复制到 SQL Server 7.0 时,对于具有与数据库默认排序规则代码页相匹配的排序规则的 列,使⽤最佳匹配映射。⽽具有不同代码页的列中所存储的数据,则被解释为正在⽤默认代码页进⾏编码处理,转换过程
中将伴随数据丢失。
将数据从 SQL Server 7.0 复制到SQL Server 2000 实例时,由于 SQL Server 7.0 ⽆法确定其默认代码页所映射的排序 规则,UseCollation 属性不可⽤。执⾏复制 SQL Server 对象任务期间不⽀持任何排序规则,因此,将给⾮ Unicode ⽬
的列指派⽬的数据库的默认排序规则。如果与此排序规则相关联的代码页与源数据库的代码页不匹配,DTS 将执⾏最佳匹
配映射。
将数据从 SQL Server 7.0 复制到 SQL Server 7.0 时,如果源数据库和⽬的数据库使⽤不同的默认代码页,DTS 将执⾏
最佳匹配映射。
若要确保复制⾮ Unicode 时不发⽣数据丢失,可使⽤ SQL Server ⼤容量复制功能以 Unicode 格式导出数据,然后使⽤
⼤容量复制或 DTS 导⼊数据。
若要禁⽤默认排序规则脚本,请添加代码或使⽤脱接编辑或动态属性任务将 SQLDMOScript2_70Only 的值添加到复制 SQL Server 对象任务的 ScriptOptionEx 属性中。
复制列转换
下⾯论述复制列转换如何在不同代码页之间处理⾮ Unicode 数据:
如果源列为 Unicode ⽽⽬的列为⾮ Unicode,则执⾏最佳匹配映射,并尝试在源列和⽬的列之间转换数据。
如果源列为⾮ Unicode ⽽⽬的列为 Unicode,则不论实际使⽤的代码页是什么,DTS 都将源列视为属于代码页 1252。 如果源列和⽬的列都为⾮ Unicode,原始数据不经转换即被复制,将发⽣部分数据丢失。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论