Sintaxis SQL

Las cadenas de consulta SQL para Windows Installer están restringidas a los siguientes formatos.

Acción Consultar
Seleccionar un grupo de registros SELECT [DISTINCT]{column-list} FROM {table-list} [WHERE {operation-list}] [ORDER BY {column-list}]
Eliminar registros de una tabla DELETE FROM {table} [WHERE {operation-list}]
Modificar registros en una tabla UPDATE {table-list} SET {column}= {constant} [, {column}= {constant}][, ...] [WHERE {operation-list}]Las consultas UPDATE solo funcionan en columnas de clave no primarias.
Agregar registros a una tabla IINSERT INTO {table} ({column-list}) VALUES ({constant-list}) [TEMPORARY]Los datos binarios no se pueden insertar directamente en una tabla mediante las consultas INSERT INTO o UPDATE SQL. Para obtener más información, consulte Agregar datos binarios a una tabla mediante SQL.
Agregar una tabla CREATE TABLE {table} ( {column} {column type}) [HOLD]Los tipos de columna deben especificarse para cada columna al agregar una tabla. Se debe especificar al menos una columna de clave principal para la creación de una nueva tabla. Las posibles sustituciones de {column type} en la cadena anterior son: CHAR [( {size} )] | CHARACTER [( {size} )] | LONGCHAR | SHORT | INT | INTEGER | LONG | OBJECT [NOT NULL] [TEMPORARY] [LOCALIZABLE] [, column...][, ...] PRIMARY KEY column [, column][, ...].
Quitar una tabla DROP TABLE {table}
Adición de una columna ALTER TABLE {table} ADD {column} {column type}El tipo de columna debe especificarse al agregar una columna. Las posibles sustituciones de {column type} de la anterior cadena son: CHAR [( {size} )] | CHARACTER [( {size} )] | LONGCHAR | SHORT | INT | INTEGER | LONG | OBJECT [NOT NULL] [TEMPORARY] [LOCALIZABLE] [HOLD].
Mantener y liberar tablas temporales ALTER TABLE {table name} HOLDALTER TABLE {table name} FREE
El usuario puede usar los comandos HOLD y FREE para controlar el período de vida de una tabla temporal o una columna temporal. El recuento de suspensión de una tabla se incrementa para cada operación SQL HOLD en esa tabla y se reduce para cada operación SQL FREE de la tabla. Cuando se libera el último recuento de suspensión en una tabla, todas las columnas temporales dejan de estar accesibles. Si todas las columnas son temporales, la tabla deja de estar accesible.

 

Para obtener más información, vea Ejemplos de consultas de base de datos mediante SQL y script.

Gramática de SQL

Los parámetros opcionales se muestran entre corchetes: [ ]. Cuando se muestran varias opciones, los parámetros opcionales se separan mediante una barra vertical.

{constant} es una cadena o un entero. Una cadena debe ir entre comillas simples: "ejemplo". {constant-list} es una lista delimitada por comas de una o varias constantes.

La opción LOCALIZABLE establece un atributo de columna que indica que la columna debe localizarse.

{column} es una referencia en columnas a un valor en un campo de una tabla.

{marker} es una referencia de parámetro a un valor proporcionado por un registro enviado con la consulta. Se representa en la instrucción SQL mediante un signo de interrogación: ?. Para obtener información sobre el uso de parámetros, consulte la función MsiViewExecute o el método Execute.

La sintaxis SQL de Windows Installer no permite escapar comillas simples (valor ASCII 39) en un literal de cadena. Sin embargo, puede capturar o crear el registro, establecer el campo con la propiedad StringData o IntegerData y, a continuación, llamar al método Modify. Como alternativa, puede crear un registro y usar los marcadores de parámetros (?) descritos enel método Execute. También puede hacerlo mediante las funciones de base de datos MsiViewExecute, MsiRecordSetInteger y MsiRecordSetString.

Una cláusula WHERE {operation-list} es opcional y es una agrupación de operaciones que se usarán para filtrar la selección. Las operaciones deben ser de los siguientes tipos:

  • {column} = {column}
  • {column} = | <> | > | < | >= | <= {constant}
  • {column} = | <> | > | < | >= | <= {marker}
  • El valor de {column} es null
  • El valor de {column} no es NULL

En el caso de los valores de cadena, solo se pueden realizar las operaciones = o <>. Las comparaciones de valores de objeto se limitan a IS NULL e IS NOT NULL.

Las operaciones individuales se pueden agrupar por operadores AND u OR. La ordenación se puede imponer mediante paréntesis: ( ).

La cláusula ORDER BY es opcional y provoca un retraso inicial durante la ordenación. La ordenación por cadenas agrupará cadenas idénticas, pero no alfabéticamente las cadenas.

La cláusula DISTINCT es opcional y no repite registros idénticos en el conjunto de resultados devuelto.

{table-list} es una lista delimitada por comas de uno o varios nombres de tabla denominados {table} en la combinación.

{column-list} es una lista delimitada por comas de una o varias columnas de tabla a las que se hace referencia como {column} seleccionada. Las columnas ambiguas se pueden calificar aún más como {tablename.column}. Un asterisco se puede usar como una lista de columnas en una consulta SELECT para representar todas las columnas de las tablas a las que se hace referencia. Al hacer referencia a campos por posición de columna, seleccione las columnas por nombre en lugar de usar el asterisco. No se puede usar un asterisco como una lista de columnas en una consulta INSERT INTO.

Para escapar los nombres de tabla y los nombres de columna que coinciden con las palabras clave SQL, incluya el nombre entre dos acentos graves `` (valor ASCII 96). Si se debe escapar un nombre de columna y se califica como {tablename.column}, la tabla y la columna deben escaparse individualmente como {`tablename`.`column`}. Se recomienda que todos los nombres de tabla y los nombres de columna se escapen de esta manera para evitar conflictos con palabras reservadas y obtener un rendimiento significativo.

Los nombres de tabla están limitados a 31 caracteres. Para obtener más información, consulte Nombres de tabla. Los nombres de columna y tabla distinguen mayúsculas de minúsculas. Las palabras clave de SQL no distinguen mayúsculas de minúsculas.

El número máximo de expresiones de una cláusula WHERE de una consulta SQL se limita a 32.

Solo se admiten combinaciones internas y se especifican mediante una comparación de columnas de tablas diferentes. No se admiten combinaciones circulares. Una combinación circular es una consulta SQL que vincula tres o más tablas juntas en un circuito. Por ejemplo, lo siguiente es una combinación circular:

WHERE Table1.Field1=Table2.Field1 AND Table2.Field2=Table3.Field1 AND Table3.Field2=Table1.Field2.

Las columnas que forman parte de las claves principales de una tabla deben definirse primero en orden de prioridad, seguidas de cualquier columna de clave no primaria. Las columnas persistentes se deben definir antes de las columnas temporales. La secuencia de ordenación de una columna de texto no está definida; sin embargo, los valores de texto idénticos siempre se agrupan.

Tenga en cuenta que al agregar o crear una columna, debe especificar el tipo de columna.

Es posible que las tablas no contengan más de una columna de tipo "object".

El tamaño máximo que se puede especificar explícitamente para una columna de cadena en una consulta SQL es 255. Una columna de cadena de longitud infinita se representa como tener el tamaño 0. Para obtener más información, consulte Formato de definición de columna.

Para ejecutar cualquier instrucción SQL, se debe crear una vista. Sin embargo, una vista que no crea un conjunto de resultados, como CREATE TABLE o INSERT INTO; no se puede usar con MsiViewModify ni con el método Modify para actualizar las tablas a través de la vista.

Tenga en cuenta que no puede capturar un registro que contenga datos binarios de una base de datos y, a continuación, usar ese registro para insertar los datos en una base de datos completamente diferente. Para mover datos binarios de una base de datos a otra, debe exportar los datos a un archivo y, a continuación, importarlos en la nueva base de datos a través de una consulta y la función MsiRecordSetStream. Esto garantiza que cada base de datos tenga su propia copia de los datos binarios.