Share via


프로그램 변수에서 대량 복사

적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System(PDW)

프로그램 변수에서 직접 대량 복사할 수 있습니다. 행에 대한 데이터를 저장할 변수를 할당하고 bcp_init 호출하여 대량 복사를 시작한 후 각 열에 대한 bcp_bind 호출하여 열과 연결할 프로그램 변수의 위치와 형식을 지정합니다. 각 변수를 데이터로 채운 다음 bcp_sendrow 호출하여 한 행의 데이터를 서버로 보냅니다. 모든 행이 서버로 전송될 때까지 변수를 채우고 bcp_sendrow 호출하는 프로세스를 반복한 다음 bcp_done 호출하여 작업이 완료되도록 지정합니다.

bcp_bindpData 매개 변수에는 열에 바인딩되는 변수의 주소가 포함됩니다. 각 열의 데이터는 다음 두 가지 방법 중 하나로 저장할 수 있습니다.

  • 데이터를 보유할 변수 할당

  • 데이터 변수 바로 뒤에 표시기 변수를 할당합니다.

표시자 변수는 가변 길이 열의 데이터 길이를 나타내고 열이 NULL을 허용하는 경우 NULL 값을 나타내기도 합니다. 데이터 변수만 사용하는 경우 이 변수의 주소는 bcp_bindpData 매개 변수에 저장됩니다. 표시자 변수를 사용하는 경우에는 표시자 변수의 주소가 bcp_bindpData 매개 변수에 저장됩니다. 대량 복사 함수는 bcp_bindcbIndicatorpData 매개 변수를 추가하여 데이터 변수의 위치를 계산합니다.

bcp_bind 가변 길이 데이터를 처리하는 세 가지 방법을 지원합니다.

  • 데이터 변수 하나만 있는 cbData 사용. 데이터 길이를 cbData에 저장합니다. 대량 복사할 데이터의 길이가 변경될 때마다 bcp_collen 호출하여 cbData를 다시 설정합니다. 다른 두 메서드 중 하나를 사용하는 경우 cbData에 대한 SQL_VARLEN_DATA 지정합니다. 열에 대해 제공되는 모든 데이터 값이 NULL인 경우 cbData에 대한 SQL_NULL_DATA 지정합니다.

  • 표시기 변수를 사용합니다. 각 새 데이터 값이 데이터 변수로 이동되면 값의 길이를 표시기 변수에 저장합니다. 다른 두 메서드 중 하나를 사용하는 경우 cbIndicator에 대해 0을 지정합니다.

  • 종결자 포인터를 사용합니다. 데이터를 종료하는 비트 패턴 주소를 사용하여 bcp_bindpTerm 매개 변수를 로드합니다. 다른 두 메서드 중 하나를 사용하는 경우 pTerm에 대해 NULL을 지정합니다.

이러한 세 가지 메서드는 모두 동일한 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 변수로 변환합니다. 그런 다음 SQLCHARACTER의 형식 매개 변수와 함께 bcp_bind 사용하여 변수를 SQL Server datetime 열에 바인딩하는 경우 대량 복사 함수는 문자 변수의 타임스탬프 이스케이프 절을 적절한 datetime 형식으로 변환합니다.

다음 표에서는 ODBC SQL 데이터 형식에서 SQL Server 데이터 형식으로 매핑하는 데 사용할 권장 데이터 형식을 나열합니다.

ODBC SQLdata 형식 ODBC C 데이터 형식 bcp_bind type 매개 변수 SQL Server 데이터 형식
SQL_CHAR SQL_C_CHAR SQLCHARACTER character

char
SQL_VARCHAR SQL_C_CHAR SQLCHARACTER varchar

문자 변경

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 binary

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_bind cbData 매개 변수에 원래 지정된 데이터 길이를 변경해야 할 경우에는bcp_collen 함수를 사용할 수 있습니다.

대량 복사를 사용하여 SQL Server에서 프로그램 변수로 데이터를 읽을 수 없습니다. "bcp_readrow" 함수와 같은 것은 없습니다. 애플리케이션에서 서버로 데이터를 보낼 수만 있습니다.

참고 항목

대량 복사 작업 수행(ODBC)