プログラム変数からの一括コピー
適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)
プログラム変数から直接一括コピーできます。 行のデータを保持する変数を割り当て、一括コピーを開始する bcp_init を呼び出した後、各列の bcp_bind を呼び出して、列に関連付けるプログラム変数の場所と形式を指定します。 各変数にデータを入力し、 bcp_sendrow を呼び出して 1 行のデータをサーバーに送信します。 すべての行がサーバーに送信されるまで、変数を入力して bcp_sendrow を呼び出すプロセスを繰り返し、 bcp_done を呼び出して操作が完了したことを指定します。
bcp_bindpData パラメーターには、列にバインドされている変数のアドレスが含まれています。 各列のデータは、次の 2 つの方法のいずれかを使用して格納できます。
データを保持する変数を 1 つ割り当てる
データ変数の直前にインジケーター変数を割り当てる
インジケーター変数は、可変長列のデータの長さを示します。列で NULL 値を許容している場合は NULL 値も示します。 データ変数のみを使用する場合、この変数のアドレスは bcp_bindpData パラメーターに格納されます。 標識変数を使用する場合、標識変数のアドレスは bcp_bindpData パラメーターに格納されます。 一括コピー関数は、 bcp_bindcbIndicator および pData パラメーターを追加して、データ変数の場所を計算します。
bcp_bind では、可変長データを処理するための 3 つの方法がサポートされています。
cbData は、データ変数でのみ使用します。 データの長さを cbData に配置します。 一括コピーするデータの長さが変更されるたびに、 bcp_collen を呼び出して cbDataをリセットします。 他の 2 つのメソッドのいずれかが使用されている場合は、 cbData のSQL_VARLEN_DATAを指定します。 列に指定されるすべてのデータ値が NULL の場合は、 cbData にSQL_NULL_DATAを指定します。
インジケーター変数を使用します。 新しい各データ値をデータ変数に移動するときに、その値の長さをインジケーター変数に格納します。 他の 2 つのメソッドのいずれかが使用されている場合は、 cbIndicator に 0 を指定します。
ターミネータ ポインターを使用します。 データを終了するビット パターンのアドレスを使用して、 bcp_bindpTerm パラメーターを読み込みます。 他の 2 つのメソッドのいずれかが使用されている場合は、 pTerm に NULL を指定します。
これらの 3 つのメソッドはすべて、同じ bcp_bind 呼び出しで使用できます。この場合、コピーされるデータの量が最小になる仕様が使用されます。
bcp_bindtype パラメーターは、ODBC データ型識別子ではなく、DB-Library データ型識別子を使用します。 DB-Library データ型識別子は、ODBC bcp_bind 関数で使用するために sqlncli.h で定義されています。
一括コピー関数では、すべての ODBC C データ型をサポートしているわけではありません。 たとえば、一括コピー関数は ODBC SQL_C_TYPE_TIMESTAMP構造をサポートしていないため、ODBC SQL_TYPE_TIMESTAMP データをSQL_C_CHAR変数に変換するには、 SQLBindCol または SQLGetData を使用します。 その後、SQLCHARACTER の type パラメーターと共にbcp_bindを使用して変数を SQL Server datetime 列にバインドすると、一括コピー関数は文字変数のタイムスタンプ エスケープ句を適切な datetime 形式に変換します。
次の表に、ODBC SQL データ型から SQL Server データ型へのマッピングで使用する推奨されるデータ型を示します。
ODBC SQL データ型 | ODBC C データ型 | bcp_bind type パラメーター | SQL Server のデータ型 |
---|---|---|---|
SQL_CHAR | SQL_C_CHAR | SQLCHARACTER | character char |
SQL_VARCHAR | SQL_C_CHAR | SQLCHARACTER | varchar character varying char varying sysname |
SQL_LONGVARCHAR | SQL_C_CHAR | SQLCHARACTER | text |
SQL_WCHAR | SQL_C_WCHAR | SQLNCHAR | nchar |
SQL_WVARCHAR | SQL_C_WCHAR | SQLNVARCHAR | nvarchar |
SQL_WLONGVARCHAR | SQL_C_WCHAR | SQLNTEXT | ntext |
SQL_DECIMAL | SQL_C_CHAR | SQLCHARACTER | decimal dec money smallmoney |
SQL_NUMERIC | SQL_C_NUMERIC | SQLNUMERICN | numeric |
SQL_BIT | SQL_C_BIT | SQLBIT | bit |
SQL_TINYINT (符号付き) | SQL_C_SSHORT | SQLINT2 | smallint |
SQL_TINYINT (符号なし) | SQL_C_UTINYINT | SQLINT1 | tinyint |
SQL_SMALL_INT (符号付き) | SQL_C_SSHORT | SQLINT2 | smallint |
SQL_SMALL_INT (符号なし) | SQL_C_SLONG | SQLINT4 | int integer |
SQL_INTEGER (符号付き) | SQL_C_SLONG | SQLINT4 | int integer |
SQL_INTEGER (符号なし) | SQL_C_CHAR | SQLCHARACTER | decimal dec |
SQL_BIGINT (符号付きと符号なし) | SQL_C_CHAR | SQLCHARACTER | bigint |
SQL_REAL | SQL_C_FLOAT | SQLFLT4 | real |
SQL_FLOAT | SQL_C_DOUBLE | SQLFLT8 | float |
SQL_DOUBLE | SQL_C_DOUBLE | SQLFLT8 | float |
SQL_BINARY | SQL_C_BINARY | SQLBINARY | [バイナリ] timestamp |
SQL_VARBINARY | SQL_C_BINARY | SQLBINARY | varbinary binary varying |
SQL_LONGVARBINARY | SQL_C_BINARY | SQLBINARY | image |
SQL_TYPE_DATE | SQL_C_CHAR | SQLCHARACTER | datetime smalldatetime |
SQL_TYPE_TIME | SQL_C_CHAR | SQLCHARACTER | datetime smalldatetime |
SQL_TYPE_TIMESTAMP | SQL_C_CHAR | SQLCHARACTER | datetime smalldatetime |
SQL_GUID | SQL_C_GUID | SQLUNIQUEID | uniqueidentifier |
SQL_INTERVAL_ | SQL_C_CHAR | SQLCHARACTER | char |
SQL Server には、符号付き tinyint、符号なし smallint、または符号なし int データ型がありません。 これらのデータ型を移行するときにデータ値が失われるのを防ぐために、次に大きい整数データ型を持つ SQL Server テーブルを作成します。 ユーザーが後で元のデータ型で許可されている範囲外の値を追加できないようにするには、SQL Server 列にルールを適用して、元のソースのデータ型でサポートされている範囲に許容値を制限します。
CREATE TABLE Sample_Ints(STinyIntCol SMALLINT,
USmallIntCol INT)
GO
CREATE RULE STinyInt_Rule
AS
@range >= -128 AND @range <= 127
GO
CREATE RULE USmallInt_Rule
AS
@range >= 0 AND @range <= 65535
GO
sp_bindrule STinyInt_Rule, 'Sample_Ints.STinyIntCol'
GO
sp_bindrule USmallInt_Rule, 'Sample_Ints.USmallIntCol'
GO
SQL Server では、間隔データ型は直接サポートされていません。 ただし、アプリケーションでは、間隔エスケープ シーケンスを文字列として SQL Server の文字列に格納できます。 アプリケーションは後で使用するためにそれらを読み取ることができますが、Transact-SQL ステートメントでは使用できません。
一括コピー関数を使用すると、ODBC データ ソースから読み取られたデータを SQL Server にすばやく読み込むことができます。 SQLBindColを使用して結果セットの列をプログラム変数にバインドし、bcp_bindを使用して同じプログラム変数を一括コピー操作にバインドします。 SQLFetchScrollまたはSQLFetch を呼び出すと ODBC データ ソースからプログラム変数にデータの行がフェッチされ、bcp_sendrowを呼び出すと、プログラム変数から SQL Server にデータが一括コピーされます。
アプリケーションは、bcp_bind pData パラメーターで最初に指定されたデータ変数のアドレスを変更する必要がある場合は、いつでもbcp_colptr関数を使用できます。 アプリケーションは、bcp_bindcbData パラメーターで最初に指定されたデータ長を変更する必要がある場合は、いつでもbcp_collen関数を使用できます。
一括コピーを使用して SQL Server からプログラム変数にデータを読み取ることはできません。"bcp_readrow" 関数のようなものはありません。 実行できるのは、アプリケーションからサーバーへのデータの送信だけです。