테이블 값 매개 변수는 사용자 정의 테이블 유형을 통해 선언됩니다. 테이블 반환 매개 변수를 사용하면 임시 테이블이나 많은 매개 변수를 만들지 않고도 저장 프로시저 또는 함수와 같은 Transact-SQL 문이나 루틴에 여러 행의 데이터를 보낼 수 있습니다.
테이블 반환 매개 변수는 OLE DB 및 ODBC의 매개 변수 배열과 유사하지만 보다 유연하고 Transact-SQL과 보다 긴밀하게 통합합니다. 또한 테이블 값 매개변수는 집합 기반 작업에 사용할 수 있는 장점이 있습니다.
Transact-SQL은 입력 데이터의 복사본을 만들지 않기 위해 참조로 루틴에 테이블 반환 매개 변수를 전달합니다. 테이블 반환 매개 변수를 사용하여 Transact-SQL 루틴을 만들고 실행한 다음, 모든 관리 언어의 Transact-SQL 코드, 관리되는 클라이언트 및 기본 클라이언트에서 해당 루틴을 호출할 수 있습니다.
이 주제에서 다루는 내용:
Table-Valued 매개 변수 및 BULK INSERT 작업
혜택
테이블 값 매개 변수는 다른 매개 변수와 마찬가지로 저장 프로시저, 함수 또는 동적 Transact-SQL 텍스트 내에서 범위가 정해지며 사용됩니다. 마찬가지로 테이블 형식 변수에는 DECLARE 문을 사용하여 만든 다른 지역 변수와 같은 범위가 있습니다. 동적 Transact-SQL 문 내에서 테이블 반환 변수를 선언하고 이 변수를 저장 프로시저 및 함수에 테이블 반환 매개 변수로 전달할 수 있습니다.
테이블 반환 매개 변수는 매개 변수 목록을 전달하는 임시 테이블 또는 다른 방법보다 유연하며 경우에 따라 보다 뛰어난 성능을 제공합니다. 테이블 값 매개 변수가 제공하는 이점은 다음과 같습니다.
클라이언트에서 데이터를 처음으로 가져올 때는 잠금을 획득하지 마십시오.
간단한 프로그래밍 모델을 제공합니다.
단일 루틴에 복잡한 비즈니스 논리를 포함할 수 있습니다.
서버에 대한 왕복을 줄입니다.
다른 카디널리티의 테이블 구조가 있을 수 있습니다.
강력하게 형식화되어 있습니다.
클라이언트에서 정렬 순서와 고유 키를 지정할 수 있습니다.
저장 프로시저에 사용될 때 임시 테이블처럼 캐시됩니다. SQL Server 2012부터는 매개 변수가 있는 쿼리에 대해 테이블 반환 매개 변수도 캐시됩니다.
제한 사항
테이블 형식 매개 변수에는 다음과 같은 제한 사항이 있습니다.
SQL Server는 테이블 반환 매개 변수의 열에 대한 통계를 유지 관리하지 않습니다.
테이블 값 매개 변수는 Transact-SQL 루틴에 입력 READONLY 매개 변수로 전달되어야 합니다. 루틴 본문의 테이블 반환 매개 변수에 대해서는 UPDATE, DELETE 또는 INSERT와 같은 DML 작업을 수행할 수 없습니다.
SELECT INTO 또는 INSERT EXEC 문에서 테이블 값 매개 변수를 대상으로 사용할 수 없습니다. 테이블 반환 매개 변수는 SELECT INTO의 FROM 절 또는 INSERT EXEC 문자열 또는 저장 프로시저에 있을 수 있습니다.
Table-Valued 매개 변수와 BULK INSERT 작업 비교
테이블 반환 매개 변수 사용 방법은 집합 기반 변수를 사용하는 다른 방법과 비슷합니다. 그러나 대규모 데이터 집합의 경우 테이블 반환 매개 변수를 더 빠르게 자주 사용할 수 있습니다. 테이블 반환 매개 변수보다 시작 비용이 큰 대량 작업에 비해 테이블 반환 매개 변수는 1000개 미만의 행을 삽입하는 데 적합합니다.
테이블 값 매개변수가 재사용되면 임시 테이블 캐싱의 이점을 누릴 수 있습니다. 이 테이블 캐싱을 사용하면 동등한 BULK INSERT 작업보다 확장성이 향상됩니다. 작은 행 삽입 작업을 사용하면 BULK INSERT 작업 또는 테이블 반환 매개 변수 대신 매개 변수 목록 또는 일괄 처리된 문을 사용하여 작은 성능 이점을 얻을 수 있습니다. 그러나 이러한 방법은 프로그래밍에 덜 편리하며 행이 증가함에 따라 성능이 빠르게 저하됩니다.
테이블 값 매개 변수는 동등한 매개 변수 배열 구현보다 등거나 더 잘 수행됩니다.
예시
다음 예제에서는 Transact-SQL 사용하여 테이블 반환 매개 변수 형식을 만들고, 변수를 참조할 변수를 선언하고, 매개 변수 목록을 채운 다음, 저장 프로시저에 값을 전달하는 방법을 보여줍니다.
USE AdventureWorks2012;
GO
/* Create a table type. */
CREATE TYPE LocationTableType AS TABLE
( LocationName VARCHAR(50)
, CostRate INT );
GO
/* Create a procedure to receive data for the table-valued parameter. */
CREATE PROCEDURE dbo. usp_InsertProductionLocation
@TVP LocationTableType READONLY
AS
SET NOCOUNT ON
INSERT INTO AdventureWorks2012.Production.Location
(Name
,CostRate
,Availability
,ModifiedDate)
SELECT *, 0, GETDATE()
FROM @TVP;
GO
/* Declare a variable that references the type. */
DECLARE @LocationTVP AS LocationTableType;
/* Add data to the table variable. */
INSERT INTO @LocationTVP (LocationName, CostRate)
SELECT Name, 0.00
FROM AdventureWorks2012.Person.StateProvince;
/* Pass the table variable data to a stored procedure. */
EXEC usp_InsertProductionLocation @LocationTVP;
GO
또한 참조하십시오
CREATE TYPE(Transact-SQL)
DECLARE @local_variable (Transact-SQL)
sys.types(Transact-SQL)
sys.parameters(Transact-SQL)
sys.parameter_type_usages(Transact-SQL)
CREATE PROCEDURE(Transact-SQL)
함수 생성하기(Transact-SQL)