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
版权声明:本文标题:数据变换和转换注意事项(SQL) 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1706068599h500530.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论