我正在尝试为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
答案 0 :(得分:2)
您引用的错误消息是由Windows附带的古老的“ SQL Server” ODBC驱动程序产生的。像“ SQL Server ODBC驱动程序17”这样的最新驱动程序版本会产生有意义的错误消息。
答案 1 :(得分:0)
如果您看着here或here,就会在十年前看到人们对此抱怨。
显然,当您执行两个由于字段值太长或可能由于外键冲突而失败的语句时,SQL Server的ODBC驱动程序将返回该错误。
使用SSMS查看哪个语句导致了此问题,或更妙的是-停止使用ODBC并使用pymssql
答案 2 :(得分:0)
当您没有为存储过程赋予正确的权限时,也可能会出现此错误 转到 SQL 服务器--> 右键单击您的 sp--> 属性--> 权限 添加将要执行此 sp 所需的用户和角色
这可能有助于解决问题