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
相关产品推荐
相关产品推荐

