在成產環境中,經常會有各種出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的每列中
歡迎留言討論~