【问题标题】:pypyodbc error 'Associated statement is not prepared'pypyodbc 错误“未准备关联语句”
【发布时间】:2019-06-19 18:47:23
【问题描述】:

我正在尝试为 pypyodbc SQL Server 创建一个“upsert”函数。我已经验证建立的查询将在 SSMS 中运行并获得所需的结果,但是当尝试使用 pypyodbc 执行和提交时,我收到以下错误:'HY007', '[HY007] [Microsoft][ ODBC SQL Server Driver]关联语句未准备好'

这里是 upsert 函数:

def sql_upsert(sql_connection, table, key_field, key_value, **kwargs):
    keys = ["{key}".format(key=k) for k in kwargs]
    values = ["'{value}'".format(value=v) for v in kwargs.values()]
    update_columns = ["{key} = '{value}'".format(key=k, value=v) for k, v in kwargs.items()]
    sql = list()

    #update
    sql.append("UPDATE {table} SET ".format(table=table))
    sql.append(", ".join(update_columns))
    sql.append(" WHERE {} = '{}'".format(key_field, key_value))
    sql.append(" IF @@ROWCOUNT=0 BEGIN ")

    # insert
    sql.append("INSERT INTO {table} (".format(table=table))
    sql.append(", ".join(keys))
    sql.append(") VALUES (")
    sql.append(", ".join(values))
    sql.append(")")

    sql.append(" END")
    query = "".join(sql)
    print(query)

该函数以基于此其他线程How to insert or update using single query? 的格式构建查询字符串

这是一个输出示例:

更新测试集名称='john' WHERE id=3012

如果@@ROWCOUNT=0 开始

INSERT INTO test(name) VALUES('john')

结束

【问题讨论】:

    标签: python sql pypyodbc


    【解决方案1】:

    您引用的错误消息是由作为 Windows 一部分提供的古老的“SQL Server”ODBC 驱动程序产生的。更新的驱动程序版本,如“ODB​​C Driver 17 for SQL Server”应该会产生有意义的错误消息。

    【讨论】:

    • 感谢上帝。我更新到 2017 ODBC 驱动程序并收到更有意义的 SQL Server 错误消息。原来是一个简单的权限错误。
    【解决方案2】:

    如果您查看herehere,您会看到人们在十多年前就对此有所抱怨。

    显然,当您执行两个由于字段值太长或可能由于外键违规而失败的语句时,SQL Server 的 ODBC 驱动程序会返回该错误。

    使用 SSMS 查看导致此问题的语句,或者更好 - 停止使用 ODBC 并使用pymssql

    【讨论】:

    • 感谢您的信息,我会考虑 pymssql。我确实采用了从我的函数生成的查询并将其直接插入到 SSMS 中,它执行得很好。我还运行了 SQL 跟踪以验证正在执行的查询将在 SQL Server 中运行。
    【解决方案3】:

    当您没有为存储过程提供正确的权限时,也可能会出现此错误 转到 SQL 服务器 --> 右键单击​​您的 sp--> 属性--> 权限 添加将执行此 sp 所需的用户和角色

    这可能有助于解决问题

    【讨论】:

      猜你喜欢
      • 2018-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-18
      • 1970-01-01
      • 2014-06-11
      • 1970-01-01
      相关资源
      最近更新 更多