Sdílet prostřednictvím


Příkazy SQL vytvořené za běhu

Aplikace, které provádějí ad hoc analýzu, často vytvářejí příkazy SQL za běhu. Tabulka může například uživateli umožnit vybrat sloupce, ze kterých se mají načítat data:

// 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);  
}  

Další třídou aplikací, které běžně vytváří příkazy SQL za běhu, jsou vývojová prostředí aplikací. Příkazy, které vytvářejí, jsou však pevně zakódované v aplikaci, kterou sestavují, kde je obvykle možné optimalizovat a testovat.

Aplikace, které sestavují příkazy SQL za běhu, můžou uživateli poskytnout obrovskou flexibilitu. Jak je vidět z předchozího příkladu, který ani nepodporuje takové běžné operace, jako jsou klauzule WHERE , klauzule ORDER BY nebo spojení, vytváření příkazů SQL za běhu je výrazně složitější než příkazy s pevným kódováním. Kromě toho je testování takových aplikací problematické, protože mohou vytvořit libovolný počet příkazů SQL.

Potenciální nevýhodou vytváření příkazů SQL za běhu je, že vytvoření příkazu trvá mnohem více času, než použití pevně zakódovaného příkazu. Naštěstí to bývá zřídka problémem. Takové aplikace mají tendenci být náročné na uživatelské rozhraní a doba, kdy aplikace tráví vytvářením příkazů SQL je obecně malá v porovnání s dobou, kdy uživatel stráví zadáváním kritérií.