SQL批量复制命令的六个陷阱
1、没有对UTF-8的支持
SQL Server有对Unicode的本地支持,使用过nvarchar和ntext字段类型的任何人都知道。它通过映射每个字符为双字节实体来内部处理 Unicode。如果你只是处理SQL Server实例之间的数据,那么不会有任何问题,因为它们都以相同的方式存储。
不过,如果你 试图使用BCP从把Unicode导出为UTF-8的数据来源导入数据,那事情就有点复杂了。UTF-8是Unicode的一种子变体,专门设计支持与八 位ASCII文本的向后兼容,所以默认使用八位ASCII编码的网页、电子邮件和其它格式可以用于存储Unicode数据。
如果你从UTF-8源导出数据,不要指望对这些数据使用BCP;它一直不支持UTF-8。你必须考虑数据问题,以完整双字节Unicode导出使数据形成可接受格式。具有讽刺意味的是,另一个普通的编码可以通过“-C”开关(ISO 1252,ANSI/微软公司Windows)被BCP接受。不过,就整体而言,你最好把数据导出为双字节Unicode,以保持对BCP的最大兼容性,尤其是如果你处理的数据可能包含与ASCII不兼容的字符。
2、注意导出的行顺序
使用BCP通过查询导出的数据对于导出顺序遵守相同的规则,会应用于任何其它情况的查询。换句话说,如果你的查询没有明确的“ORDER BY”从句,你获得的数据看起来就是完全任意的顺序。它通常是基于隐含索引中的顺序形成的,但是我已经学会甚至连经验法则也不相信了——尤其是如果该查询 在多个表之间执行“JOIN”或者一些其它聚合函数。
数据是按什么顺序导出的通常并不重要,但是数据以什么顺序导入是非常关键的。如果你使用的数据库是后来导入行的正确性决定于早先存在的行,而且你是批量导入数据的话,那么导出的顺序就很重要,你需要相应地建立你的BCP语句。这一点似乎显而易见,但是我经常惊讶有那么多人,甚至包括一些资深的SQL Server专家都没有意识到这一点。
3、从BCP激活的存储过程不能接收参数
如果你使用带有参数的存储过程,作为BCP动作Transact-SQL(T-SQL)语句的一部分,几乎可以肯定它不能用,而且会在命令行抛出函数顺序错误。
当T-SQL语句传递给BCP时,它将被使用“SET FMTONLY ON”机制进行分析,来判断结果集的柱状格式。这意味着动态构造语句(比如带参数的存储过程)将不能正确分析,而且也不能在BCP下编译。
如果你想解决这个问题,有几种方法可以选择:
创建不带任何参数的存储过程,用问号激活存储过程并传入需要的参数(可能通过数据源而不是命令行接收参数)。
用sqlcmd替代BCP。
MSDN博客中提到了一个处理技巧,需要使用称为“openrowset”的技巧。如果你通过“OPENROWSET ”函数运行“SELECT”,你可以以临时方式传递一个T-SQL语句,从而解决调用带参数存储过程的限制。然而,这种处理技巧也有局限:例如,与语句连 接时不应该使用,因为运行会对数据库造成消极变化,而且该语句可能需要运行不止一次。
4、导入时要注意表定义
当你使用BCP从一个SQL Server源导出数据,并导入到另一个SQL Server时,你导出时的列定义和导入时的列定义必须相匹配。这也包括诸如NULL或者NOT NULL这类定义,在目标表缺少它们会引起静默数据损坏。
5、在目标数据库上的触发器不能被BCP触发
不管什么时候运行导入操作,BCP的本地行为在目标数据库上都会禁用触发器。因为BCP导入操作通常很大,如果按默认启用触发器的话,导入操作会很混乱。因此,你需要在BCP上使用命令选项“-h FIRE_TRIGGERS”,这样触发器才会被触发。
要注意,当选项启用时,触发器会为每个批量操作运行一次,——也就是说,每次你运行BCP时执行一次。另外还要注意,在SQL Server 2005和以后的版本中,触发器使用了“行版本”,在导入操作时用tempdb来存储行版本信息。如果你的tempdb不能容纳触发器生成的大量数据涌 入,该操作将异常终止。
6、BCP不能给本地附加文件输出
如果你使用BCP导出数据到文件,该文件必须是新创建的。你不能选择现存文件,并把导出结果追加到文件。幸运的是,解决办法并不困难,您可以简单地导出到任何多个文件,然后使用COPY命令来整合这些结果。命令如下:
COPY export1.dat + export2.dat export.dat
====================================分割线================================
最新内容请见作者的GitHub页:http://qaseven.github.io/
SQL Server 复制表结构以及数据,去除表中重复字段 SQL Server 复制表结构以及数据,去除表中重复字段--复制另一个数据库中的某张表的结构及数据--select * from Test.dbo.TestTable(查询表中所有数据) --into [表名] 插入当前数据库新表,如果没有该表就创建 select * into TestCopy from Test.
SQL Server 复制需要有实际的服务器名称才能连接到服务器 原文:SQL Server 复制需要有实际的服务器名称才能连接到服务器 机子由于在捣鼓DAC连接方式时,计算机名被修改了,被改成了kerry,直到最近几天由于计算机改名了,这个潜在的问题(本机数据库只是偶尔那里做实验)终于爆发了:我用连接服务器从其它服务器拷贝数据时报错,错误如下:SQL Server 复制需要有实际的服务器名称才能连接到服务器。
SQL Server 复制:事务发布 原文:SQL Server 复制:事务发布 在复制的运用场景中,事务发布是使用最为广泛的,我遇到这样一个场景:在Task数据库中有Basic与Group两个表,需要提供这两个表的部分字段给其它程序读取放入缓存,程序需要比较及时的获取到这些数据,作为DBA你需要从权限和性能控制的角度出...
SQL Server 跨网段(跨机房)FTP复制 原文:SQL Server 跨网段(跨机房)FTP复制 一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 搭建过程(Process) 注意事项(Attention) 参考文献(References)
SQL Server 跨网段(跨机房)复制 原文:SQL Server 跨网段(跨机房)复制 一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 解决方案(Solution) 搭建过程(Process) 注意事项(Attention) 参考文献(References)
SQL Server 数据变更时间戳(timestamp)在复制中的运用 原文:SQL Server 数据变更时间戳(timestamp)在复制中的运用 一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 方案(Solution) 方案一(Solution One) 方案二(Solution Two)
SQL Server 通过备份文件初始化复制 原文:SQL Server 通过备份文件初始化复制 一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 搭建过程(Process) 注意事项(Attention) 疑问(Questions) 参考文献(References)
最近发现有一个发布经常出现问题,每几天就出错不同步,提示要求初始化。重新调整同步后,复制还是很慢!每天白天未分发的命令就达五六百万条!要解决慢的问题,需要了解从发布数据库到订阅数据库中,有哪些操作,才知道哪个步骤同步缓慢。
相关文章
- SQL Server导入数据报错"无法在只读列“Id”中插入数据",几百个表怎么批量启用'启用标识插入'选项
- Linux&Windows下批量修改文件后缀
- SQL SERVER 2012启动失败 because upgrade step 'SSIS_hotfix_install.sql' 失败
- 批量kill掉包含某个关键字的进程
- java.sql.SQLException: The SQL statement must not be null or empty.这个错误
- 批量下载桌面壁纸使用Powershell
- 批量复制文件
- 20-crm项目-kingadmin,开发批量生成上课记录和学员课程页面
- [SQL]批量 更改字符集脚本,批量查询约束,批量查询索引
- linux系统批量修改用户密码
- Excel表格文本格式的数字和数字格式如何批量转换
- 【学习总结】SQL的学习-1-初识数据库与sql
- MySQL批量SQL插入性能优化
- Mysql 一条SQL语句实现批量更新数据,update结合case、when和then的使用案例
- Silicon Labs发布蓝牙5.2芯片EFR32BG22,承诺高达5年以上纽扣电池供电,批量价格52美分
- SQL SERVER服务器链接连接(即sql server的跨库连接)
- Tool之Adobe:解决Adobe acrobat pro将PDF文件进行批量保存单页PDF文件(图文教程)
- Sql:成功解决将sql输出的datetime时间格式转为常规格式
- 【Python自动化办公】批量将Excel表格数据导出为PDF文件
- SQL VQ11 找出sql类题目的单次最大刷题数
- 【SQL干货】一条sql按季度统计交易数据
- 使用SqlBulkCopy类来批量复制数据
- QT批量实现单选按钮组
- Delphi中SQL批量插入记录
- sql的介绍——SQL Server数据库管理系统
- 【深度学习案例】批量检测戴口罩
- 【Python 实战】---- 批量对图片添加不同水印
- zabbix精华篇-低级自动发现详解---批量自动获取主机所有tomcat端口并进行监控(二十四)