SQL 服务器:列名而不是值的参数

SQL Server : parameters for column names instead of values

这似乎是一个愚蠢的问题,但令我惊讶的是我还没有找到明确的答案:

是否可以使用 SQL 服务器参数来编写具有动态列名称(和 table 名称)的查询,或者是否只需要非常仔细地清理输入?

情况是 tables 及其列名(和列数)是动态生成的,无法事先知道手动编写查询。由于 tables & 列未知,我不能使用 ORM,所以我求助于手动查询。通常我会使用参数来填充值以防止 SQL 注入,但是我很确定在指定 table 名称 and/or 列名称时不能以相同的方式完成此操作。我想为插入、更新、更新插入和 select 创建通用查询,但我显然不想让自己面临潜在的注入。是否有关于如何安全完成此操作的最佳实践?

仅供参考 - 我确实看到了 this answer,但由于我无法事先知道列 / table 的名称,因此 case 语句可能不适用于这种情况。

环境:SQL Server 2014 通过 ADO.NET (.NET 4.5 / C#)

没有将 table 或列 引用 传递给过程的机制。您只需将它们作为字符串传递,然后使用动态 SQL 来构建您的查询。您必须采取预防措施以确保您的字符串参数有效。

执行此操作的一种方法是在构建 T-SQL 之前验证所有 table 和列引用字符串在 sys.tablessys.columns 中是否具有有效名称查询。然后你就可以确定它们可以安全使用了。

在使用 sp_executesql 过程时,您还可以将文字参数与动态 sql 一起使用。您不能使用它来验证您的 table 和列名,但它会验证并防止 SQL 注入您的其他参数。