Sintaxe SQL

As cadeias de caracteres de consulta SQL para Windows Installer são restritas aos seguintes formatos.

Ação Consulta
Selecionar um grupo de registros SELECT [DISTINCT]{column-list} FROM {table-list} [WHERE {operation-list}] [ORDER BY {column-list}]
Excluir registros de uma tabela DELETE FROM {table} [WHERE {operation-list}]
Modificar registros existentes em uma tabela UPDATE {table-list} SET {column}= {constant} [, {column}= {constant}][, ...] [WHERE {operation-list}]As consultas UPDATE funcionam apenas em colunas de chave não primárias.
Adicionar registros a uma tabela INSERT INTO {table} ({column-list}) VALUES ({constant-list}) [TEMPORARY]Os dados binários não podem ser inseridos em uma tabela diretamente usando as consultas INSERT INTO ou UPDATE SQL. Para obter mais informações, confira Como adicionar dados binários a uma tabela usando o SQL.
Adicionar uma tabela CREATE TABLE {table} ( {column} {column type}) [HOLD]Os tipos de coluna devem ser especificados para cada coluna ao adicionar uma tabela. Pelo menos uma coluna de chave primária deve ser especificada para a criação de uma nova tabela. As possíveis substituições para {column type} acima são: CHAR [( {size} )] | CHARACTER [( {size} )] | LONGCHAR | SHORT | INT | INTEGER | LONG | OBJECT [NOT NULL] [TEMPORARY] [LOCALIZABLE] [, column...][, ...] PRIMARY KEY column [, column][, ...].
Remover uma tabela DROP TABLE {table}
Adicionar uma coluna ALTER TABLE {table} ADD {column} {column type}O tipo de coluna deve ser especificado ao adicionar uma coluna. As possíveis substituições para {column type} acima são: CHAR [( {size} )] | CHARACTER [( {size} )] | LONGCHAR | SHORT | INT | INTEGER | LONG | OBJECT [NOT NULL] [TEMPORARY] [LOCALIZABLE] [HOLD].
Manter e liberar tabelas temporárias ALTER TABLE {table name} HOLDALTER TABLE {table name} FREE
O usuário pode usar os comandos HOLD e FREE para controlar o tempo de vida de uma tabela temporária ou de uma coluna temporária. A contagem de retenção em uma tabela aumenta para cada operação SQL HOLD nessa tabela e diminui para cada operação SQL FREE na tabela. Quando a última contagem de retenção é lançada em uma tabela, todas as colunas temporárias ficam inacessíveis. Se todas as colunas forem temporárias, a tabela se tornará inacessível.

 

Para obter mais informações, condira Exemplos de consultas de banco de dados usando o SQL e Script.

Gramática SQL

Os parâmetros opcionais são mostrados entre colchetes [ ]. Quando várias opções são listadas, os parâmetros opcionais são separados por uma barra vertical.

{constant} é uma cadeia de caracteres ou um inteiro. Uma cadeia de caracteres deve ser colocada entre aspas simples, 'example'. {constant-list} é uma lista delimitada por vírgulas de uma ou mais constantes.

A opção LOCALIZABLE define um atributo de coluna que indica que a coluna precisa ser localizada.

{column} é uma referência colunar a um valor em um campo de uma tabela.

{marker} é uma referência de parâmetro a um valor fornecido por um registro enviado com a consulta. Ele é representado na instrução SQL por um ponto de interrogação (?). Para obter informações sobre o uso de parâmetros, confira a função MsiViewExecute ou o método Execute.

A sintaxe do SQL do Windows Installer não permite escapar de aspas simples (valor ASCII 39) em um literal de cadeia de caracteres. No entanto, você pode buscar ou criar o registro, definir o campo com a propriedade StringData ou IntegerData e, em seguida, chamar o método Modify. Como alternativa, você pode criar um registro e usar os marcadores de parâmetro (?) descritos em método Execute. Você também pode fazer isso usando as funções de banco de dados MsiViewExecute, MsiRecordSetInteger e MsiRecordSetString.

Uma cláusula WHERE {operation-list} é opcional e é um agrupamento de operações a serem usadas para filtrar a seleção. As operações devem ser dos seguintes tipos:

  • {column} = {column}
  • {column} = | <> | > | < | >= | <= {constant}
  • {column} = | <> | > | < | >= | <= {marker}
  • {column} is null
  • {column} is not null

Para valores de cadeia de caracteres, somente as operações = or <> são possíveis. As comparações de valor do objeto são limitadas a IS NULL e IS NOT NULL.

As operações individuais podem ser agrupadas por operadores AND ou OR. A ordenação pode ser imposta pelo uso de parênteses ( ).

A cláusula ORDER BY é opcional e causa um atraso inicial durante a classificação. A ordenação por cadeias de caracteres agrupará cadeias de caracteres idênticas, mas não alfabetizará as cadeias de caracteres.

A cláusula DISTINCT é opcional e não repete registros idênticos no conjunto de resultados retornado.

{table-list} é uma lista delimitada por vírgulas de um ou mais nomes de tabela conhecidos como {table} na junção.

{column-list} é uma lista delimitada por vírgulas de uma ou mais colunas de tabela conhecidas como {column} na seleção. Colunas ambíguas podem ser ainda mais qualificadas como {tablename.column}. Um asterisco pode ser usado como uma lista de colunas em uma consulta SELECT para representar todas as colunas nas tabelas referenciadas. Ao referenciar campos por posição de coluna, selecione as colunas pelo nome, em vez de usar o asterisco. Um asterisco não pode ser usado como uma lista de colunas em uma consulta INSERT INTO.

Para escapar de nomes de tabelas e nomes de colunas que entram em conflito com as palavras-chave SQL, coloque o nome entre dois acentos graves `` (valor ASCII 96). Se um nome de coluna precisar ser escapado e for qualificado como {tablename.column}, a tabela e a coluna deverão ser escapadas individualmente como {'tablename'.'column'}. É recomendável que todos os nomes de tabela e nomes de coluna sejam escapados dessa forma para evitar conflitos com palavras reservadas e obter um desempenho significativo.

Os nomes de tabela são limitados a 31 caracteres. Para obter mais informações, confira a Tabela Names. Os nomes de coluna e tabela diferenciam maiúsculas de minúsculas. As palavras-chave do SQL não diferenciam maiúsculas de minúsculas.

O número máximo de expressões em uma cláusula WHERE de uma consulta SQL é limitado a 32.

Há suporte somente para junções e elas são especificadas por uma comparação de colunas de tabelas diferentes. Não há suporte para junções circulares. Uma junção circular é uma consulta SQL que vincula três ou mais tabelas em um circuito. Por exemplo, veja abaixo uma junção circular:

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

As colunas que fazem parte das chaves primárias de uma tabela devem ser definidas primeiro na ordem de prioridade, seguidas por colunas de chave não primárias. As colunas persistentes devem ser definidas antes das colunas temporárias. A sequência de classificação de uma coluna de texto é indefinida, no entanto, valores de texto idênticos sempre se agrupam.

Observe que, ao adicionar ou criar uma coluna, você deve especificar o tipo de coluna.

As tabelas podem não conter mais de uma coluna do tipo 'object'.

O tamanho máximo que pode ser especificado explicitamente para uma coluna de cadeia de caracteres em uma consulta SQL é 255. Uma coluna de cadeia de caracteres de comprimento infinito é representada como se tivesse o tamanho 0. Para saber mais, confira Formato de definição de coluna.

Para executar qualquer instrução SQL, uma exibição precisa ser criada. No entanto, uma exibição que não cria um conjunto de resultados, como CREATE TABLE ou INSERT INTO, não pode ser usada com o método MsiViewModify ou Modify para atualizar tabelas por meio da exibição.

Observe que não é possível buscar um registro que contém dados binários de um banco de dados e, em seguida, usar esse registro para inserir os dados em um banco de dados completamente diferente. Para mover os dados binários de um banco de dados para outro, você deve exportar os dados para um arquivo e importá-los para o novo banco de dados por meio de uma consulta e a função MsiRecordSetStream. Isso garante que cada banco de dados tenha uma cópia própria dos dados binários.