我有一个相对简单的任务,即查询SQL Server数据库并将结果放入pandas数据框。但是,我遇到了一些我找不到的问题。
我希望有人可以指出这一点,而不是依赖于数据。
考虑以下SQL查询:
SELECT tb2.DatasetID, tb2.score1, tb2.score2, tb2.score3, tb2.score4, tb2.score5
FROM Meta AS tb1
INNER JOIN Scores AS tb2 ON tb2.DatasetID = tb1.DatasetID
WHERE tb1.StudyNumber = 217139
AND tb1.StudyDescription LIKE '%|55184|%'
带有两组过滤器
StudyNumber = 217139, StudyDescription ~ 55184
==>返回1行StudyNumber = 277145, StudyDescription ~ 55296
==>返回2行直接在SQL Server Management Studio中运行这些查询可为过滤器1提供1行结果,为过滤器2提供2行结果。我对所有三行的结果进行了快速比较,本质上看起来很相似。因此,我排除了数据方面的问题。
现在,通过Python代码执行相同的操作。下面的代码段将处理查询。对于预期结果为1行的过滤器集1来说,它工作正常。
import numpy as np
import pandas as pd
import json
import pyodbc
connStr = 'Driver=%s; Server=%s;Database=%s;UID=%s; PWD=%s' %(...) # Omitted Credentials
conn = pyodbc.connect(connStr)
dbCursor = conn.cursor()
q = "SELECT tb2.DatasetID, tb2.score1, tb2.score2, tb2.score3, tb2.score4, tb2.score5
FROM Meta as tb1
INNER JOIN Scores as tb2
ON tb2.DatasetID=tb1.DatasetID
WHERE tb1.StudyNumber=?and tb1.StudyDescription like ? "
# ----------------------
# Setting Filters
# ----------------------
# Filter Set 1
study_number= 217139
study_desc = 55184
# Filter Set 2
# study_number= 277145
# study_desc = 55296
# ----------------------
param = f'%|{study_desc}|%'
df = pd.read_sql(q, conn, params={study_number, param}, coerce_float=False)
print('Query Completed!')
但是,使用过滤器集2(请参见上文)运行代码,将引发以下我不清楚的错误。我尝试了没有解析度的驱动程序13和17。
在SQL'...'上执行失败:('42000','[42000] [Microsoft] [ODBC [SQL Server驱动程序13] [SQL Server]转换数据类型时出错 从nvarchar到bigint。 (8114)(SQLExecDirectW)')
足够有趣的是,如果我用以下方法替换最后一行中的pd.read_sql
,则任何一个过滤器集都不会产生错误。
dbCursor.execute(q, study_number, param)
df = pd.DataFrame(dbCursor.fetchall())