SQL-Syntax

Die SQL-Abfragezeichenfolgen für Windows Installer sind auf die folgenden Formate beschränkt.

Aktion Abfrage
Gruppe von Datensätzen auswählen SELECT [DISTINCT]{column-list} FROM {table-list} [WHERE {operation-list}] [ORDER BY {column-list}]
Datensätze aus einer Tabelle löschen DELETE FROM {table} [WHERE {operation-list}]
Vorhandene Datensätze in einer Tabelle ändern UPDATE {table-list} SET {column}= {constant} [, {column}= {constant}][, ...] [WHERE {operation-list}] UPDATE-Abfragen funktionieren nur für Spalten für nicht primäre Schlüssel.
Datensätze einer Tabelle hinzufügen INSERT INTO {table} ({column-list}) VALUES ({constant-list}) [TEMPORARY]Binärdaten können nicht direkt mithilfe der INSERT INTO- oder UPDATE SQL-Abfragen in eine Tabelle eingefügt werden. Weitere Informationen finden Sie unter Hinzufügen von Binärdaten zu einer Tabelle mit SQL.
Hinzufügen einer Tabelle CREATE TABLE {table} ( {column} {column type}) [HOLD]Spaltentypen müssen beim Hinzufügen einer Tabelle für jede Spalte angegeben werden. Für die Erstellung einer neuen Tabelle muss mindestens eine Primärschlüsselspalte angegeben werden. Die möglichen Ersetzungen für {column type} in den obigen Daten sind: CHAR [( {size} )] | CHARACTER [( {size} )] | LONGCHAR | SHORT | INT | GANZE ZAHL | LONG | OBJECT [NOT NULL] [TEMPORARY] [LOCALIZABLE] [, column...] [, ...] PRIMARY KEY column [, column][, ...].
Entfernen einer Tabelle DROP TABLE {table}
Hinzufügen eines Spaltennamens ALTER TABLE {table} ADD {column} {column type}Der Spaltentyp muss beim Hinzufügen einer Spalte angegeben werden. Die möglichen Ersetzungen für {column type} in den obigen Daten sind: CHAR [( {size} )] | CHARACTER [( {size} )] | LONGCHAR | SHORT | INT | INTEGER | LONG | OBJECT [NOT NULL] [TEMPORARY] [LOCALIZABLE] [HOLD].
Temporäre Tabellen halten und freigeben ALTER TABLE {table name} HOLDALTER TABLE {table name} FREE
Der Benutzer kann die Befehle HOLD und FREE verwenden, um die Lebensdauer einer temporären Tabelle oder einer temporären Spalte zu steuern. Die Haltedaueranzahl für eine Tabelle wird für jeden SQL HOLD-Vorgang für diese Tabelle erhöht und für jeden SQL FREE-Vorgang für die Tabelle verringert. Wenn die letzte Haltedaueranzahl für eine Tabelle freigegeben wird, kann auf alle temporären Spalten nicht mehr zugegriffen werden. Wenn alle Spalten temporär sind, kann nicht mehr auf die Tabelle zugegriffen werden.

 

Weitere Informationen finden Sie unter Beispiele für Datenbankabfragen mit SQL und Skript.

SQL-Grammatik

Die optionalen Parameter werden in Klammern [ ] angezeigt. Wenn mehrere Optionen aufgeführt sind, werden die optionalen Parameter durch einen vertikalen Balken getrennt.

{constant} ist entweder eine Zeichenfolge oder eine ganze Zahl. Eine Zeichenfolge muss in einfache Anführungszeichen eingeschlossen werden, 'Beispiel'. {constant-list} ist eine durch Trennzeichen getrennte Liste einer oder mehrerer Konstanten.

Die Option LOCALIZABLE legt ein Spaltenattribut fest, das angibt, dass die Spalte lokalisiert werden muss.

{column} ist ein spaltenbasierter Verweis auf einen Wert in einem Feld einer Tabelle.

{marker} ist ein Parameterverweis auf einen Wert, der von einem mit der Abfrage übermittelten Datensatz bereitgestellt wird. Er wird in der SQL-Anweisung durch ein Fragezeichen (?) dargestellt. Informationen zur Verwendung von Parametern finden Sie entweder unter der MsiViewExecute-Funktion oder der Execute-Methode.

Die SQL-Syntax von Windows Installer unterstützt das Escapen von einfachen Anführungszeichen (ASCII-Wert 39) in einem Zeichenfolgenliteral nicht. Sie können jedoch den Datensatz abrufen oder erstellen, das Feld mit der StringData- oder IntegerData-Eigenschaft festlegen und dann die Modify-Methode aufrufen. Alternativ können Sie einen Datensatz erstellen und die Parametermarker (?) verwenden, die unter Execute-Methode beschrieben werden. Dazu können Sie auch die Datenbankfunktionen MsiViewExecute, MsiRecordSetInteger und MsiRecordSetString verwenden.

Eine WHERE {operation-list}-Klausel ist optional und eine Gruppierung von Vorgängen, die zum Filtern der Auswahl verwendet werden sollen. Die Vorgänge müssen den folgenden Typen entsprechen:

  • {column} = {column}
  • {column} = | <> | > | < | > = | <= {constant}
  • {column} = | <> | > | < | >= | <= {marker}
  • {column} ist Null
  • {column} ist nicht Null

Für Zeichenfolgenwerte sind nur Vorgänge vom Typ = oder <> möglich. Objektwertvergleiche sind auf IS NULL und IS NOT NULL beschränkt.

Einzelne Vorgänge können nach AND- oder OR-Operatoren gruppiert werden. Die Reihenfolge kann mithilfe von Klammern ( ) festgelegt werden.

Die ORDER BY-Klausel ist optional und verursacht eine anfängliche Verzögerung beim Sortieren. Bei der Sortierung nach Zeichenfolgen werden identische Zeichenfolgen gruppiert, die Zeichenfolgen werden jedoch nicht alphabetisiert.

Die DISTINCT-Klausel ist optional und wiederholt keine identischen Datensätze im zurückgegebenen Resultset.

Eine {table-list} ist eine durch Trennzeichen getrennte Liste eines oder mehrerer Tabellennamen, die in der Verknüpfung als {table} bezeichnet werden.

{column-list} ist eine durch Trennzeichen getrennte Liste einer oder mehrerer Tabellenspalten, die als {column} bezeichnet werden. Mehrdeutige Spalten können als {tablename.column} weiter qualifiziert werden. Ein Sternchen kann als Spaltenliste in einer SELECT-Abfrage verwendet werden, um alle Spalten in den referenzierten Tabellen darzustellen. Wenn Sie nach Spaltenposition auf Felder verweisen, wählen Sie die Spalten anhand des Namens aus, anstatt das Sternchen zu verwenden. Ein Sternchen kann nicht als Spaltenliste in einer INSERT INTO-Abfrage verwendet werden.

Um Tabellennamen und Spaltennamen mit einem Escapezeichen zu versehen, die mit SQL-Schlüsselwörtern kollidieren, schließen Sie den Namen zwischen zwei Accent grave-Markierungen `` (ASCII-Wert 96) ein. Wenn ein Spaltenname mit Escapezeichen versehen werden muss und als {tablename.column} qualifiziert ist, müssen die Tabelle und die Spalte einzeln als {'tablename'.'column'} mit Escapezeichen versehen werden. Es wird empfohlen, alle Tabellen- und Spaltennamen auf diese Weise mit Escapezeichen zu versehen, um Konflikte mit reservierten Wörtern zu vermeiden und erhebliche Leistungsgewinne zu erzielen.

Tabellennamen sind auf 31 Zeichen beschränkt. Weitere Informationen finden Sie unter Tabellennamen. Für die Tabellen- und Spaltennamen wird die Groß-/Kleinschreibung beachtet. BEI SQL-Schlüsselwörtern wird die Groß-/Kleinschreibung nicht beachtet.

Die maximale Anzahl Ausdrücke in einer WHERE-Klausel einer SQL-Abfrage ist auf 32 beschränkt.

Es werden nur innere Verknüpfungen unterstützt und durch einen Spaltenvergleich aus verschiedenen Tabellen angegeben. Ringverknüpfungen werden nicht unterstützt. Eine Ringverknüpfung ist eine SQL-Abfrage, die drei oder mehr Tabellen in einer Verbindung miteinander verknüpft. Im Folgenden finden Sie z. B. eine Ringverknüpfung:

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

Spalten, die Teil des Primärschlüssels für eine Tabelle sind, müssen zuerst in der Prioritätsreihenfolge definiert werden, gefolgt von allen Nichtschlüsselspalten. Persistente Spalten müssen vor temporären Spalten definiert werden. Die Sortiersequenz einer Textspalte ist nicht definiert. Identische Textwerte werden jedoch immer zusammen gruppiert.

Beachten Sie, dass Sie beim Hinzufügen oder Erstellen einer Spalte den Spaltentyp angeben müssen.

Tabellen dürfen nicht mehr als eine Spalte vom Typ „object“ enthalten.

Die maximale Größe, die explizit für eine Zeichenfolgenspalte in einer SQL-Abfrage angegeben werden kann, beträgt 255. Eine Zeichenfolgenspalte mit unendlicher Länge wird mit der Größe 0 dargestellt. Weitere Informationen finden Sie unter Spaltendefinitionsformat.

Zum Ausführen einer SQL-Anweisung muss eine Ansicht erstellt werden. Eine Ansicht, die kein Resultset erstellt, z. B. CREATE TABLE oder INSERT INTO, kann jedoch nicht mit der MsiViewModify-Methode oder der Modify-Methode verwendet werden, um Tabellen über die Ansicht zu aktualisieren.

Beachten Sie, dass Sie keinen Datensatz mit Binärdaten aus einer Datenbank abrufen und mithilfe dieses Datensatzes keine Daten in eine völlig andere Datenbank einfügen können. Um Binärdaten aus einer Datenbank in eine andere zu verschieben, sollten Sie die Daten in eine Datei exportieren und diese dann mithilfe einer Abfrage und der MsiRecordSetStream-Funktion in die neue Datenbank importieren. Dadurch wird sichergestellt, dass jede Datenbank über eine eigene Kopie der Binärdaten verfügt.