如何在不使用 %s 的情况下安全动态地设置查询中的列名?

How can I safely and dynamically set column names in a query without using %s?

我正在为同事制作一个脚本,以便能够从 SQL 服务器数据库生成报告。我正在使用 pymssql 来管理与数据库的连接。

我的问题是我希望使用脚本的人能够指定他们想要返回的列,以及他们需要的日期范围。

我正在使用这段代码,但列名不起作用(据我所知,它们被转义了,这是问题的一部分)VS 键入它们。

if len(columns) == 1:
    query = "SELECT %s FROM dbo.tblPayments WHERE %s < dbo.tblPayments.fldPayDate AND dbo.tblPayments.fldPayDate > %s;"
else:
    query = "SELECT " + ("%s, " * (len(columns) - 1)) + "%s FROM dbo.tblPayments WHERE %s <= dbo.tblPayments.fldPayDate AND dbo.tblPayments.fldPayDate >= %s;"

我看到有人说要使用 .format() 的字符串连接,但如果可以避免的话,我不想插入安全风险。有什么我想念的吗?我该怎么做才能确保安全?

谢谢

您可以使用 sys.columns 视图找到某个 table 的所有列。首先获取列表并使用此结果验证应用程序中的用户输入。如果找到该列,您可以使用它来构建 query 字符串。

SELECT c.name
FROM sys.columns c
WHERE OBJECT_SCHEMA_NAME ( c.object_id) ='dbo'
AND OBJECT_NAME(c.object_id) = 'tblPayments'