SQL 구문

Windows Installer에 대한 SQL 쿼리 문자열은 다음 형식으로 제한됩니다.

작업 쿼리
레코드 그룹 선택 SELECT [DISTINCT]{column-list} FROM {table-list} [WHERE {operation-list}] [ORDER BY {column-list}]
테이블에서 레코드 삭제 DELETE FROM {table} [WHERE {operation-list}]
테이블의 기존 레코드 수정 UPDATE {table-list} SET {column}= {constant} [, {column}= {constant}][, ...] [WHERE {operation-list}]UPDATE 쿼리는 기본이 아닌 키 열에서만 작동합니다.
테이블에 레코드 추가 INSERT INTO {table} ({column-list}) VALUES ({constant-list}) [TEMPORARY]이진 데이터는 INSERT INTO 또는 UPDATE SQL 쿼리를 사용하여 테이블에 직접 삽입할 수 없습니다. 자세한 내용은 SQL을 사용하여 테이블에 이진 데이터 추가를 참조하세요.
테이블 추가 CREATE TABLE {table} ( {column} {column type}) [HOLD]열 형식은 테이블을 추가할 때 각 열에 대해 지정해야 합니다. 새 테이블을 만들려면 하나 이상의 기본 키 열을 지정해야 합니다. 위의 {column type}에 대해 대체 가능한 값은 CHAR [( {size} )] | CHARACTER [( {size} )] | LONGCHAR | SHORT | INT | INTEGER | LONG | OBJECT [NOT NULL] [TEMPORARY] [LOCALIZABLE] [, column...][, ...] PRIMARY KEY column [, column][, ...]입니다.
테이블 제거 DROP TABLE {table}
열 추가 ALTER TABLE {table} ADD {column} {column type}열을 추가할 때 열 형식을 지정해야 합니다. 위의 {column type}에 대해 대체 가능한 값은 CHAR [( {size} )] | CHARACTER [( {size} )] | LONGCHAR | SHORT | INT | INTEGER | LONG | OBJECT [NOT NULL] [TEMPORARY] [LOCALIZABLE] [HOLD]입니다.
임시 테이블 유지 및 해제 ALTER TABLE {table name} HOLDALTER TABLE {table name} FREE
사용자는 HOLD 및 FREE 명령을 사용하여 임시 테이블 또는 임시 열의 수명 범위를 제어할 수 있습니다. 테이블에 대한 유지 카운트는 해당 테이블에 대한 SQL HOLD 작업마다 증분되고 테이블에 대한 SQL FREE 작업마다 감소합니다. 테이블에서 마지막 유지 카운트가 해제되면 모든 임시 열에 액세스할 수 없게 됩니다. 모든 열이 임시인 경우 테이블에 액세스할 수 없게 됩니다.

 

자세한 내용은 SQL 및 스크립트를 사용하는 데이터베이스 쿼리 예제를 참조하세요.

SQL 문법

선택적 매개 변수는 대괄호 [ ]로 묶인 상태로 표시됩니다. 여러 선택 항목이 나열되면 선택적 매개 변수는 세로 막대로 구분됩니다.

{constant}는 문자열 또는 정수입니다. 문자열은 작은따옴표 'example'로 묶어야 합니다. {constant-list}는 하나 이상의 상수에 대해 쉼표로 구분된 목록입니다.

LOCALIZABLE 옵션은 열을 지역화해야 함을 나타내는 열 특성을 설정합니다.

{column}은 테이블 필드의 값에 대한 열 형식 참조입니다.

{marker}는 쿼리와 함께 제출된 레코드에서 제공하는 값에 대한 매개 변수 참조입니다. SQL 문에 물음표 ?로 표시됩니다. 매개 변수 사용에 대한 자세한 내용은 MsiViewExecute 함수 또는 Execute 메서드를 참조하세요.

Windows Installer SQL 구문은 문자열 리터럴에서 작은따옴표(ASCII 값 39)의 이스케이프를 지원하지 않습니다. 그러나 레코드를 가져오거나 만들고 필드를 StringData 또는 IntegerData 속성으로 설정한 다음, Modify 메서드를 호출할 수 있습니다. 또는 레코드를 만들고 Execute 메서드에 설명된 매개 변수 마커(?)를 사용할 수 있습니다. 데이터베이스 함수 MsiViewExecute, MsiRecordSetIntegerMsiRecordSetString을 사용하여 이 작업을 수행할 수도 있습니다.

WHERE {operation-list} 절은 선택 사항이며 선택 영역을 필터링하는 데 사용할 작업의 그룹화입니다. 작업은 다음 형식이어야 합니다.

  • {column} = {column}
  • {column} = | <> | > | < | >= | <= {constant}
  • {column} = | <> | > | < | >= | <= {marker}
  • {column}은 null임
  • {column}은 null이 아님

문자열 값의 경우 = 또는 <> 작업만 가능합니다. 개체 값 비교는 IS NULL 및 IS NOT NULL로 제한됩니다.

개별 작업은 AND 또는 OR 연산자로 그룹화할 수 있습니다. 괄호()를 사용하여 순서를 지정할 수 있습니다.

ORDER BY 절은 선택 사항이며 정렬하는 동안 초기 지연이 발생합니다. 문자열로 정렬하면 동일한 문자열이 함께 그룹화되지만 문자열은 사전순으로 정렬되지 않습니다.

DISTINCT 절은 선택 사항이며 반환된 결과 집합에서 동일한 레코드를 반복하지 않습니다.

{table-list}는 조인에서 {table}로 참조되는 하나 이상의 테이블 이름에 대해 쉼표로 구분된 목록입니다.

{column-list}는 선택된 {column}으로 참조되는 하나 이상의 테이블 열에 대해 쉼표로 구분된 목록입니다. 모호한 열은 {tablename.column}으로 더 정규화될 수 있습니다. 별표는 SELECT 쿼리에서 열 목록으로 사용하여 참조된 테이블의 모든 열을 나타낼 수 있습니다. 열 위치별로 필드를 참조할 때 별표를 사용하는 대신 이름으로 열을 선택합니다. 별표는 INSERT INTO 쿼리에서 열 목록으로 사용할 수 없습니다.

SQL 키워드와 충돌하는 테이블 이름 및 열 이름을 이스케이프하려면 두 개의 강세 표시 ``(ASCII 값 96)로 이름을 묶습니다. 열 이름을 이스케이프해야 하고 {tablename.column}으로 정규화된 경우 테이블과 열을 개별적으로 {`tablename`.`column`}으로 이스케이프해야 합니다. 예약된 단어와의 충돌을 방지하고 상당한 성능 이점을 얻으려면 이러한 방식으로 모든 테이블 이름과 열 이름을 이스케이프하는 것이 좋습니다.

테이블 이름은 31자로 제한됩니다. 자세한 내용은 테이블 이름을 참조하세요. 테이블 및 열 이름은 대/소문자를 구분합니다. SQL 키워드는 대/소문자를 구분하지 않습니다.

SQL 쿼리의 WHERE 절에 있는 식의 최대 수는 32개로 제한됩니다.

내부 조인만 지원되며 서로 다른 테이블의 열을 비교하여 지정됩니다. 순환 조인은 지원되지 않습니다. 순환 조인은 3개 이상의 테이블을 서킷에 연결하는 SQL 쿼리입니다. 예를 들어 다음은 순환 조인입니다.

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

테이블에 대한 기본 키의 일부인 열은 우선 순위에 따라 먼저 정의되어야 하며, 그 다음에 기본이 아닌 키 열이 나와야 합니다. 영구 열은 임시 열 앞에 정의되어야 합니다. 텍스트 열의 정렬 시퀀스가 정의되지 않았지만 동일한 텍스트 값은 항상 함께 그룹화됩니다.

열을 추가하거나 만들 때는 열 형식을 지정해야 합니다.

테이블에는 'object' 형식의 열이 둘 이상 포함될 수 없습니다.

SQL 쿼리의 문자열 열에 대해 명시적으로 지정할 수 있는 최대 크기는 255입니다. 무한 길이의 문자열 열은 크기가 0인 것으로 표시됩니다. 자세한 내용은 열 정의 형식을 참조하세요.

SQL 문을 실행하려면 뷰를 만들어야 합니다. 그러나 CREATE TABLE 또는 INSERT INTO와 같은 결과 집합을 만들지 않는 뷰는 MsiViewModify 또는 Modify 메서드와 함께 사용하여 뷰를 통해 테이블을 업데이트할 수 없습니다.

한 데이터베이스에서 이진 데이터가 포함된 레코드를 가져온 다음, 해당 레코드를 사용하여 데이터를 완전히 다른 데이터베이스에 삽입할 수 없습니다. 이진 데이터를 한 데이터베이스에서 다른 데이터베이스로 이동하려면 데이터를 파일로 내보낸 다음, 쿼리와 MsiRecordSetStream 함수를 통해 새 데이터베이스로 가져와야 합니다. 이렇게 하면 각 데이터베이스에 이진 데이터의 자체 복사본을 저장할 수 있습니다.