SQL Server 테이블 만들기
적용 대상: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)
OLE DB Driver for SQL Server는 소비자가 SQL Server 테이블을 만들 수 있도록 하는 ITableDefinition::CreateTable 함수를 노출합니다. 소비자는 CreateTable을 사용하여 소비자 이름 영구 테이블을 만들고, OLE DB Driver for SQL Server에서 생성된 고유한 이름을 가진 영구 또는 임시 테이블을 만듭니다.
소비자가 ITableDefinition::CreateTable을 호출할 때 DBPROP_TBL_TEMPTABLE 속성 값이 VARIANT_TRUE 경우 OLE DB Driver for SQL Server는 소비자에 대한 임시 테이블 이름을 생성합니다. 소비자는 CreateTable 메서드의 pTableID 매개 변수를 NULL로 설정합니다. OLE DB Driver for SQL Server에서 생성된 이름의 임시 테이블은 TABLES 행 집합에 표시되지 않지만 IOpenRowset 인터페이스를 통해 액세스할 수 있습니다.
소비자가 pTableID 매개 변수에서 uName 공용 구조체의 pwszName 멤버에 테이블 이름을 지정하면 OLE DB Driver for SQL Server는 해당 이름으로 SQL Server 테이블을 만듭니다. SQL Server 테이블 명명 제약 조건이 적용되며 테이블 이름은 영구 테이블 또는 로컬 또는 전역 임시 테이블을 나타낼 수 있습니다. 자세한 내용은 CREATE TABLE을 참조하세요. ppTableID 매개 변수는 NULL일 수 있습니다.
OLE DB Driver for SQL Server는 영구 또는 임시 테이블의 이름을 생성할 수 있습니다. 소비자가 pTableID 매개 변수를 NULL로 설정하고 올바른 DBID를 가리키도록 ppTableID를 설정한 경우 OLE DB Driver for SQL Server는 ppTableID 값이 가리키는 DBID의 uName 공용 구조체의 pwszName 멤버에 있는 테이블에 대해 생성된 이름을 반환합니다. SQL Server용 OLE DB 드라이버가 명명한 임시 테이블을 만들려면 소비자가 rgPropertySets 매개 변수에서 참조하는 테이블 속성 집합에 OLE DB 테이블 속성 DBPROP_TBL_TEMPTABLE을 포함해야 합니다. OLE DB Driver for SQL Server 명명 임시 테이블은 로컬입니다.
pTableID 매개 변수의 eKind 멤버가 DBKIND_NAME을 나타내지 않으면 CreateTable이 DB_E_BADTABLEID를 반환합니다.
DBCOLUMNDESC 사용량
소비자는 pwszTypeName 멤버 또는 wType 멤버를 사용하여 열 데이터 형식을 나타낼 수 있습니다. 소비자가 pwszTypeName에서 데이터 형식을 지정하는 경우 OLE DB Driver for SQL Server는 wType 값을 무시합니다.
pwszTypeName 멤버를 사용하는 경우 소비자는 SQL Server 데이터 형식 이름을 사용하여 데이터 형식을 지정합니다. 유효한 데이터 형식 이름은 PROVIDER_TYPES 스키마 행 집합의 TYPE_NAME 열에 반환된 이름입니다.
OLE DB Driver for SQL Server는 wType 멤버에서 OLE DB 열거형 DBTYPE 값의 하위 집합을 인식합니다. 자세한 내용은 ITableDefinition의 데이터 형식 매핑을 참조 하세요.
참고 항목
소비자가 pTypeInfo 또는 pclsid 멤버를 설정하여 열 데이터 형식을 지정하면 CreateTable이 DB_E_BADTYPE을 반환합니다.
소비자는 DBCOLUMNDESC dbcid 멤버의 uName 공용 구조체의 pwszName 멤버에 열 이름을 지정합니다. 열 이름은 유니코드 문자열로 지정됩니다. dbcid의 eKind 멤버는 DBKIND_NAME 합니다. CreateTable은 eKind가 유효하지 않거나 pwszName이 NULL이거나 pwszName 값이 유효한 SQL Server 식별자가 아닌 경우 DB_E_BADCOLUMNID 반환합니다.
모든 열 속성을 테이블에 대해 정의된 모든 열에 사용할 수 있습니다. 속성 값 설정이 충돌될 경우 CreateTable이 DB_S_ERRORSOCCURRED 또는 DB_E_ERRORSOCCURRED를 반환할 수 있습니다. CreateTable 은 잘못된 열 속성 설정으로 인해 SQL Server 테이블 생성 오류가 발생할 때 오류를 반환합니다.
DBCOLUMNDESC의 열 속성은 다음과 같이 해석됩니다.
속성 ID | 설명 |
---|---|
DBPROP_COL_AUTOINCREMENT | R/W: 읽기/쓰기 기본값: VARIANT_FALSE 설명: 만든 열의 ID 속성을 설정합니다. SQL Server의 경우 ID 속성은 테이블 내의 단일 열에 유효합니다. OLE DB Driver for SQL Server가 서버에 테이블을 만들려고 할 때 속성을 두 개 이상의 열에 대해 VARIANT_TRUE 설정하면 오류가 발생합니다. SQL Server ID 속성은 소수 자릿수가 0일 때 정수, 숫자 및 10진 수 형식에만 유효합니다. 다른 데이터 형식의 열에서 속성을 VARIANT_TRUE 설정하면 OLE DB Driver for SQL Server가 서버에 테이블을 만들려고 할 때 오류가 발생합니다. OLE DB Driver for SQL Server는 DBPROP_COL_AUTOINCREMENT 및 DBPROP_COL_NULLABLE 모두 VARIANT_TRUE DBPROP_COL_NULLABLE dwOption 이 DBPROPOPTIONS_REQUIRED 않으면 DB_S_ERRORSOCCURRED 반환합니다. DB_E_ERRORSOCCURRED DBPROP_COL_AUTOINCREMENT 및 DBPROP_COL_NULLABLE 모두 VARIANT_TRUE DBPROP_COL_NULLABLE dwOption 이 DBPROPOPTIONS_REQUIRED 같으면 반환됩니다. 열은 SQL Server ID 속성으로 정의되고 DBPROP_COL_NULLABLE dwStatus 멤버는 DBPROPSTATUS_CONFLICTING 설정됩니다. |
DBPROP_COL_DEFAULT | R/W: 읽기/쓰기 기본값: None 설명: 열에 대한 SQL Server DEFAULT 제약 조건을 만듭니다. vValue DBPROP 멤버는 다양한 형식일 수 있습니다. vValue.vt 멤버에는 열 데이터 형식과 호환되는 유형을 지정해야 합니다. 예를 들어 BSTR N/A를 DBTYPE_WSTR 정의된 열의 기본값으로 정의하는 것은 호환되는 일치 항목입니다. DBTYPE_R8 정의된 열에서 동일한 기본값을 정의하면 OLE DB Driver for SQL Server가 서버에 테이블을 만들려고 할 때 오류가 발생합니다. |
DBPROP_COL_DESCRIPTION | R/W: 읽기/쓰기 기본값: None 설명: DBPROP_COL_DESCRIPTION 열 속성은 OLE DB Driver for SQL Server에서 구현되지 않습니다. 소비자가 속성 값을 쓰려고 하면 DBPROP 구조의 dwStatus 멤버가 DBPROPSTATUS_NOTSUPPORTED를 반환합니다. 속성을 설정해도 OLE DB Driver for SQL Server에 심각한 오류가 발생하지 않습니다. 다른 모든 매개 변수 값이 유효한 경우 SQL Server 테이블이 만들어집니다. |
DBPROP_COL_FIXEDLENGTH | R/W: 읽기/쓰기 Default: VARIANT_FALSE 설명: OLE DB Driver for SQL Server는 DBPROP_COL_FIXEDLENGTH 사용하여 소비자가 DBCOLUMNDESC의 wType 멤버를 사용하여 열의 데이터 형식을 정의할 때 데이터 형식 매핑을 결정합니다. 자세한 내용은 ITableDefinition의 데이터 형식 매핑을 참조 하세요. |
DBPROP_COL_NULLABLE | R/W: 읽기/쓰기 기본값: None 설명: 테이블을 만들 때 OLE DB Driver for SQL Server는 속성이 설정된 경우 열이 null 값을 수락해야 하는지 여부를 나타냅니다. 속성이 설정되지 않은 경우 열에서 NULL을 값으로 수락하는 기능은 SQL Server ANSI_NULLS 기본 데이터베이스 옵션에 의해 결정됩니다. OLE DB Driver for SQL Server는 ISO 규격 공급자입니다. 연결된 세션에서는 ISO 동작을 따르므로 소비자가 DBPROP_COL_NULLABLE 설정하지 않으면 열은 null 값을 허용합니다. |
DBPROP_COL_PRIMARYKEY | R/W: 읽기/쓰기 기본값: VARIANT_FALSE 설명: VARIANT_TRUE 경우 OLE DB Driver for SQL Server는 PRIMARY KEY 제약 조건이 있는 열을 만듭니다. 열 속성으로 정의된 경우 단일 열만 이 제약 조건을 확인할 수 있습니다. 두 개 이상의 열에 대한 속성 VARIANT_TRUE 설정하면 OLE DB Driver for SQL Server에서 SQL Server 테이블을 만들려고 하면 오류가 반환됩니다. 참고: 소비자는 IIndexDefinition::CreateIndex를 사용하여 둘 이상의 열에 대해 PRIMARY KEY 제약 조건을 만들 수 있습니다. OLE DB Driver for SQL Server는 DBPROP_COL_PRIMARYKEY 및 DBPROP_COL_UNIQUE 모두 VARIANT_TRUE DBPROP_COL_UNIQUE dwOption 이 DBPROPOPTIONS_REQUIRED 않으면 DB_S_ERRORSOCCURRED 반환합니다. DBPROP_COL_PRIMARYKEY 및 DBPROP_COL_UNIQUE 모두 VARIANT_TRUE DBPROP_COL_UNIQUE dwOption이 DBPROPOPTIONS_REQUIRED 같은 경우 DB_E_ERRORSOCCURRED 반환됩니다. 열은 SQL Server ID 속성으로 정의되고 DBPROP_COL_PRIMARYKEY dwStatus 멤버는 DBPROPSTATUS_CONFLICTING 설정됩니다. OLE DB Driver for SQL Server는 DBPROP_COL_PRIMARYKEY 및 DBPROP_COL_NULLABLE 모두 VARIANT_TRUE 경우 오류를 반환합니다. OLE DB Driver for SQL Server는 소비자가 잘못된 SQL Server 데이터 형식의 열에 PRIMARY KEY 제약 조건을 만들려고 할 때 SQL Server에서 오류를 반환합니다. SQL Server 데이터 형식 비트, 텍스트, ntext 및 이미지로 만든 열에는 PRIMARY KEY 제약 조건을 정의할 수 없습니다. |
DBPROP_COL_UNIQUE | R/W: 읽기/쓰기 기본값: VARIANT_FALSE 설명: 열에 SQL Server UNIQUE 제약 조건을 적용합니다. 열 속성으로 정의된 경우 이 제약 조건은 단일 열에만 적용됩니다. 소비자는 IIndexDefinition::CreateIndex를 사용하여 둘 이상의 결합된 열 값에 대해 UNIQUE 제약 조건을 적용할 수 있습니다. OLE DB Driver for SQL Server는 DBPROP_COL_PRIMARYKEY 및 DBPROP_COL_UNIQUE 모두 VARIANT_TRUE dwOption이 DBPROPOPTIONS_REQUIRED 않으면 DB_S_ERRORSOCCURRED 반환합니다. DBPROP_COL_PRIMARYKEY 및 DBPROP_COL_UNIQUE 모두 VARIANT_TRUE dwOption이 DBPROPOPTIONS_REQUIRED 같은 경우 DB_E_ERRORSOCCURRED 반환됩니다. 열은 SQL Server ID 속성으로 정의되고 DBPROP_COL_PRIMARYKEY dwStatus 멤버는 DBPROPSTATUS_CONFLICTING 설정됩니다. DBPROP_COL_NULLABLE 및 DBPROP_COL_UNIQUE가 모두 VARIANT_TRUE이고 dwOption이 DBPROPOPTIONS_REQUIRED가 아니면 SQL Server용 OLE DB 드라이버가 DB_S_ERRORSOCCURRED를 반환합니다. DB_E_ERRORSOCCURRED DBPROP_COL_NULLABLE 및 DBPROP_COL_UNIQUE 모두 VARIANT_TRUE dwOption이 DBPROPOPTIONS_REQUIRED 같으면 반환됩니다. 열은 SQL Server ID 속성으로 정의되고 DBPROP_COL_NULLABLE dwStatus 멤버는 DBPROPSTATUS_CONFLICTING 설정됩니다. OLE DB Driver for SQL Server는 소비자가 잘못된 SQL Server 데이터 형식의 열에 UNIQUE 제약 조건을 만들려고 할 때 SQL Server에서 오류를 반환합니다. SQL Server 비트 데이터 형식으로 만든 열에는 UNIQUE 제약 조건을 정의할 수 없습니다. |
소비자가 ITableDefinition::CreateTable을 호출 하는 경우 OLE DB Driver for SQL Server는 다음과 같이 테이블 속성을 해석합니다.
속성 ID | 설명 |
---|---|
DBPROP_TBL_TEMPTABLE | R/W: 읽기/쓰기 기본값: VARIANT_FALSE 설명: 기본적으로 OLE DB Driver for SQL Server는 소비자가 명명한 테이블을 만듭니다. VARIANT_TRUE의 경우 OLE DB Driver for SQL Server는 소비자에 대한 임시 테이블 이름을 생성합니다. 소비자는 CreateTable의 pTableID 매개 변수를 NULL로 설정합니다. ppTableID 매개 변수는 유효한 포인터를 포함해야 합니다. |
소비자가 성공적으로 생성된 테이블에서 행 집합을 열도록 요청하면 SQL Server용 OLE DB 드라이버는 커서 지원 행 집합을 엽니다. 모든 행 집합 속성은 전달된 속성 집합에 표시될 수 있습니다.
이 예제에서는 SQL Server 테이블을 만듭니다.
// This CREATE TABLE statement shows the details of the table created by
// the following example code.
//
// CREATE TABLE OrderDetails
// (
// OrderID int NOT NULL
// ProductID int NOT NULL
// CONSTRAINT PK_OrderDetails
// PRIMARY KEY CLUSTERED (OrderID, ProductID),
// UnitPrice money NOT NULL,
// Quantity int NOT NULL,
// Discount decimal(2,2) NOT NULL
// DEFAULT 0
// )
//
// The PRIMARY KEY constraint is created in an additional example.
HRESULT CreateTable
(
ITableDefinition* pITableDefinition
)
{
DBID dbidTable;
const ULONG nCols = 5;
ULONG nCol;
ULONG nProp;
DBCOLUMNDESC dbcoldesc[nCols];
HRESULT hr;
// Set up column descriptions. First, set default property values for
// the columns.
for (nCol = 0; nCol < nCols; nCol++)
{
dbcoldesc[nCol].pwszTypeName = NULL;
dbcoldesc[nCol].pTypeInfo = NULL;
dbcoldesc[nCol].rgPropertySets = new DBPROPSET;
dbcoldesc[nCol].pclsid = NULL;
dbcoldesc[nCol].cPropertySets = 1;
dbcoldesc[nCol].ulColumnSize = 0;
dbcoldesc[nCol].dbcid.eKind = DBKIND_NAME;
dbcoldesc[nCol].wType = DBTYPE_I4;
dbcoldesc[nCol].bPrecision = 0;
dbcoldesc[nCol].bScale = 0;
dbcoldesc[nCol].rgPropertySets[0].rgProperties =
new DBPROP[NCOLPROPS_MAX];
dbcoldesc[nCol].rgPropertySets[0].cProperties = NCOLPROPS_MAX;
dbcoldesc[nCol].rgPropertySets[0].guidPropertySet =
DBPROPSET_COLUMN;
for (nProp = 0; nProp < NCOLPROPS_MAX; nProp++)
{
dbcoldesc[nCol].rgPropertySets[0].rgProperties[nProp].
dwOptions = DBPROPOPTIONS_REQUIRED;
dbcoldesc[nCol].rgPropertySets[0].rgProperties[nProp].colid
= DB_NULLID;
VariantInit(
&(dbcoldesc[nCol].rgPropertySets[0].rgProperties[nProp].
vValue));
dbcoldesc[nCol].rgPropertySets[0].rgProperties[nProp].
vValue.vt = VT_BOOL;
}
}
// Set the column-specific information.
dbcoldesc[0].dbcid.uName.pwszName = L"OrderID";
dbcoldesc[0].rgPropertySets[0].rgProperties[0].dwPropertyID =
DBPROP_COL_NULLABLE;
dbcoldesc[0].rgPropertySets[0].rgProperties[0].vValue.boolVal =
VARIANT_FALSE;
dbcoldesc[0].rgPropertySets[0].cProperties = 1;
dbcoldesc[1].dbcid.uName.pwszName = L"ProductID";
dbcoldesc[1].rgPropertySets[0].rgProperties[0].dwPropertyID =
DBPROP_COL_NULLABLE;
dbcoldesc[1].rgPropertySets[0].rgProperties[0].vValue.boolVal =
VARIANT_FALSE;
dbcoldesc[1].rgPropertySets[0].cProperties = 1;
dbcoldesc[2].dbcid.uName.pwszName = L"UnitPrice";
dbcoldesc[2].wType = DBTYPE_CY;
dbcoldesc[2].rgPropertySets[0].rgProperties[0].dwPropertyID =
DBPROP_COL_NULLABLE;
dbcoldesc[2].rgPropertySets[0].rgProperties[0].vValue.boolVal =
VARIANT_FALSE;
dbcoldesc[2].rgPropertySets[0].cProperties = 1;
dbcoldesc[3].dbcid.uName.pwszName = L"Quantity";
dbcoldesc[3].rgPropertySets[0].rgProperties[0].dwPropertyID =
DBPROP_COL_NULLABLE;
dbcoldesc[3].rgPropertySets[0].rgProperties[0].vValue.boolVal =
VARIANT_FALSE;
dbcoldesc[3].rgPropertySets[0].cProperties = 1;
dbcoldesc[4].dbcid.uName.pwszName = L"Discount";
dbcoldesc[4].wType = DBTYPE_NUMERIC;
dbcoldesc[4].bPrecision = 2;
dbcoldesc[4].bScale = 2;
dbcoldesc[4].rgPropertySets[0].rgProperties[0].dwPropertyID =
DBPROP_COL_NULLABLE;
dbcoldesc[4].rgPropertySets[0].rgProperties[0].vValue.boolVal =
VARIANT_FALSE;
dbcoldesc[4].rgPropertySets[0].rgProperties[1].dwPropertyID =
DBPROP_COL_DEFAULT;
dbcoldesc[4].rgPropertySets[0].rgProperties[1].vValue.vt = VT_BSTR;
dbcoldesc[4].rgPropertySets[0].rgProperties[1].vValue.bstrVal =
SysAllocString(L"0");
dbcoldesc[4].rgPropertySets[0].cProperties = 2;
// Set up the dbid for OrderDetails.
dbidTable.eKind = DBKIND_NAME;
dbidTable.uName.pwszName = L"OrderDetails";
if (FAILED(hr = pITableDefinition->CreateTable(NULL, &dbidTable,
nCols, dbcoldesc, NULL, 0, NULL, NULL, NULL)))
{
DumpError(pITableDefinition, IID_ITableDefinition);
goto SAFE_EXIT;
}
SAFE_EXIT:
// Clean up dynamic allocation in the property sets.
for (nCol = 0; nCol < nCols; nCol++)
{
for (nProp = 0; nProp < NCOLPROPS_MAX; nProp++)
{
if (dbcoldesc[nCol].rgPropertySets[0].rgProperties[nProp].
vValue.vt == VT_BSTR)
{
SysFreeString(dbcoldesc[nCol].rgPropertySets[0].
rgProperties[nProp].vValue.bstrVal);
}
}
delete [] dbcoldesc[nCol].rgPropertySets[0].rgProperties;
delete [] dbcoldesc[nCol].rgPropertySets;
}
return (hr);
}