/*****************************************************************************
功能:导出表到TXT,含列名
版本:SQL2005以上
测试用例:
EXEC ExportToTxt '192.168.8.13','bms_ls..project','oa','oa','e:/ttt','|'
******************************************************************************/
IF OBJECT_ID('ExportToTxt')IS NOT NULL
DROP PROC ExportToTxt
go
CREATE PROC ExportToTxt
@servername varchar(100)='.', --数据源服务器IP
@TbName varchar(100), --格式:数据库..表名
@USER VARCHAR(100), --数据源用户名
@pwd VARCHAR(100), --密码
@path VARCHAR(100), --导出路径+文件名(不加扩展名) 注:导出后是服务器的路径,目前尚不支持网络共享路径
@ColSplit VARCHAR(10)='|' --列分隔符 如: |
AS
DECLARE @SQL VARCHAR(max),
@S varchar(max)
--1 导出列名进 #T
SET @S=ISNULL(@S,'')+'SELECT NAME
FROM '+LEFT(@TbName,CHARINDEX('.',@TbName)-1)+'.sys.columns
WHERE OBJECT_NAME(object_id)='''+RIGHT(@TbName,LEN(@TbName)-charindex('..',@TbName)-1)+''' ORDER BY column_id '
IF OBJECT_ID('TEMPDB..#T')IS NOT NULL
DROP TABLE #T;
CREATE TABLE #T(NAME VARCHAR(50))
INSERT #T EXEC(@S)
--2 导出列名 进 Txt1
SELECT @SQL=ISNULL(@SQL+@ColSplit,'')+NAME FROM #T
SET @S='BCP "SELECT '''''+@SQL+''''' " queryout '+@path+'1.txt -c' + ' -S"'+@servername +
case when isnull(@USER,'')='' then '' else '" -U"'+@USER end +
'" -P"'+isnull(@pwd,'')+'"'
print 'EXEC master..xp_cmdshell '''+@S+''''
EXEC('EXEC master..xp_cmdshell '''+@S+'''')
--3 导出列名 进 Txt2
SET @S='bcp "'+@TbName+'" out '+@path+'2.txt -c' + ' -S"'+@servername +
case when isnull(@USER,'')='' then '' else '" -U"'+@USER end +
'" -P"'+isnull(@pwd,'')+'"'+
+' -t"'+@ColSplit+'"'
EXEC('EXEC master..xp_cmdshell '''+@S+'''')
--4 合并Txt1、Txt2
SET @S='COPY /B '+@path+'1.TXT+'+@path+'2.TXT '+@path +'.TXT'
EXEC('EXEC master..xp_cmdshell '''+@S+'''')
--5 删除Txt1、Txt2
SET @S='EXEC master..xp_cmdshell ''DEL '+@path+'1.TXT'''
EXEC(@S)
SET @S='EXEC master..xp_cmdshell ''DEL '+@path+'2.TXT'''
EXEC(@S)
GO