将A地的符合条件的文件恢复到B地机器上。对方管理员什么也不懂,所以想做的尽量傻瓜,免得要跟他说明半天如何操作。
--用查询语句导出文本文件
--EXEC master..xp_cmdshell 'bcp "select * from [TestDB11-27]..restoreweihai" queryout c:\test.txt -F 2 -c -S "192.168.102.122" -U"sa" -P"pass"'
--导出查询数据到XML文件
--EXEC master..xp_cmdshell 'bcp "select * from [TestDB11-27]..tline_tw for xml raw,binary
base64" queryout c:\\aa.xml -c -S"192.168.102.122" -U"sa" -P"pass"'
--从文本文件导入数据到数据库
--EXEC master..xp_cmdshell 'bcp Customer..order in c:\test.txt -c -S "192.168.102.122" -U sa
-P pass'
这里有几点需要注意
1 写查询语句导出时,用queryout比较好,我用out 时怎么也不成功,改queryout才行。
2 库名带空格,- 等字符时用“[ ]”括起来,这个在线帮助中有。
3 导入时使用的文件必须与导出时生成的文件一致,否则会出现复制失败,接受的导入默认是制表符分隔的文件,而DTS生成的文件用了很多引号或者括号之类的来分隔字段,所以DTS导出的文本与BCP导出的文本不能通用,否则会出现“在BCP数据文件中遇到的意外的EOF”错误。
如下:
NULL
开始复制...
SQLState = S1000, NativeError = 0
Error = [Microsoft][ODBC SQL Server Driver]在 BCP 数据文件中遇到的意外的 EOF
NULL
已复制了 0 行。
数据包的大小(字节): 4096
时钟时间(毫秒): 共 1
NULL
将导入文本改成使用导出语句生成的文本后,终于成功。
4. 在别的机器上测试发现一个问题,如果B地数据库结构与A地表结构不一致,会出现“字符造型错误”的问题。
——————————————
导入B地机器前先要将B地以前的相关数据清空,否则会出现关键字冲突,这时有外键约束关系的也要注意处理,否则会出错。
清理B地表中的数据。
osql -U"sa" -P"pass" -S"127.0.0.1" -Q "use Customer delete from order where FieldName='****' "
然后再执行导入语句。
bcp Customer..order in c:\test.txt -c -S "192.168.102.122" -U sa -P pass
将这两个语句写成bat文件。再把A地导出的test.txt文件与之放在一个文件夹,点击bat文件就可以执行了。
注意,有的机器上会找不到osql和bcp工具,可能是有的机器环境变量未设置。还得把这两个工具也加上,bcp要使用还得加上Resource Dll,这个我就懒得去找了,应该在sqlserver目录的80\tools\binn目录下