遇到一個尷尬的問題,SSMS的GridView對於大字段的(varchar(max),text之類的),支持不太友好的,
超過8000個長度以外的字符,SSMS的表格是顯示不出來的(固然也就看不到了),也是沒法直接導出來的(超過8000個以外的字符的)
這種問題在別人遇到來求助的時候,是不可忍受的,因而快速用Python寫了一個導出數據到Excel的功能,
最主要的是能夠導出大字段的內容,且方便簡潔,人畜無害,綠色環保,不太喜歡SSMS那種下一步下一步……的操做。那些在SSMS中沒法顯示出來的字段,這下能夠顯出原形了。
python
1,必選參數是服務器地址和sql語句,若是sql語句沒有帶庫名的話,那麼必須傳入數據庫的名字,不然默認是master庫,所以sql儘可能帶庫名吧
2,導出路徑是C:\Windows\Temp\,導出完成後自動打開,方便查看,另存
3,根據sql語句,導出完成的查詢結果,第一行是字段名,其他是查詢結果
4,依賴於xlsxwriter這個包
5,沒有太嚴格的參數校驗以及數據庫帳號密碼支持,有須要的本身改造sql
import os import re import time import pymssql import xlsxwriter import argparse def get_data_from_db(host='127.0.0.1',server='mssql',port=1433,database='master',sql_stament=''): conn = pymssql.connect(host=host, server=server,port=port, database=database,as_dict=True, autocommit=True) cursor = conn.cursor() # 簡單的判斷,別尼瑪執行了truncate啥的 if len(sql_statment)<6 or not (re.match(r'^select',sql_statment.lstrip())): print('sql statment is error,exit……') exit(1) try: cursor.execute(sql_stament) result = cursor.fetchall() except: raise finally: cursor.close() conn.close() return result def export_to_excel(result): current_time = time.strftime("%Y%m%d%H%M%S", time.localtime()) workbook = xlsxwriter.Workbook('C:\\Windows\\Temp\\'+current_time+'_temp.xlsx') worksheet = workbook.add_worksheet("sheet1") # head row col = 0 for key in result[0].keys(): worksheet.write(0, col, key) col = col+1 # data row row = 1 col = 0 for dict in result: for key in dict: worksheet.write(row, col, str(dict[key])) col = col + 1 col = 0 row += 1 workbook.close() os.startfile('C:\\Windows\\Temp\\'+current_time+'_temp.xlsx') if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("--host",required=True, type=str,help="host name or ip") parser.add_argument("--db",required=False, type=str,help="database name") parser.add_argument("--sql", required=True, type=str, help="sql statment") args = parser.parse_args() host = args.host database = args.db if not database: database='master' sql_statment = args.sql print('executing sql……') result = get_data_from_db(host = host,database = database,sql_stament =sql_statment) print('exporting data……') export_to_excel(result) # example # python export_data_to_excel.py --host "127.0.0.1" --sql "select * from tempdb.dbo.Test"
在10W級別如下,速度仍是能夠的,這是個demo數據庫