이 항목에서는 모든 값이 메모리에 있을 때 저장 프로시저에 데이터를 테이블 반환 매개 변수로 보내는 방법을 설명합니다. 테이블 반환 매개 변수를 보여주는 다른 샘플은 ODBC(Table-Valued 매개 변수 사용)를 참조하세요.
전제 조건
이 절차에서는 서버에서 다음 Transact-SQL 실행되었다고 가정합니다.
create type TVParam as table(ProdCode integer, Qty integer)
create procedure TVPOrderEntry(@CustCode varchar(5), @Items TVPParam,
@OrdNo integer output, @OrdDate datetime output)
as
set @OrdDate = GETDATE();
insert into TVPOrd (OrdDate, CustCode)
values (@OrdDate, @CustCode) output OrdNo);
select @OrdNo = SCOPE_IDENTITY();
insert into TVPItem (OrdNo, ProdCode, Qty)
select @OrdNo, @Items.ProdCode, @Items.Qty
from @Items
데이터를 보내려면
SQL 매개 변수에 대한 변수를 선언합니다. 이 경우 테이블 값은 전적으로 메모리에 저장되므로 테이블 값의 열 값은 배열로 선언됩니다.
SQLRETURN r; // Variables for SQL parameters. #define ITEM_ARRAY_SIZE 20 SQLCHAR CustCode[6]; SQLCHAR *TVP = (SQLCHAR *) "TVParam"; SQLINTEGER ProdCode[ITEM_ARRAY_SIZE], Qty[ITEM_ARRAY_SIZE]; SQLINTEGER OrdNo; char OrdDate[23]; // Variables for indicator/length variables associated with parameters. SQLLEN cbCustCode, cbTVP, cbProdCode[ITEM_ARRAY_SIZE], cbQty[ITEM_ARRAY_SIZE], cbOrdNo, cbOrdDate;매개 변수를 바인딩합니다. 바인딩 매개 변수는 테이블 반환 매개 변수를 사용하는 두 단계 프로세스입니다. 첫 번째 단계에서 저장 프로시저의 단계 매개 변수는 다음과 같이 일반적인 방식으로 바인딩됩니다.
// Bind parameters for call to TVPOrderEntryDirect. // 1 - Custcode input r = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT,SQL_VARCHAR, SQL_C_CHAR, 5, 0, CustCode, sizeof(CustCode), &cbCustCode); // 2 - Items TVP r = SQLBindParameter(hstmt, 2,// ParameterNumber SQL_PARAM_INPUT,// InputOutputType SQL_C_DEFAULT,// ValueType SQL_SS_TABLE,// Parametertype ITEM_ARRAY_SIZE,// ColumnSize: For a table-valued parameter this is the row array size. 0,// DecimalDigits: For a table-valued parameter this is always 0. TVP,// ParameterValuePtr: For a table-valued parameter this is the type name of the //table-valued parameter, and also a token returned by SQLParamData. SQL_NTS,// BufferLength: For a table-valued parameter this is the length of the type name or SQL_NTS. &cbTVP);// StrLen_or_IndPtr: For a table-valued parameter this is the number of rows actually used. // 3 - OrdNo output r = SQLBindParameter(hstmt, 3, SQL_PARAM_OUTPUT,SQL_INTEGER, SQL_C_LONG, 0, 0, &OrdNo, sizeof(SQLINTEGER), &cbOrdNo); // 4 - OrdDate output r = SQLBindParameter(hstmt, 4, SQL_PARAM_OUTPUT,SQL_TYPE_TIMESTAMP, SQL_C_CHAR, 23, 3, &OrdDate, sizeof(OrdDate), &cbOrdDate);매개 변수 바인딩의 두 번째 단계는 테이블 반환 매개 변수의 열을 바인딩하는 것입니다. 매개 변수 포커스는 먼저 테이블 반환 매개 변수의 서수로 설정됩니다. 그런 다음 테이블 값의 열은 저장 프로시저의 매개 변수인 경우와 동일한 방식으로 SQLBindParameter를 사용하지만 ParameterNumber에 대한 열 서수를 사용하여 바인딩됩니다. 테이블 반환 매개 변수가 더 많은 경우 각 매개 변수에 포커스를 차례로 설정하고 해당 열을 바인딩합니다. 마지막으로 매개 변수 포커스가 0으로 다시 설정됩니다.
// Bind columns for the table-valued parameter (param 2). // First set focus on param 2. r = SQLSetStmtAttr(hstmt, SQL_SOPT_SS_PARAM_FOCUS, (SQLPOINTER) 2, SQL_IS_INTEGER); // Col 1 - ProdCode r = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT,SQL_INTEGER, SQL_C_LONG, 0, 0, ProdCode, sizeof(SQLINTEGER), cbProdCode); // Col 2 - Qty r = SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT,SQL_INTEGER, SQL_C_LONG, 0, 0, Qty, sizeof(SQLINTEGER), cbQty); // Reset param focus. r = SQLSetStmtAttr(hstmt, SQL_SOPT_SS_PARAM_FOCUS, (SQLPOINTER) 0, SQL_IS_INTEGER);매개 변수 버퍼를 채웁니다.
cbTVP은 서버로 보낼 행 수로 설정됩니다.// Populate parameters. cbTVP = 0; // Number of rows available for input. strcpy_s((char *) CustCode, sizeof(CustCode), "CUST1"); cbCustCode = SQL_NTS; ProdCode[cbTVP] = 1215;cbProdCode[cbTVP] = sizeof(SQLINTEGER); Qty[cbTVP] = 5;cbQty[cbTVP] = sizeof(SQLINTEGER); cbTVP++; // Number of rows available for input ProdCode[cbTVP] = 1017;cbProdCode[cbTVP] = sizeof(SQLINTEGER); Qty[cbTVP] = 2;cbQty[cbTVP] = sizeof(SQLINTEGER); cbTVP++; // Number of rows available for input.프로시저를 호출합니다.
// Call the procedure. r = SQLExecDirect(hstmt, (SQLCHAR *) "{call TVPOrderEntry(?, ?, ?, ?)}",SQL_NTS);