將查詢結果導出到CSV文件並標准化數據格式


  在成產環境中,經常會有各種出report的需求,可以在數據庫中將需要的信息查詢出來,然后生成csv文件,定期使用郵件發出

  本例將講解兩種將查詢結果導出到Excel的方法:

  1.SQLCMD

  使用SQLCMD簡單方便:

  關於SQLCMD的參數介紹,可以參考官方文檔:

  https://docs.microsoft.com/zh-cn/sql/tools/sqlcmd-utility?view=sql-server-2017

  在CMD中執行以下語句即可:

  CMD:sqlcmd -S VWBJVWTSQLT1165 -E -Q "select * from [Score_Analysis].[dbo].[Temp_XPF] order by id desc" -o"D:\BI_Test\1.csv" -s"," -W

  -E是信任連接,使用該參數就不用輸入賬號密碼, -Q是執行查詢並退出, -s是分隔符,-s","是指將查詢結果按照","來分隔,這樣才會在Excel中顯示為分列的結果,

-W是指在結果中將字符后面的空格都刪掉,-o是指輸出到文件,本例將查詢結果輸出到csv文件。

  如果查詢語句比較復雜,可以將查詢語句保存在.sql文件中,比如test.sql,然后將-Q參數替換成-i,輸入該文件:

  -Q "select * from [Score_Analysis].[dbo].[Temp_XPF] order by id desc"——> -i "test.sql"

  

  2.BCP命令在SSMS中實現:

  1>.在實例中打開xp_cmdshell:

  EXEC sp_configure 'show advanced options', 1; 

  GO 

  EXEC sp_configure 'xp_cmdshell', 1; 

  GO 

  RECONFIGURE; 

  GO 

 

  2>.BCP查詢出的結果不帶表頭,所以需要將表頭插入到表的數據中,故此先創建一個存數據的表,將需要查詢的數據放入該表中,將表頭信息插入該表,然后以后每次都刪除除了表頭信息行的其它數據,然后進行插入:

  比如要查詢的信息是:select id,tenantid,name,displayname,CreationTime from [JustMeeting].[dbo].[AbpRoles] 

  

 

   此時建立一個新表用來存放要查詢的信息:

Create table [Score_Analysis].[dbo].[Temp_XPF]

(

id varchar(100),

tenantid varchar(100),

name varchar(100),

displayname varchar(100),

CreationTime varchar(100),

)  

  將表頭信息先插入該表:

insert into [Score_Analysis].[dbo].[Temp_XPF] values('id','tenantid','name','displayname','CreationTime')

  以上步驟只執行一次,在之后的工作中,可以用Job重復執行后面的步驟,就可以每次查詢最新的數據,並導出到按時間格式命名的csv文件中。

  

  3>此步驟和步驟4可以放入Job中定期執行

  每次查詢最新數據前刪除掉舊數據,但是保留表頭:

delete from [Score_Analysis].[dbo].[Temp_XPF] where id <> 'id'

  然后插入新數據:

insert into [Score_Analysis].[dbo].[Temp_XPF] select convert(varchar(100),id) as id, convert(varchar(100),tenantid) as tenantid, convert(varchar(100),name) as name,

 convert(varchar(100),displayname) as displayname, convert(varchar(100),CreationTime) as CreationTime  from [JustMeeting].[dbo].[AbpRoles]  where id>3

  

  4>.使用動態語句,定義文件名字以日期命名,拼接處BCP命令,導出csv文件:

declare @sql varchar(1000),@date varchar(100)

declare @filepath varchar(100)

set @date=replace(convert(varchar,getdate(),23),'-','')  --定義日期格式為20190101格式

set @filepath='D:\BI_Test\DPMReport_'+@date+'.csv'  --定義文件名使用日期表示的DPMReport_20190101.csv

set @sql='exec master..xp_cmdshell '+ '''bcp "select * from [Score_Analysis].[dbo].[Temp_XPF] order by CreationTime" queryout '+@filepath+' -c -t "," -T'''

--print(@sql)

exec (@sql)

 

bcp命令最后由動態語句生成為:exec master..xp_cmdshell 'bcp "select * from [Score_Analysis].[dbo].[Temp_XPF] order by CreationTime" queryout D:\BI_Test\DPMReport_20190916.csv -c -t "," -E -T'
bcp參數可以參考https://docs.microsoft.com/zh-cn/sql/tools/bcp-utility?view=sql-server-2017
-T是指可信任連接,-c是指指定字符數據類型來執行該操作,-t指定字段終止符,在此用逗號將字段分開放入csv的每列中

 

歡迎留言討論~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM