用于参数化动态表的SQL查询

时间:2017-11-15 23:18:14

标签: sql sql-server tsql

我管理的一个产品团队有大量的查询,这些查询使用动态SQL查询在使用连接时注入表。虽然它有卫生处理,我试图完全删除动态sql。

有没有办法参数化表名? 我想到如何查询表格如下:

SELECT * FROM (SELECT DISTINCT Table_Name FROM INFORMATION_SCHEMA.Tables WHERE Table_Name = :queryParam)

这可能吗?

2 个答案:

答案 0 :(得分:0)

  

我正在尝试完全删除动态sql。

  • 如果没有Dynamic SQL,则无法执行此操作。
  

这可能吗?

  • 不,这是不可能的,你不能在SQL查询中参数化标识符。
  

为什么?

  • Variables 的图书在线页面中,Variables只能在表达式中使用,而不能代替object nameskeywords。要构建dynamic SQL语句,请使用EXECUTE

这是唯一的方法:

DECLARE @Column SysName = N'Table_Name',
        @Param NVARCHAR(128) = N'ParamValue';

DECLARE @SQL NVARCHAR(MAX)=N'SELECT *
                             FROM(
                                   SELECT '+ QUOTENAME(@Column) +
                                   'FROM INFORMATION_SCHEMA.Tables
                                    WHERE ' + QUOTENAME(@Column) + ' = @Param
                                 ) T';
EXECUTE sp_executesql @SQl,
                      N'@Param NVARCHAR(128)',
                      @Param;

答案 1 :(得分:0)

无法在SQL中“正确”阻止SQL注入,调用应用程序层应该在执行任何SQL语句之前执行此操作。

在应用程序代码中生成SQL时,使用ORM解决问题或构建代码以保护自己免受SQL注入。

这感觉就像一个经典的XY问题,试着退一步考虑你需要保护对SQL服务器本身的访问,而不是从“访问”SQL服务器之后清理所有内容。