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

pyodbc连接SQL Server自动执行sys.sp_datatype_info_100问题咨询

pyodbc连接SQL Server时自动触发sys.sp_datatype_info_100的问题解答

问题确认

不少用pyodbc连接SQL Server的开发者都碰到过这个情况:pyodbc在建立连接阶段会自动调用sys.sp_datatype_info_100存储过程,这是ODBC驱动初始化的标准操作——驱动需要获取数据库支持的数据类型信息,用于后续的类型映射处理。

能否禁用该操作?

直接无法通过pyodbc配置禁用这个调用,因为这是ODBC驱动层面的行为,属于ODBC规范要求的初始化步骤之一。不过可以通过以下方式缓解长时运行的问题:

  • 优化存储过程执行性能:sys.sp_datatype_info_100依赖sys.spt_datatype_info_view视图,若执行缓慢,可让DBA更新相关系统视图的统计信息,或检查视图底层关联的系统表是否有合适的索引。
  • 复用数据库连接:避免频繁创建新连接,每次新建连接都会触发一次该存储过程调用。可在应用中使用连接池机制,重复使用已建立的连接,减少触发次数。
  • 升级ODBC驱动版本:确保使用最新版的ODBC Driver for SQL Server,微软会持续优化驱动的初始化逻辑,新版本可能提升该存储过程的执行效率。

附相关代码

sys.sp_datatype_info_100存储过程定义

create procedure sys.sp_datatype_info_100  (      
    @data_type int = 0,      
    @ODBCVer tinyint = 2  
)  as      
    declare @mintype int      
    declare @maxtype int        

    set @ODBCVer = isnull(@ODBCVer, 2)      
    if @ODBCVer < 3 -- includes ODBC 1.0 as well          
        set @ODBCVer = 2      
    else          
        set @ODBCVer = 3        

    if @data_type = 0      
    begin          
        select @mintype = -32768          
        select @maxtype = 32767      
    end      
    else      
    begin          
        select @mintype = @data_type          
        select @maxtype = @data_type      
    end        

    select          
        TYPE_NAME           = v.TYPE_NAME,          
        DATA_TYPE           = v.DATA_TYPE,          
        PRECISION           = v.PRECISION,          
        LITERAL_PREFIX      = v.LITERAL_PREFIX,          
        LITERAL_SUFFIX      = v.LITERAL_SUFFIX,          
        CREATE_PARAMS       = v.CREATE_PARAMS,          
        NULLABLE            = v.NULLABLE,          
        CASE_SENSITIVE      = v.CASE_SENSITIVE,          
        SEARCHABLE          = v.SEARCHABLE,          
        UNSIGNED_ATTRIBUTE  = v.UNSIGNED_ATTRIBUTE,          
        MONEY               = v.MONEY,          
        AUTO_INCREMENT      = v.AUTO_INCREMENT,          
        LOCAL_TYPE_NAME     = v.LOCAL_TYPE_NAME,          
        MINIMUM_SCALE       = v.MINIMUM_SCALE,          
        MAXIMUM_SCALE       = v.MAXIMUM_SCALE,          
        SQL_DATA_TYPE       = v.SQL_DATA_TYPE,          
        SQL_DATETIME_SUB    = v.SQL_DATETIME_SUB,          
        NUM_PREC_RADIX      = v.NUM_PREC_RADIX,          
        INTERVAL_PRECISION  = v.INTERVAL_PRECISION,          
        USERTYPE            = v.USERTYPE        

    from          
        sys.spt_datatype_info_view v        

    where          
        v.DATA_TYPE between @mintype and @maxtype and          
        v.ODBCVer = @ODBCVer        

    order by 2, 12, 11, 20  

pyodbc连接示例代码

import pyodbc

conn_string = "DRIVER={ODBC Driver 18 for SQL Server};SERVER=%SERVER%;DATABASE=%DATABASE%;Trusted_Connection=yes;MultiSubnetFailover=yes;TrustServerCertificate=yes;"
sql = "SELECT TOP 100 * FROM MY_DB"

conn = pyodbc.connect(conn_string)
cursor = conn.cursor()
cursor.execute(sql)
res = cursor.fetchall()
cursor.close()
conn.close()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 14:21:22