开发者问题收集

Python Pyodbc SQL Server 返回“NoneType”

2021-02-09
674

Pyodbc 返回 TypeError:'NoneType' 对象不可迭代。但是,当我将 sql f 字符串复制并粘贴到 sql server 中时,我得到了数百万条记录。

cnxn = pyodbc.connect('DRIVER={SQL Server};'
                           'SERVER=server;'
                           'DATABASE=db;')

sql=f"exec dbo.storedproc '{AdmitDate_Start}','{AdmitDate_End}','{RelativeStartDate}','{RelativeEndDate}'"
df=pd.read_sql(sql,cnxn)

我能够从同一位置(服务器和数据库)成功执行另一个存储过程。但是,该存储过程不需要我传递上述四个变量。我还尝试使用 Declare 创建 sql 语句并传入变量。 RelativeStartDate 和 RelativeEndDate 可以为空。

sql='''declare @AdmitDate_Start datetime = '''+"'"+ads+"'"+''';declare @AdmitDate_End datetime = '''+"'"+ade+"'"+''';declare @RelativeStartDate VARCHAR(20);declare @RelativeEndDate VARCHAR(20);exec dbo.storedproc @AdmitDate_Start, @AdmitDate_End,@RelativeStartDate,@RelativeEndDate;'''

这在 python 中也返回了 0 条记录,但在 SQL Server 中运行良好。

这导致我尝试了几个不同的驱动程序,但这些驱动程序无法连接:

['SQL Server Native Client 11.0', 'ODBC Driver 13 for SQL Server', 'ODBC Driver 17 for SQL Server']

关于返回 None 记录的原因以及如何修复,您有什么想法吗?

2个回答

sql 脚本不包含“set no count on;”。在执行之前添加此行后,脚本便可正常运行。

sql=f"set no count on;exec dbo.storedproc '{AdmitDate_Start}','{AdmitDate_End}','{RelativeStartDate}','{RelativeEndDate}'"

dcrowley01
2021-02-10

在我最后,以下作品。 (请注意使用参数。)

464803082

其中dbo.delete_me定义为

476274630

设置无论如何,nocount on; 都不会影响python代码。

2021-02-09