在SQLServer里把SQL語句結果生成文本文件

字號:

在SQL Server里可以調用DOS下的命令行工具bcp來實現(xiàn)把表里的數(shù)據(jù)或者SQL語句結果生成文本文件。
    BCP命令的參數(shù)格式:
    BCP {dbtable | query} {in | out | queryout | format} datafile
    [-m maxerrors]      [-f formatfile]     [-e errfile]
    [-F firstrow]       [-L lastrow]       [-b batchsize]
    [-n native type]     [-c character type]   [-w wide character type]
    [-N keep non-text native] [-V file format version] [-q quoted identifier]
    [-C code page specifier] [-t field terminator]  [-r row terminator]
    [-i inputfile]      [-o outfile]       [-a packetsize]
    [-S server name]     [-U username]      [-P password]
    [-T trusted connection]  [-v version]       [-R regional enable]
    [-k keep null values]   [-E keep identity values]
    [-h "load hints"]
    但命令行下面的操作在傳遞變量上不太靈活,我參照 CSDN里鄒健寫File2Table的例子,
    寫了一個把SQL語句結果生成文本文件的系統(tǒng)存儲過程 sp_sql_query_to_file.sql:
    /***********************************************
    // 說明 : 根據(jù)SQL語句生成文本文件 (帶日期戳,字段用逗號,分隔)
    //   SQL語句里所有出現(xiàn)的表名要用 [數(shù)據(jù)庫名].[用戶名].[表名] 來詳細標記
    // 創(chuàng)建 : maggiefengyu 郵件 : maggiefengyu@tom.com 日期 :2006-03-03
    **********************************************/
    create PROCEDURE sp_sql_query_to_file(
    @servername varchar(50), --服務器名
    @username varchar(50), --用戶名,如果用NT驗證方式,則為空’’
    @password varchar(50) , --密碼
    @sql_query varchar(2000) , --SQL查詢語句,有字符條件時用單引號
    @filePath_name varchar(1000), --導出路徑和文件名
    @date datetime --保存文件時的生成日期戳
    )AS
    DECLARE @sql varchar(8000)
    SET @sql=’bcp "’+@sql_query + ’" queryout ’+’ "’+@filePath_name+’_’+
    convert(varchar(12),@date,112)+’.txt " /t "," /w’
    +’ /S ’+@servername
    +CASE WHEN ISNULL(@username,’’)=’’ THEN ’’ ELSE ’ /U ’+@username END
    +’ /P ’+ISNULL(@password,’’) 
    select @sql 
    EXEC master..xp_cmdshell @sql
    IF @@Error<>0 BEGIN
    print ’生成文件時出錯了,請查看!’+@@Error
    END
    GO
    調用方法舉例:
    DECLARE @dt datetime
    DECLARE @sql_query varchar(6000)
    set @dt=getdate()
    set @sql_query=’select convert(varchar,orderdate,120),’+
    ’convert(varchar,requireddate,120),’+
    ’convert(varchar,shippeddate,120),’+
    ’shipcountry from northwind.dbo.orders ’+
    ’where orderdate    select len(@sql_query)
    EXEC sp_sql_query_to_file ’192.168.0.2’,’select_user’,’select_user_pwd’,@sql_query,’e:yuorders’,@dt
    要注意的是:SQL語句里所有出現(xiàn)的表名要用 [數(shù)據(jù)庫名].[用戶名].[表名] 來詳細標記