次の方法で共有


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

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics 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 に 配置します。 一括コピーするデータの長さが変更されるたびに、cbData をリセットするためにbcp_collenを呼び出します。 他の 2 つのメソッドのいずれかが使用されている場合は、cbData のSQL_VARLEN_DATAを 指定します。 列に指定されるすべてのデータ値が NULL の場合は、cbData にSQL_NULL_DATAを指定します。

  • インジケーター変数を使用します。 新しい各データ値をデータ変数に移動するときに、その値の長さをインジケーター変数に格納します。 他の 2 つのメソッドのいずれかが使用されている場合は、cbIndicator に 0 を 指定します

  • ターミネータ ポインターを使用します。 データを終了する ビット パターンのアドレスを使用して、bcp_bindpTerm パラメーターを読み込みます。 他の 2 つのメソッドのいずれかが使用されている場合は、pTerm に NULL を 指定します

これらの 3 つのメソッドはすべて、同じ bcp_bind 呼び出しで使用できます。この場合、コピーされるデータの量が最小になる仕様が使用されます。

bcp_bindパラメーターでは、ODBC データ型識別子ではなく、DB-Library データ型識別子が使用されます。 DB-Library データ型識別子は、ODBC bcp_bind 関数で使用するために sqlncli.h で定義されています。

一括コピー関数では、すべての ODBC C データ型をサポートしているわけではありません。 たとえば、一括コピー関数は ODBC SQL_C_TYPE_TIMESTAMP構造体をサポートしていないため、SQLBindCol または SQLGetData を使用して ODBC SQL_TYPE_TIMESTAMP データをSQL_C_CHAR変数に変換します。 その後、bcp_bindを SQLCHARACTER の型パラメーターと共に使用して変数を SQL Server の datetime 列にバインドすると、一括コピー関数は文字変数のタイムスタンプ エスケープ句を適切な datetime 形式に変換します。

次の表に、ODBC SQL データ型から SQL Server データ型へのマッピングで使用する推奨されるデータ型を示します。

ODBC SQL データ型 ODBC C データ型 bcp_bind型パラメーター 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、unsigned smallint、または unsigned 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_bind cbData パラメーターで最初に指定されたデータ長を変更する必要がある場合は、いつでもbcp_collen関数を使用できます。

一括コピーを使用して SQL Server からプログラム変数にデータを読み取ることはできません。"bcp_readrow" 関数のようなものはありません。 実行できるのは、アプリケーションからサーバーへのデータの送信だけです。

参照

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