需求描述:
    需要将数据库的某个表格的内容以文件的形式保存起来。

常规做法
    写一个sql 语句 (select * from test),然后通过ADO,或者SqlDataReader等执行该语句,最后拼凑要保存到文件中的内容,并写入文件。

新的方法:

    写一个.bat文件,文件的内容为:
osql /U UserAccount/P Password /d Database /S Sever /Q "SELECT * from test " -o "E:\Documents and Settings\asa yuan\Desktop\test.txt" -u -w 2000  -n -s '-' -h-1 

其它说明:
    该Sql语句可做相应的调整,以适应Xml格式:
方式一:
SELECT 123 AS Tag,
 0 As Parent,
  omfid   As [eachObj!123!objId!element],
  rtrim(omfname)   As [eachObj!123!objName!element],
 rtrim(omfdesc)   As [eachObj!123!objDesc!element],
  rtrim(omfkeyword)   As [eachObj!123!objKey!element],
  rtrim(omfremark)   As [eachObj!123!objRem!element]
 
FROM acmomf
where omfname like '%test%'
FOR XML explicit

方式二:
    SELECT top 1000 '<eachObj>','<objId>' + omfid + '</objId>' ,rtrim('<objName>' + rtrim(omfname) + '</objName>'),'<objDesc>' + rtrim(omfdesc) + '</objDesc>' ,'<objKey>' + rtrim(omfkeyword) + '</objKey>' ,'<objRem>' + rtrim(omfremark) + '</objRem>','</eachObj>' from acmomf

补充说明:
    1. 使用osql命令,无法将最后的(1000 rows affected)不显示。
    2.无法改变栏位与栏位间的空格,默认以该栏位的最大长度为准(估计是SQL Server 为了模拟表格的显示)
    3.Osql和For xml explicit的具体用法,请参照SQL Server的帮助

再补充说明:
在DTS设计器中,如果将一个表的内容导出到文本文件中,其默认的字段长度都是256. 而直接通过DTS向导是不会有这种问题发生。
这样就可能产生这种情况: 表的字段长度是nvarchar(2000),导出来之后就被截成nvarchar(256)

另外在DTS编辑器中, 即使你把它改为了nvarchar(2000),也一定要记得勾选"Binary"选项


【最后再补充】
osql其实不是用在这的, 使用DTS的编辑器,可以实现强大的功能:) 
但在2005之后, 我觉得Biztalk应该采用的是类似DTS的思路设计的:) 

posted on 2005-03-07 20:28  袁礼定  阅读(1379)  评论(0编辑  收藏  举报