SQL Server テーブルの作成

SQL Server Native Client OLE DB プロバイダでは、コンシューマが SQL Server のテーブルを作成できる、ITableDefinition::CreateTable 関数が公開されます。コンシューマは CreateTable を使用して、コンシューマが命名するパーマネント テーブル、および SQL Server Native Client OLE DB プロバイダが生成する一意の名前が付いたパーマネント テーブルや一時テーブルを作成します。

コンシューマが ITableDefinition::CreateTable を呼び出すときに、DBPROP_TBL_TEMPTABLE プロパティの値が VARIANT_TRUE の場合、SQL Server Native Client OLE DB プロバイダがコンシューマ向けに一時テーブル名を生成します。CreateTable メソッドの pTableID パラメータには NULL を設定します。SQL Server Native Client OLE DB プロバイダによって生成される名前が付いた一時テーブルは、TABLES 行セットには表示されませんが、IOpenRowset インターフェイス経由でアクセスできます。

pTableID パラメータ内にある uName 共用体の pwszName メンバにテーブル名を指定すると、SQL Server Native Client OLE DB プロバイダはその名前で SQL Server テーブルを作成します。SQL Server テーブルの名前付けに関する制約が適用されるので、そのテーブル名で、パーマネント テーブル、ローカル一時テーブルまたはグローバル一時テーブルのいずれであるかを示すことができます。詳細については、「CREATE TABLE」を参照してください。ppTableID パラメータには NULL を指定できます。

SQL Server Native Client OLE DB プロバイダでは、パーマネント テーブル名または一時テーブル名を生成できます。コンシューマが pTableID パラメータに NULL を設定し、有効な DBID* を指すように ppTableID を設定すると、SQL Server Native Client OLE DB プロバイダは、ppTableID の値が指す DBID の uName 共用体の pwszName メンバに、生成したテーブル名を返します。SQL Server Native Client OLE DB プロバイダによって生成される名前が付いた一時テーブルを作成するには、rgPropertySets パラメータで参照されるテーブル プロパティ セットに OLE DB テーブル プロパティ DBPROP_TBL_TEMPTABLE を含めます。SQL Server Native Client OLE DB プロバイダによって生成される名前が付いた一時テーブルは、ローカル テーブルになります。

pTableID パラメータの eKind メンバに DBKIND_NAME を指定しないと、CreateTable は DB_E_BADTABLEID を返します。

DBCOLUMNDESC の使用方法

コンシューマは、pwszTypeName メンバまたは wType メンバのいずれかを使用して、列のデータ型を指定できます。pwszTypeName でデータ型を指定すると、SQL Server Native Client OLE DB プロバイダは wType の値を無視します。

pwszTypeName メンバを使用する場合、SQL Server のデータ型名を使用してデータ型を指定します。有効なデータ型名は、PROVIDER_TYPES スキーマの行セットの TYPE_NAME 列に返されるデータ型名です。

SQL Server Native Client OLE DB プロバイダでは、wType メンバ内の DBTYPE OLE DB 列挙値のサブセットが認識されます。詳細については、「ITableDefinition でのデータ型のマッピング」を参照してください。

注意

列データ型を指定するために、pTypeInfo または pclsid のいずれかを設定すると、CreateTable は DB_E_BADTYPE を返します。

コンシューマは、DBCOLUMNDESC dbcid メンバの uName 共用体の pwszName メンバに列名を指定します。列名は Unicode 文字列で指定します。dbcideKind メンバには、DBKIND_NAME を指定する必要があります。eKind が無効、または pwszName が NULL、あるいは pwszName の値が有効な SQL Server ID ではない場合、CreateTable は DB_E_BADCOLUMNID を返します。

列のすべてのプロパティは、テーブルに定義されたすべての列で使用できます。プロパティ値の設定が競合していると、CreateTable は DB_S_ERRORSOCCURRED または DB_E_ERRORSOCCURRED を返します。無効な列プロパティを設定したことで SQL Server テーブルの作成に失敗した場合、CreateTable ではエラーが返されます。

DBCOLUMNDESC の列プロパティは、次のように解釈されます。

プロパティ ID

説明

DBPROP_COL_AUTOINCREMENT

R/W: 読み取り/書き込み

既定値 : VARIANT_FALSE

説明 : 作成された列に ID プロパティを設定します。SQL Server では、ID プロパティをテーブル内の 1 つの列に設定できます。複数の列でこのプロパティを VARIANT_TRUE に設定すると、SQL Server Native Client OLE DB プロバイダがサーバーでテーブルの作成を試みた時点でエラーが発生します。

SQL Server の ID プロパティは、integer 型、numeric 型、および小数点以下桁数が 0 の decimal 型の場合のみ有効です。他のデータ型の列でこのプロパティを VARIANT_TRUE に設定すると、SQL Server Native Client OLE DB プロバイダがサーバーでテーブルの作成を試みた時点でエラーが発生します。

DBPROP_COL_AUTOINCREMENT と DBPROP_COL_NULLABLE の両方が VARIANT_TRUE で、DBPROP_COL_NULLABLE の dwOption が DBPROPOPTIONS_REQUIRED ではない場合、SQL Server Native Client OLE DB プロバイダは DB_S_ERRORSOCCURRED を返します。DBPROP_COL_AUTOINCREMENT と DBPROP_COL_NULLABLE の両方が VARIANT_TRUE で、DBPROP_COL_NULLABLE の dwOption が DBPROPOPTIONS_REQUIRED の場合、DB_E_ERRORSOCCURRED を返します。この列には SQL Server の ID プロパティが定義され、DBPROP_COL_NULLABLE の dwStatus メンバが DBPROPSTATUS_CONFLICTING に設定されます。

DBPROP_COL_DEFAULT

R/W: 読み取り/書き込み

既定値 : なし

説明 : 列に対して SQL Server の DEFAULT 制約を作成します。

DBPROP の vValue メンバには、さまざまなデータ型のいずれかを指定できます。vValue.vt メンバでは、列のデータ型と互換性のある型を指定する必要があります。たとえば、DBTYPE_WSTR で定義された列の既定値として BSTR N/A を定義した場合は互換性の要件が満たされます。DBTYPE_R8 で定義された列に同じ既定値を定義すると、SQL Server Native Client OLE DB プロバイダがサーバーでテーブルの作成を試みた時点でエラーが発生します。

DBPROP_COL_DESCRIPTION

R/W: 読み取り/書き込み

既定値 : なし

説明 : DBPROP_COL_DESCRIPTION 列プロパティは、SQL Server Native Client OLE DB プロバイダでは実装されません。

コンシューマがこのプロパティ値に書き込みを行うと、DBPROP 構造体の dwStatus メンバは DBPROPSTATUS_NOTSUPPORTED を返します。

このプロパティを設定しても、SQL Server Native Client OLE DB プロバイダで重大なエラーが発生することはありません。他のすべてのパラメータ値が有効であれば、SQL Server のテーブルが作成されます。

DBPROP_COL_FIXEDLENGTH

R/W: 読み取り/書き込み

既定値 : VARIANT_FALSE

説明 : DBCOLUMNDESC の wType メンバを使用して列のデータ型を定義すると、SQL Server Native Client OLE DB プロバイダは DBPROP_COL_FIXEDLENGTH を使用して、データ型のマッピングを判断します。詳細については、「ITableDefinition でのデータ型のマッピング」を参照してください。

DBPROP_COL_NULLABLE

R/W: 読み取り/書き込み

既定値 : なし

説明 : テーブルを作成するとき、SQL Server Native Client OLE DB プロバイダでは、列に対するこのプロパティの設定に応じて、列が NULL 値を許容するかどうかを指定します。このプロパティが設定されていないときは、列が値として NULL を許容するかどうかは、SQL Server の既定のデータベース オプション ANSI_NULLS によって決まります。

SQL Server Native Client OLE DB プロバイダは、ISO 準拠のプロバイダです。接続されたセッションでは、ISO 準拠の動作が行われます。DBPROP_COL_NULLABLE を設定しないと、列は NULL 値を許容します。

DBPROP_COL_PRIMARYKEY

R/W: 読み取り/書き込み

既定値 : VARIANT_FALSE

説明 : VARIANT_TRUE の場合、SQL Server Native Client OLE DB プロバイダは PRIMARY KEY 制約を設定して列を作成します。

列プロパティとして定義するときは、1 つの列だけが制約を判断できます。複数の列でこのプロパティを VARIANT_TRUE に設定すると、SQL Server Native Client OLE DB プロバイダが SQL Server のテーブルの作成を試みた時点でエラーが発生します。

注意 : コンシューマは IIndexDefinition::CreateIndex を使用して、複数の列に PRIMARY KEY 制約を作成できます。

DBPROP_COL_PRIMARYKEY と DBPROP_COL_UNIQUE の両方が VARIANT_TRUE で、DBPROP_COL_UNIQUE の dwOption が DBPROPOPTIONS_REQUIRED ではない場合、SQL Server Native Client OLE DB プロバイダは 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 に設定されます。

DBPROP_COL_PRIMARYKEY と DBPROP_COL_NULLABLE の両方が VARIANT_TRUE の場合、SQL Server Native Client OLE DB プロバイダはエラーを返します。

コンシューマが無効な SQL Server のデータ型の列に PRIMARY KEY 制約を作成すると、SQL Server Native Client OLE DB プロバイダは SQL Server からのエラーを返します。SQL Server の bittextntext、および image データ型で作成した列には、PRIMARY KEY 制約を定義できません。

DBPROP_COL_UNIQUE

R/W: 読み取り/書き込み

既定値 : VARIANT_FALSE

説明 : 列に SQL Server の UNIQUE 制約を適用します。

列プロパティとして定義するときは、1 つの列だけに制約が適用されます。コンシューマは IIndexDefinition::CreateIndex を使用して、2 つ以上の列の組み合わせ値に UNIQUE 制約を適用できます。

DBPROP_COL_PRIMARYKEY と DBPROP_COL_UNIQUE の両方が VARIANT_TRUE で、dwOption が DBPROPOPTIONS_REQUIRED ではない場合、SQL Server Native Client OLE DB プロバイダは 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 Native Client OLE DB プロバイダは DB_S_ERRORSOCCURRED を返します。

DBPROP_COL_NULLABLE と DBPROP_COL_UNIQUE の両方が VARIANT_TRUE で、dwOption が DBPROPOPTIONS_REQUIRED の場合、DB_E_ERRORSOCCURRED を返します。この列には SQL Server の ID プロパティが定義され、DBPROP_COL_NULLABLE の dwStatus メンバが DBPROPSTATUS_CONFLICTING に設定されます。

コンシューマが無効な SQL Server のデータ型の列に UNIQUE 制約を作成すると、SQL Server Native Client OLE DB プロバイダは SQL Server からのエラーを返します。SQL Server の bit データ型で作成された列には、UNIQUE 制約を定義できません。

コンシューマが ITableDefinition::CreateTable を呼び出すときに、SQL Server Native Client OLE DB プロバイダでは、テーブル プロパティが次のように解釈されます。

プロパティ ID

説明

DBPROP_TBL_TEMPTABLE

R/W: 読み取り/書き込み

既定値 : VARIANT_FALSE

説明 : SQL Server Native Client OLE DB プロバイダは、既定では、コンシューマが指定した名前でテーブルを作成します。VARIANT_TRUE を指定すると、SQL Server Native Client OLE DB プロバイダがコンシューマ向けに一時テーブル名を生成します。この場合、コンシューマは CreateTablepTableID パラメータに NULL を設定します。ppTableID パラメータには、有効なポインタを含める必要があります。

正常に作成されたテーブルでコンシューマが行セットを開くように要求すると、SQL Server Native Client 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);
    }

関連項目

概念