首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >熊猫+ pyodbc ODBC ODBC SQL type -150还不支持

熊猫+ pyodbc ODBC ODBC SQL type -150还不支持
EN

Stack Overflow用户
提问于 2017-08-14 14:55:58
回答 2查看 3.3K关注 0票数 6

我知道这方面有很多主题,但我认为这是非常具体的。我得到当前用于审计的代码:

代码语言:javascript
复制
import pandas as pd
import pyodbc

query = """
--Top 50 high total CPU Queries
SELECT TOP 50
'High CPU Queries' as Type,
serverproperty('machinename') as 'Server Name',
isnull(serverproperty('instancename'),serverproperty('machinename')) as 'Instance Name',
        COALESCE(DB_NAME(qt.dbid),
        DB_NAME(CAST(pa.value as int)), 
        'Resource') AS DBNAME,
    qs.execution_count as [Execution Count],
    qs.total_worker_time/1000 as [Total CPU Time],
    (qs.total_worker_time/1000)/qs.execution_count as [Avg CPU Time],
    qs.total_elapsed_time/1000 as [Total Duration],
    (qs.total_elapsed_time/1000)/qs.execution_count as [Avg Duration],
    qs.total_physical_reads as [Total Physical Reads],
    qs.total_physical_reads/qs.execution_count as [Avg Physical Reads],
    qs.total_logical_reads as [Total Logical Reads],
    qs.total_logical_reads/qs.execution_count as [Avg Logical Reads],
SUBSTRING(qt.text,qs.statement_start_offset/2, 
        (case when qs.statement_end_offset = -1 
        then len(convert(nvarchar(max), qt.text)) * 2 
        else qs.statement_end_offset end -qs.statement_start_offset)/2)
        as query_text     
    FROM sys.dm_exec_query_stats qs
    cross apply sys.dm_exec_sql_text(qs.sql_handle) as qt
    outer apply sys.dm_exec_query_plan (qs.plan_handle) qp
    outer APPLY sys.dm_exec_plan_attributes(qs.plan_handle) pa
    where attribute = 'dbid'   
    ORDER BY 
        [Total CPU Time] DESC
"""
cnxn = pyodbc.connect('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx')
cnxn.execute(query).fetchall()
cnxn.close()

我得到以下错误:

cnxn.execute(sql\_status\_20).fetchall() Traceback (most recent call last): File "", line 1, in pyodbc.ProgrammingError: ('ODBC SQL type -150 is not yet supported. column-index=1 type=-150', 'HY106')

有人能帮我处理这事吗?在使用日期的许多Server审计脚本中,我也遇到了同样的问题,而且我无法更改驱动程序,因为我的产品env中有各种SQL版本。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-14 16:29:57

如果很难将现有查询更改为显式转换或转换麻烦的值,则可以考虑尝试使用pyodbc 输出转换器功能。它使您能够定义一个Python函数,该函数将应用于为给定ODBC类型返回的原始字节。

例如,此测试代码在您描述的错误中失败:

代码语言:javascript
复制
import pyodbc

cnxn = pyodbc.connect('DSN=SQLmyDb', autocommit=True)
crsr = cnxn.cursor()

server_name = crsr.execute("SELECT SERVERPROPERTY('machinename')").fetchval()
print(server_name)

crsr.close()
cnxn.close()

但是在Python3下,这对我来说是正确的

代码语言:javascript
复制
import pyodbc


def handle_sql_variant_as_string(value):
    return value.decode('utf-16le')


cnxn = pyodbc.connect('DSN=SQLmyDb', autocommit=True)
crsr = cnxn.cursor()

cnxn.add_output_converter(-150, handle_sql_variant_as_string)
server_name = crsr.execute("SELECT SERVERPROPERTY('machinename')").fetchval()
print(server_name)

crsr.close()
cnxn.close()
票数 7
EN

Stack Overflow用户

发布于 2017-08-14 15:15:49

如果无法更改驱动程序,则需要更改查询以返回它支持的数据类型。

SQL 150是SQL_VARIANT,由SERVERPROPERTY返回。解决方法是将列显式地CAST为受支持的类型,如nvarchar

代码语言:javascript
复制
CAST(SERVERPROPERTY('machinename') AS nvarchar(100)) AS 'Server Name',
CAST(ISNULL(SERVERPROPERTY('instancename'),SERVERPROPERTY('machinename')) AS nvarchar(100)) AS 'Instance Name',
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45677374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档