You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用pyodbc从SQL Server数据库提取存储脚本

嘿,我懂你现在的处境——刚接触数据库,已经能靠pyodbc连上SQL Server查数据,但想把存储过程、函数、视图这些对象的原始SQL代码捞出来,又不想运行它们对吧?其实这事儿真的不难,SQL Server本身就给我们准备了系统视图来干这个,结合你已经会用的pyodbc分分钟搞定,我给你捋清楚:

核心逻辑:用SQL Server的系统对象拿定义

SQL Server把所有用户创建的对象(存储过程、函数、视图啥的)的完整定义代码,都存在sys.sql_modules这个系统视图里。再配合sys.objects视图,就能精准筛选你想要的对象类型,不用瞎猜。

先给你几个常用的查询语句

你可以直接在SSMS里跑这些语句测试效果,没问题了再嵌到Python脚本里:

提取所有存储过程的代码

SELECT 
    o.name AS procedure_name,
    m.definition AS procedure_code
FROM 
    sys.objects o
JOIN 
    sys.sql_modules m ON o.object_id = m.object_id
WHERE 
    o.type = 'P' -- 这里的'P'就是存储过程的类型标识
ORDER BY 
    o.name;

提取所有用户定义函数

函数分好几种类型,对应的标识也不一样:

  • FN:标量函数(返回单个值的那种)
  • IF:内联表值函数
  • TF:多语句表值函数
SELECT 
    o.name AS function_name,
    m.definition AS function_code,
    o.type_desc AS function_type -- 可以看看具体是哪种函数
FROM 
    sys.objects o
JOIN 
    sys.sql_modules m ON o.object_id = m.object_id
WHERE 
    o.type IN ('FN', 'IF', 'TF')
ORDER BY 
    o.name;

提取所有视图的代码

SELECT 
    o.name AS view_name,
    m.definition AS view_code
FROM 
    sys.objects o
JOIN 
    sys.sql_modules m ON o.object_id = m.object_id
WHERE 
    o.type = 'V' -- 'V'代表视图
ORDER BY 
    o.name;
把查询整合到Python脚本里

既然你已经会用pyodbc连接数据库了,那直接把上面的SQL嵌进去就行,我给你写个完整的示例,还加了保存到文件的功能,方便你备份:

import pyodbc

# 替换成你自己的数据库连接信息
conn_str = (
    r'DRIVER={ODBC Driver 17 for SQL Server};'
    r'SERVER=你的服务器名称;'
    r'DATABASE=要提取的数据库名;'
    r'UID=你的用户名;'
    r'PWD=你的密码;'
)

def get_object_definitions(query, object_label):
    try:
        # 用with语句自动管理连接和游标,不用手动关闭
        with pyodbc.connect(conn_str) as conn:
            cursor = conn.cursor()
            cursor.execute(query)
            
            # 获取结果的列名,方便后续转成字典
            column_names = [col[0] for col in cursor.description]
            # 把查询结果转成字典列表,看着更直观
            definitions = []
            for row in cursor.fetchall():
                definitions.append(dict(zip(column_names, row)))
            
            # 打印提取结果
            print(f"\n===== 成功提取到 {len(definitions)} 个{object_label} =====")
            for obj in definitions:
                print(f"\n{object_label}名称: {obj[column_names[0]]}")
                print(f"代码内容:\n{obj[column_names[1]]}")
                print("-" * 80)
            
            # 可选:把结果保存到本地SQL文件
            output_file = f"{object_label}_definitions.sql"
            with open(output_file, "w", encoding="utf-8") as f:
                for obj in definitions:
                    f.write(f"-- {object_label}: {obj[column_names[0]]}\n")
                    f.write(obj[column_names[1]] + "\n\n")
            print(f"\n所有{object_label}代码已保存到 {output_file}")
            
    except Exception as e:
        print(f"提取过程中出错啦: {str(e)}")

# 调用函数提取不同类型的对象
# 提取存储过程
proc_sql = """
SELECT 
    o.name AS procedure_name,
    m.definition AS procedure_code
FROM 
    sys.objects o
JOIN 
    sys.sql_modules m ON o.object_id = m.object_id
WHERE 
    o.type = 'P'
ORDER BY 
    o.name;
"""
get_object_definitions(proc_sql, "存储过程")

# 提取视图
view_sql = """
SELECT 
    o.name AS view_name,
    m.definition AS view_code
FROM 
    sys.objects o
JOIN 
    sys.sql_modules m ON o.object_id = m.object_id
WHERE 
    o.type = 'V'
ORDER BY 
    o.name;
"""
get_object_definitions(view_sql, "视图")

# 提取用户定义函数
func_sql = """
SELECT 
    o.name AS function_name,
    m.definition AS function_code,
    o.type_desc AS function_type
FROM 
    sys.objects o
JOIN 
    sys.sql_modules m ON o.object_id = m.object_id
WHERE 
    o.type IN ('FN', 'IF', 'TF')
ORDER BY 
    o.name;
"""
get_object_definitions(func_sql, "用户定义函数")
几个要注意的小细节
  • 要是你还想提取触发器,把查询里的o.type改成TR就行;
  • 确保你的数据库账号有VIEW DEFINITION权限,不然可能查不到内容(管理员账号一般都有,普通账号得找DBA授权);
  • ODBC驱动版本可以根据你的环境调整,比如你的服务器比较老,可能得用ODBC Driver 11 for SQL Server;
  • sys.sql_modules里的definition字段返回的是完整的创建代码,包括CREATE PROCEDURE/CREATE VIEW这些开头,直接就能用。

内容的提问来源于stack exchange,提问作者jharrison12

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:21:06