pypyodbc 错误 'Associated statement is not prepared'
pypyodbc error 'Associated statement is not prepared'
我正在尝试为 pypyodbc SQL 服务器创建一个 'upsert' 函数。我已经验证建立的查询将在 SSMS 中 运行 并获得所需的结果,但是当尝试使用 pypyodbc 执行和提交时,我收到以下错误:'HY007', '[HY007] [Microsoft][ODBC SQL Server Driver]未准备相关语句'.
这是更新插入函数:
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
IF @@ROWCOUNT=0 开始
插入测试(名称)值('john')
结束
如果你看一下 here or here,你会发现人们在十多年前就抱怨过这个问题。
显然 SQL 服务器的 ODBC 驱动程序 returns 当您执行两个由于字段值太长或可能由于外键违规而失败的语句时出现该错误。
使用 SSMS 查看哪个语句导致此问题,或者更好 - 停止使用 ODBC 并使用 pymssql
您引用的错误消息是由作为 Windows 的一部分提供的古老 "SQL Server" ODBC 驱动程序生成的。像 "ODBC Driver 17 for SQL Server" 这样的更新的驱动程序版本应该会产生有意义的错误消息。
如果您没有为存储过程授予正确的权限,也可能会出现此错误
转到 SQL 服务器 --> 右键单击您的 sp-->properties-->permissions
添加将要执行此 sp
的所需用户和角色
这可能有助于解决问题
我正在尝试为 pypyodbc SQL 服务器创建一个 'upsert' 函数。我已经验证建立的查询将在 SSMS 中 运行 并获得所需的结果,但是当尝试使用 pypyodbc 执行和提交时,我收到以下错误:'HY007', '[HY007] [Microsoft][ODBC SQL Server Driver]未准备相关语句'.
这是更新插入函数:
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
IF @@ROWCOUNT=0 开始
插入测试(名称)值('john')
结束
如果你看一下 here or here,你会发现人们在十多年前就抱怨过这个问题。
显然 SQL 服务器的 ODBC 驱动程序 returns 当您执行两个由于字段值太长或可能由于外键违规而失败的语句时出现该错误。
使用 SSMS 查看哪个语句导致此问题,或者更好 - 停止使用 ODBC 并使用 pymssql
您引用的错误消息是由作为 Windows 的一部分提供的古老 "SQL Server" ODBC 驱动程序生成的。像 "ODBC Driver 17 for SQL Server" 这样的更新的驱动程序版本应该会产生有意义的错误消息。
如果您没有为存储过程授予正确的权限,也可能会出现此错误 转到 SQL 服务器 --> 右键单击您的 sp-->properties-->permissions 添加将要执行此 sp
的所需用户和角色这可能有助于解决问题