pypyodbc错误“未准备关联的语句”

时间:2019-01-25 22:30:01

标签: python sql pypyodbc

我正在尝试为pypyodbc SQL Server创建一个'upsert'函数。我已经验证了构建的查询将在SSMS中运行并具有所需的结果,但是当尝试执行pypyodbc并提交时,出现以下错误: 'HY007','[HY007] [Microsoft] [ ODBC SQL Server驱动程序]关联语句未准备好'

这是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?

来构建查询字符串,其格式为

以下是输出示例:

UPDATE test SET name ='john'WHERE id = 3012

如果@@ ROWCOUNT = 0开始

插入测试(名称)值('john')

END

3 个答案:

答案 0 :(得分:2)

您引用的错误消息是由Windows附带的古老的“ SQL Server” ODBC驱动程序产生的。像“ SQL Server ODBC驱动程序17”这样的最新驱动程序版本会产生有意义的错误消息。

答案 1 :(得分:0)

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

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

使用SSMS查看哪个语句导致了此问题,或更妙的是-停止使用ODBC并使用pymssql

答案 2 :(得分:0)

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

这可能有助于解决问题