python - 将 Python 列表传递给 SQL Server 查询的 ORDER BY 子句
问题描述
我正在尝试将 python 列表传递给 SQL Server 查询。我遇到了 pyobdc 错误。
我尝试了以下方法:
# order_by is a list with 80 strings e.g. ['a','b','c', ...]
placeholders = ", ".join(["?"] * len(order_by))
query = """
SELECT *
FROM my_table_name
ORDER BY (""" + placeholders + ")"
cursor.execute(query, order_by)
它给了我一个pyodbc错误:
',' 附近的语法不正确。(102)
我不知道我在哪里犯了语法错误
解决方案
查询参数仅用于传递列值,而不是列名。在需要动态包含对象名称的情况下,您需要使用动态 SQL(字符串替换),例如,如下所示:
schema_name = 'dbo'
table_name = 'Donor'
sql = """\
SELECT QUOTENAME(COLUMN_NAME)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA=? AND TABLE_NAME=?
ORDER BY ORDINAL_POSITION
"""
crsr.execute(sql, schema_name, table_name)
columns = ', '.join([x[0] for x in crsr.fetchall()])
sql = f"SELECT * FROM [{schema_name}].[{table_name}] ORDER BY {columns}"
print(sql)
# SELECT * FROM [dbo].[Donor] ORDER BY [id], [last_name], [first_name]
推荐阅读
- android - 如何从android Fragmengt获取列表或元素?
- delphi - 哪个 Indy TIdHTTPServer 代码负责 SSL 版本和密码的服务器端检查?
- javascript - 尝试通过单击按钮更改背景颜色
- android - Dagger 2 会在从 Android 层移除的纯 Kotlin 模块中工作吗?
- python - 如何在 pandas DataFrame 上动态添加同名的列?
- mongodb - 使用 MongoDB 的产品目录 - 价格模型
- ios - 如何修复“此编码器仅对采用 NSSecureCoding 的对象进行编码(对象属于 '_SwiftValue' 类)。” Crashlytics 崩溃
- c++ - Friend 函数无法访问私有成员变量
- javascript - 通过javascript(或jquery)发送多个表单数据
- c# - 如何检查对象的多个属性是否有价值