我对使用SQL查询的参数感到有点困惑,看到一些我无法立即解释的事情,所以我现在只是在了解一些背景信息。
首先,查询中是否存在参数名称的标准格式,或者此数据库/中间件是否依赖?我已经看到了这两个: -
DELETE * FROM @tablename
和...
DELETE * FROM :tablename
第二 - 在哪里(通常)进行参数替换?在将查询发送到数据库之前是替换/扩展参数,还是数据库单独接收参数和查询,并自行执行扩展?
就像后台一样,我正在使用C ++ Builder应用程序中的DevArt UniDAC工具包通过ODBC连接到Excel电子表格。我知道这在几个方面几乎是悲观的...(我试图理解为什么特定命令仅在不使用参数时才起作用)
答案 0 :(得分:2)
使用此类数据访问库,例如UniDAC
或FireDAC
,您可以使用宏。它们允许您在SQL命令的位置使用特殊标记(称为宏),其中不允许参数。我不知道UniDAC API,但会为FireDAC提供一个示例:
ADQuery1.SQL.Text := 'DELETE * FROM &tablename';
ADQuery1.MacroByName('tablename').AsRaw := 'MyTab';
ADQuery1.ExecSQL;
答案 1 :(得分:1)
第二 - 在哪里(通常)进行参数替换?
没有。这就是重点。查询中的数据元素保留数据项。代码元素保留代码元素。两个从不相交,因此绝不会有恶意数据被视为代码的机会。
通过ODBC连接到Excel电子表格...我试图理解为什么特定命令只在不使用参数时才起作用
Excel实际上不是数据库引擎,但如果是,则仍然无法使用参数作为表名。
答案 2 :(得分:0)
将SQL参数发送到数据库。数据库本身执行扩展。这允许数据库设置一个查询计划,该计划将适用于不同的参数值。
Microsoft始终使用@parname
作为参数。 Oracle使用:parname
。其他数据库则不同。
我知道没有数据库允许您将表名指定为参数。您必须扩展该客户端,例如:
command.CommandText = string.Format("DELETE FROM {0}", tableName);
P.S。 *
后不允许DELETE
。毕竟,您只能删除整行,而不能删除一组列。