プログラム変数からの一括コピー

適用対象: 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" 関数のようなものはありません。 実行できるのは、アプリケーションからサーバーへのデータの送信だけです。

参照

一括コピー操作の実行 (ODBC)