SQL Server:列名而不是值的参数

时间:2015-08-17 16:20:14

标签: sql-server tsql ado.net parameterized-query

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

是否可以使用SQL Server参数编写具有动态列名(和表名)的查询,或者输入是否需要非常仔细地进行清理?

情况是表及其列名(和列数)是动态生成的,并且无法事先知道手动编写查询。自从表格和列不知道我不能使用ORM,所以我采用手动查询。通常我会使用参数来填充值以防止SQL注入,但是我很确定在指定表名和/或列名时这不能以相同的方式完成。我想为insert,update,upsert和select创建通用查询,但我显然不希望自己打开潜在的注入。有关如何安全实现这一目标的最佳实践吗?

就像一个FYI - 我确实看到了this answer,但由于我无法预先知道列/表名,因此case语句可能不适用于这种情况。

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

1 个答案:

答案 0 :(得分:2)

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

执行此操作的一种方法是在构建T-SQL查询之前验证所有表和列引用字符串在class X { var x: Int } class Y: X { override var x: Int { get { ... } set { ... } } } sys.tables中是否具有有效名称。然后你可以确定它们可以安全使用。

使用sp_executesql过程时,您还可以使用动态sql的文字参数。您无法使用它来验证表名和列名,但它会使用您的其他参数验证并阻止SQL注入。