SQL Server Native Client テーブルの作成

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

SQL Server Native Client OLE DB プロバイダーは ITableDefinition::CreateTable 関数を公開し、コンシューマーがSQL Serverテーブルを作成できるようにします。 コンシューマーは 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 を指定できます。

OLE DB プロバイダー SQL Server Native Clientは、永続テーブルまたは一時テーブルの名前を生成できます。 コンシューマーが pTableID パラメーターを NULL に設定し、ppTableID を有効な DBID* を指すように設定すると、SQL Server Native Client OLE DB プロバイダーは、ppTableID の値が指す DBID の uName 共用体の pwszName メンバー内のテーブルの生成された名前を返します。 OLE DB プロバイダー名付きテーブルSQL Server Native Client一時的なテーブルを作成するために、コンシューマーは 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 メンバー内の OLE DB 列挙 DBTYPE 値のサブセットを認識します。 詳しくは、「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

説明: SQL SERVER NATIVE CLIENT OLE DB プロバイダーは、コンシューマーが DBCOLUMNDESC の wType メンバーを使用して列のデータ型を定義するときに、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 を使用して、2 つ以上の列に PRIMARY KEY 制約を作成できます。

SQL Server Native Client OLE DB プロバイダーは、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 に設定されます。

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

SQL Server Native Client OLE DB プロバイダーは、コンシューマーが無効なSQL Serverデータ型の列に対して PRIMARY KEY 制約を作成しようとしたときに、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 に設定されます。

SQL Server Native Client OLE DB プロバイダーは、DBPROP_COL_NULLABLEとDBPROP_COL_UNIQUEの両方がVARIANT_TRUEであり、dwOption がDBPROPOPTIONS_REQUIREDされていない場合に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 Native Client OLE DB プロバイダーは、コンシューマーが無効なSQL Serverデータ型の列に対して UNIQUE 制約を作成しようとすると、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);  
    }  

参照

テーブルとインデックス