专注,勤学,慎思。戒骄戒躁,谦虚谨慎

just do it

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

python快速导出sql语句(mssql)的查询结果到Excel,解决SSMS无法加载大字段的问题

 

遇到一个尴尬的问题,SSMS的GridView对于大字段的(varchar(max),text之类的),支持不太友好的,
超过8000个长度之外的字符,SSMS的表格是显示不出来的(当然也就看不到了),也是无法直接导出来的(超过8000个之外的字符的)
这种问题在别人遇到来求助的时候,是不可忍受的,于是快速用Python写了一个导出数据到Excel的功能,
最主要的是可以导出大字段的内容,且方便简洁,人畜无害,绿色环保,不太喜欢SSMS那种下一步下一步……的操作。那些在SSMS中无法显示出来的字段,这下可以显出原形了。

1,必选参数是服务器地址和sql语句,如果sql语句没有带库名的话,那么必须传入数据库的名字,否则默认是master库,因此sql尽量带库名吧
2,导出路径是C:\Windows\Temp\,导出完成后自动打开,方便查看,另存
3,根据sql语句,导出完成的查询结果,第一行是字段名,其余是查询结果
4,依赖于xlsxwriter这个包
5,没有太严格的参数校验以及数据库账号密码支持,有需要的自己改造

复制代码
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

 

posted on   MSSQL123  阅读(1595)  评论(0编辑  收藏  举报

编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
历史上的今天:
2016-09-26 SQL Server 通过重建方式还原 master 数据库
点击右上角即可分享
微信分享提示