【问题标题】:Python Pyodbc SQL Server Returns 'NoneType'Python Pyodbc SQL Server 返回“NoneType”
【发布时间】:2021-05-13 11:11:45
【问题描述】:

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', '用于 SQL Server 的 ODBC 驱动程序 13', '用于 SQL Server 的 ODBC 驱动程序 17']

关于返回 None 记录的原因以及如何解决的任何想法?

【问题讨论】:

标签: python sql-server pandas sqlalchemy pyodbc


【解决方案1】:

以下工作在我的最后。 (注意参数的使用。)

import pyodbc
import pandas as pd

MSSQL = {
        "database": "***",
        "password": "***",
        "server": "***",
        "user": "***"
    }
    
SQL = 'EXEC dbo.delete_me @lat = ?, @lon = ?, @InvoiceNumber = ?'

def get_connection(server, database, user, password):
    cs = f'DRIVER={{ODBC Driver 17 for SQL Server}};SERVER={server};DATABASE={database};UID={user};PWD={password}'

    return pyodbc.connect(cs)

if __name__ == '__main__':
    with get_connection(**MSSQL) as conn:
        df = pd.read_sql(SQL, conn, params=(43.6010067, -79.6838868, 123456))
        
    print(df)

dbo.delete_me 定义为

create procedure [dbo].[delete_me]

    @lat decimal(18,12)
    ,
    @lon decimal(18,12)
    ,
    @InvoiceNumber nvarchar(15)

as

begin

    set nocount on;
    select @lat as latitude, @lon as longitude, @InvoiceNumber as invoice

end

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

【讨论】:

    【解决方案2】:

    sql 脚本不包含“set no count on;”在执行之前添加此行时,它起作用了。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多