Syntaxe SQL

Les chaînes de requête SQL pour Windows Installer sont limitées aux formats suivants.

Action Requête
Sélectionner un groupe d’enregistrements SELECT [DISTINCT]{liste-colonnes} FROM {liste-tables} [WHERE {liste-opérations}] [ORDER BY {liste-colonnes}]
Supprimer des enregistrements d’une table DELETE FROM {table} [WHERE {liste-opérations}]
Modifier des enregistrements existants dans une table UPDATE {liste-tables} SET {colonne}= {constante} [, {colonne}= {constante}][, ...] [WHERE {liste-opérations}] Les requêtes UPDATE fonctionnent uniquement sur les colonnes de clé non primaire.
Ajouter des enregistrements à une table INSERT INTO {table} ({liste-colonnes}) VALUES ({liste-constantes}) [TEMPORARY] Les données binaires ne peuvent pas être insérées dans une table directement à l’aide des requêtes INSERT INTO ou UPDATE SQL. Pour plus d’informations, consultez Ajout de données binaires à une table à l’aide de SQL.
Ajouter une table CREATE TABLE {table} ( {colonne} {type-colonne}) [HOLD] Les types de colonnes doivent être spécifiés pour chaque colonne lors de l’ajout d’une table. Au moins une colonne de clé primaire doit être spécifiée pour la création d’une table. Les substitutions possibles pour {type-colonne} dans ce qui précède sont : CHAR [( {size} )] | CHARACTER [( {size} )] | LONGCHAR | SHORT | INT | INTEGER | LONG | OBJECT [NOT NULL] [TEMPORARY] [LOCALIZABLE] [, column...][, ...] PRIMARY KEY column [, column][, ...].
Supprimer une table DROP TABLE {table}
Ajout d’une colonne ALTER TABLE {table} ADD {colonne} {type-colonne} Le type de colonne doit être spécifié lors de l’ajout d’une colonne. Les substitutions possibles pour {type-colonne} dans ce qui précède sont : CHAR [( {size} )] | CHARACTER [( {size} )] | LONGCHAR | SHORT | INT | INTEGER | LONG | OBJECT [NOT NULL] [TEMPORARY] [LOCALIZABLE] [HOLD].
Conserver et libérer des tables temporaires ALTER TABLE {nom table} HOLDALTER TABLE {nom table} FREE
L’utilisateur peut utiliser les commandes HOLD et FREE pour contrôler la durée de vie d’une table temporaire ou d’une colonne temporaire. Le nombre de conservations sur une table est incrémenté pour chaque opération SQL HOLD sur cette table et décrémenté pour chaque opération SQL FREE sur la table. Lorsque le dernier nombre de conservations est libéré sur une table, toutes les colonnes temporaires deviennent inaccessibles. Si toutes les colonnes sont temporaires, la table devient inaccessible.

 

Pour plus d’informations, consultez Exemples de requêtes de base de données à l’aide de SQL et de script.

Grammaire SQL

Les paramètres facultatifs sont affichés entre crochets [ ]. Lorsque plusieurs choix sont répertoriés, les paramètres facultatifs sont séparés par une barre verticale.

Une {constante} est une chaîne ou un entier. Une chaîne doit être placée entre guillemets simples ('exemple'). Une {liste-constantes} est une liste délimitée par des virgules d’une ou plusieurs constantes.

L’option LOCALIZABLE définit un attribut de colonne qui indique que la colonne doit être localisée.

Une {colonne} est une référence en colonne à une valeur dans un champ d’une table.

Un {marqueur} est une référence de paramètre à une valeur fournie par un enregistrement envoyé avec la requête. Il est représenté dans l’instruction SQL par un point d’interrogation ?. Pour plus d’informations sur l’utilisation des paramètres, consultez la fonction MsiViewExecute ou la méthode Execute.

La syntaxe SQL de Windows Installer ne prend pas en charge l’échappement de guillemets uniques (valeur ASCII 39) dans un littéral de chaîne. Toutefois, vous pouvez extraire ou créer l’enregistrement, définir le champ avec la propriété StringData ou IntegerData, puis appeler la méthode Modify. Vous pouvez également créer un enregistrement et utiliser les marqueurs de paramètres (?) décrits dans la méthode Execute. Vous pouvez également effectuer cette opération à l’aide des fonctions de base de données MsiViewExecute, MsiRecordSetInteger et MsiRecordSetString.

Une clause WHERE {list-opérations} est facultative et est un regroupement d’opérations à utiliser pour filtrer la sélection. Les opérations doivent être des types suivants :

  • {colonne} = {colonne}
  • {colonne} = | <> | > | < | >= | <= {constante}
  • {colonne} = | <> | > | < | >= | <= {marqueur}
  • {colonne} a la valeur Null
  • {colonne} n’a pas la valeur Null

Pour les valeurs de chaîne, seules les opérations = ou <> sont possibles. Les comparaisons de valeurs d’objet sont limitées à IS NULL et IS NOT NULL.

Les opérations individuelles peuvent être regroupées par des opérateurs AND ou OR. Le classement peut être imposé à l’aide de parenthèses ( ).

La clause ORDER BY est facultative et provoque un délai initial pendant le tri. Le tri par chaînes regroupe les chaînes identiques, mais ne permet pas d’alphabétiser les chaînes.

La clause DISTINCT est facultative et ne répète pas les enregistrements identiques dans le jeu de résultats retourné.

Une {list-tables} est une liste délimitée par des virgules d’un ou plusieurs noms de table appelés {table} dans la jointure.

Une {liste-colonne} est une liste délimitée par des virgules d’une ou plusieurs colonnes de table appelées {colonne} sélectionnées. Les colonnes ambiguës peuvent être qualifiées plus précisément en tant que {nomtable.colonne}. Un astérisque peut être utilisé comme liste de colonnes dans une requête SELECT pour représenter toutes les colonnes des tables référencées. Lorsque vous référencez des champs par position de colonne, sélectionnez les colonnes par nom au lieu d’utiliser l’astérisque. Un astérisque ne peut pas être utilisé comme liste de colonnes dans une requête INSERT INTO.

Pour échapper les noms de table et de colonnes qui entrent en conflit avec des mots clés SQL, placez le nom entre deux marques d’accentuation grave `` (valeur ASCII 96). Si un nom de colonne doit être placé dans une séquence d’échappement et qu’il est qualifié par {nomtable.colonne}, la table et la colonne doivent être placées dans une séquence d’échappement individuellement sous la forme {`tablename`.`column`}. Il est recommandé que tous les noms de tables et de colonnes soient placés dans une séquence d’échappement de cette façon pour éviter les conflits avec des mots réservés et gagner sensiblement en performances.

Les noms de table sont limités à 31 caractères. Pour plus d’informations, consultez Noms de tables. Les noms de table et de colonne respectent la casse. Les mots clés SQL ne respectent pas la casse.

Le nombre maximal d’expressions dans une clause WHERE d’une requête SQL est limité à 32.

Seules les jointures internes sont prises en charge et sont spécifiées par une comparaison des colonnes de différentes tables. Les jointures circulaires ne sont pas prises en charge. Une jointure circulaire est une requête SQL qui relie au moins trois tables dans un circuit. Par exemple, ce qui suit est une jointure circulaire :

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

Les colonnes qui font partie des clés primaires d’une table doivent être définies en premier dans l’ordre de priorité, suivies de toutes les colonnes de clés non primaires. Les colonnes persistantes doivent être définies avant les colonnes temporaires. La séquence de tri d’une colonne de texte n’est pas définie ; toutefois, les valeurs de texte identiques sont toujours regroupées.

Notez que lors de l’ajout ou de la création d’une colonne, vous devez spécifier le type de colonne.

Les tables ne peuvent pas contenir plusieurs colonnes de type 'object'.

La taille maximale qui peut être spécifiée explicitement pour une colonne de chaîne dans une requête SQL est de 255. Une colonne de chaîne de longueur infinie est représentée comme ayant la taille 0. Pour plus d’informations, consultez Format de définition de colonne.

Pour exécuter une instruction SQL, une vue doit être créée. Toutefois, une vue qui ne crée pas de jeu de résultats, comme CREATE TABLE ou INSERT INTO, ne peut pas être utilisée avec MsiViewModify ou la méthode Modify pour mettre à jour les tables dans la vue.

Notez que vous ne pouvez pas extraire un enregistrement contenant des données binaires d’une base de données, puis utiliser cet enregistrement pour insérer les données dans une base de données complètement différente. Pour déplacer des données binaires d’une base de données à une autre, vous devez exporter les données dans un fichier, puis les importer dans la nouvelle base de données via une requête et la fonction MsiRecordSetStream. Cela garantit que chaque base de données a sa propre copie des données binaires.