0

我对在 SQL 查询中使用参数感到有些困惑,并且看到了一些我无法立即解释的事情,所以我现在只是在了解一些背景信息。

首先,查询中的参数名称是否有标准格式,或者这个数据库/中间件是否依赖?这两个我都看过:-

DELETE * FROM @tablename    

和...

DELETE * FROM :tablename

第二 - 参数替换发生在哪里(通常)?是在查询发送到数据库之前替换/扩展参数,还是数据库单独接收参数和查询,并自行执行扩展?

作为背景,我正在使用来自 C++Builder 应用程序的 DevArt UniDAC 工具包通过 ODBC 连接到 Excel 电子表格。我知道这在某些方面几乎是微不足道的......(我试图理解为什么一个特定的命令只有在它使用参数时才有效)

4

3 回答 3

2

使用此类数据访问库(例如UniDACFireDAC),您可以使用宏。它们允许您在不允许使用参数的 SQL 命令的位置使用特殊标记(称为宏)。我不知道 UniDAC API,但会为 FireDAC 提供一个示例:

ADQuery1.SQL.Text := 'DELETE * FROM &tablename';
ADQuery1.MacroByName('tablename').AsRaw := 'MyTab';
ADQuery1.ExecSQL;
于 2013-05-21T03:53:45.303 回答
1

第二 - 参数替换发生在哪里(通常)?

它没有。这就是重点。查询中的数据元素保留数据项。代码元素保留代码元素。两者永远不会相交,因此恶意数据永远不会被视为代码。

通过 ODBC 连接到 Excel 电子表格...我试图了解为什么特定命令仅在不使用参数时才有效

Excel 并不是真正的数据库引擎,但如果是,您仍然不能使用参数来命名表。

于 2013-05-21T04:02:15.673 回答
0

SQL 参数被发送到数据库。数据库自己执行扩展。这允许数据库设置一个查询计划,该计划将适用于不同的参数值。

Microsoft 始终使用@parnamefor 参数。甲骨文使用:parname. 其他数据库不同。

据我所知,没有数据库允许您将表名指定为参数。您必须扩展该客户端,例如:

command.CommandText = string.Format("DELETE FROM {0}", tableName);

PS A*后不允许DELETE。毕竟,您只能删除整行,而不是一组列。

于 2013-05-20T10:27:26.623 回答