在运行时间构造的 SQL 语句
执行即席分析的应用程序通常在运行时生成 SQL 语句。 例如,电子表格可能允许用户选择要从中检索数据的列:
// SQL_Statements_Constructed_at_Run_Time.cpp
#include <windows.h>
#include <stdio.h>
#include <sqltypes.h>
int main() {
SQLCHAR *Statement = 0, *TableName = 0;
SQLCHAR **TableNamesArray, **ColumnNamesArray = 0;
BOOL *ColumnSelectedArray = 0;
BOOL CommaNeeded;
SQLSMALLINT i = 0, NumColumns = 0;
// Use SQLTables to build a list of tables (TableNamesArray[]). Let the
// user select a table and store the selected table in TableName.
// Use SQLColumns to build a list of the columns in the selected table
// (ColumnNamesArray). Set NumColumns to the number of columns in the
// table. Let the user select one or more columns and flag these columns
// in ColumnSelectedArray[].
// Build a SELECT statement from the selected columns.
CommaNeeded = FALSE;
Statement = (SQLCHAR*)malloc(8);
strcpy_s((char*)Statement, 8, "SELECT ");
for (i = 0 ; i = NumColumns ; i++) {
if (ColumnSelectedArray[i]) {
if (CommaNeeded)
strcat_s((char*)Statement, sizeof(Statement), ",");
else
CommaNeeded = TRUE;
strcat_s((char*)Statement, sizeof(Statement), (char*)ColumnNamesArray[i]);
}
}
strcat_s((char*)Statement, 15, " FROM ");
// strcat_s((char*)Statement, 100, (char*)TableName);
// Execute the statement . It will be executed once, do not prepare it.
// SQLExecDirect(hstmt, Statement, SQL_NTS);
}
通常在运行时构造 SQL 语句的另一类应用程序是应用程序开发环境。 但是,开发环境构造的语句在要生成的应用程序中进行硬编码,通常可以对这些语句进行优化和测试。
在运行时构造 SQL 语句的应用程序可以为用户提供极大的灵活性。 如前面的示例所示,这些应用程序甚至不支持 WHERE 子句、ORDER BY 子句或 join 等常见操作,在运行时构造 SQL 语句比硬编码语句要复杂得多。 此外,测试此类应用程序会出现问题,因为可以构造任意数量的 SQL 语句。
在运行时构造 SQL 语句的潜在缺点是构造语句所需的时间比使用硬编码语句要长得多。 幸运的是,很少出现这种问题。 这类应用程序往往是用户界面密集型的,与用户输入条件相比,应用程序构造 SQL 语句所花费的时间通常很短。