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]{column-list} FROM {table-list} [WHERE {operation-list}] [ORDER BY {column-list}] |
Supprimer des enregistrements d’une table | DELETE FROM {table} [WHERE {operation-list}] |
Modifier les enregistrements existants dans une table | UPDATE {table-list} SET {column}= {constant} [, {column}= {constant}][, ...] [WHERE {operation-list}]Les requêtes UPDATE fonctionnent uniquement sur des colonnes clés non primaires. |
Ajouter des enregistrements à une table | INSERT INTO {table} ({column-list}) VALUES ({constant-list}) [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} ( {column} {column} {column type}) [HOLD]Les types de colonnes doivent être spécifiés pour chaque colonne lors de l’ajout d’une table. Au moins une colonne clé primaire doit être spécifiée pour la création d’une nouvelle table. Les substitutions possibles pour {type de colonne} dans la liste ci-dessus sont les suivantes : CHAR [( {size} )] | CHARACTER [( {size} )] | LONGCHAR | SHORT | INT | ENTIER | LONG | OBJECT [NOT NULL] [TEMPORARY] [LOCALIZABLE] [, column...][, ...] COLONNE PRIMARY KEY [, colonne][, ...]. |
Supprimer une table | DROP TABLE {table} |
Ajouter une colonne | ALTER TABLE {table} ADD {column} {column} {column type}Le type de colonne doit être spécifié lors de l’ajout d’une colonne. Les substitutions possibles pour {type de colonne} dans la liste ci-dessus sont les suivantes : CHAR [( {size} )] | CHARACTER [( {size} )] | LONGCHAR | SHORT | INT | ENTIER | LONG | OBJECT [NOT NULL] [TEMPORARY] [LOCALIZABLE] [HOLD]. |
Stocker et libérer des tables temporaires | ALTER TABLE {table name} HOLDALTER TABLE {table name} 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 scripts.
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 'example'. Une {constant-list} 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 {column} est une référence colonneaire à une valeur dans un champ d’une table.
Un {marker} est une référence de paramètre à une valeur fournie par un enregistrement envoyé avec la requête. Elle est représentée dans l’instruction SQL par un point d’interrogation ?. Pour plus d’informations sur l’utilisation des paramètres, consultez la fonctionmsiViewExecuteou la méthode Execute.
La syntaxe SQL de Windows Installer ne prend pas en charge l’échappement de guillemets simples (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 StringData ou propriété IntegerData, puis appeler la méthode Modify. Vous pouvez également créer un enregistrement et utiliser les marqueurs de paramètres ( ?) décrits dans méthode Execute. Vous pouvez également utiliser les fonctions de base de données MsiViewExecute, MsiRecordSetIntegeret MsiRecordSetString.
Une clause WHERE {operation-list} est facultative et est un regroupement d’opérations à utiliser pour filtrer la sélection. Les opérations doivent être des types suivants :
- {column} = {column}
- {column} = | <> | > | < | >= | <= {constant}
- {column} = | <> | > | < | >= | <= {marker}
- {column} a la valeur Null
- {column} n’est pas 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. L’ordre peut être imposé par l’utilisation de parenthèses ().
La clause ORDER BY est facultative et provoque un délai initial pendant le tri. L’ordre par chaînes regroupe les chaînes identiques, mais il n’alphabetise pas 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 {table-list} est une liste délimitée par des virgules d’un ou plusieurs noms de table appelés {table} dans la jointure.
Un {column-list} est une liste délimitée par des virgules d’une ou plusieurs colonnes de table appelées {column} sélectionnées. Les colonnes ambiguës peuvent être qualifiées comme {tablename.column}. 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 aux noms de table et aux noms de colonnes qui se heurtent à 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 est qualifié de {tablename.column}, la table et la colonne doivent être échappées individuellement en tant que {'tablename'.'column'}. Il est recommandé que tous les noms de table et noms de colonnes soient échappés de cette manière pour éviter les conflits avec des mots réservés et obtenir des performances significatives.
Les noms de tables sont limités à 31 caractères. Pour plus d’informations, consultez noms de tables. Les noms de tables et de colonnes 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 de colonnes provenant de différentes tables. Les jointures circulaires ne sont pas prises en charge. Une jointure circulaire est une requête SQL qui lie trois tables ou plus dans un circuit. Par exemple, voici une jointure circulaire :
WHERE Table1.Field1=Table2.Field1 AND Table2.Field2=Table3.Field1 AND Table3.Field2=Table1.Field2.
Les colonnes qui font partie du ou des clés primaires d’une table doivent être définies en premier dans l’ordre de priorité, suivie de toutes les colonnes 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 plus d’une colonne 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 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 un jeu de résultats, tel que CREATE TABLE ou INSERT INTO, ne peut pas être utilisée avec MsiViewModify ou la méthode Modify pour mettre à jour les tables bien que 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 vers une autre, vous devez exporter les données vers 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.