table(Transact-SQL)table (Transact-SQL)

적용 대상: 예SQL Server 예Azure SQL Database 아니요Azure SQL Data Warehouse 아니요병렬 데이터 웨어하우스 APPLIES TO: yesSQL Server yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

나중에 처리하기 위해 결과 집합을 저장하는 데 사용되는 특별한 데이터 형식입니다.Is a special data type used to store a result set for processing at a later time. table은 주로 테이블 반환 함수의 결과 집합으로 반환되는 행 집합을 임시로 저장하는 데 사용됩니다.table is primarily used for temporarily storing a set of rows that are returned as the table-valued function result set. 테이블은 주로 테이블 반환 함수의 결과 집합으로 반환되는 행 집합을 임시로 저장하는 데 사용됩니다.Functions and variables can be declared to be of type table. 테이블 변수는 함수, 저장 프로시저 및 일괄 처리에 사용할 수 있습니다.table variables can be used in functions, stored procedures, and batches. 테이블 유형의 변수를 선언하려면 DECLARE @local_variable를 사용합니다.To declare variables of type table, use DECLARE @local_variable.

적용 대상: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 ~ SQL Server 2017SQL Server 2017), Azure SQL 데이터베이스Azure SQL DatabaseApplies to: SQL ServerSQL Server (SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017), Azure SQL 데이터베이스Azure SQL Database.

항목 링크 아이콘 Transact-SQL 구문 규칙Topic link icon Transact-SQL Syntax Conventions

구문Syntax

table_type_definition ::=   
    TABLE ( { <column_definition> | <table_constraint> } [ ,...n ] )   
  
<column_definition> ::=   
    column_name scalar_data_type   
    [ COLLATE <collation_definition> ]   
    [ [ DEFAULT constant_expression ] | IDENTITY [ ( seed , increment ) ] ]   
    [ ROWGUIDCOL ]   
    [ column_constraint ] [ ...n ]   
  
 <column_constraint> ::=   
    { [ NULL | NOT NULL ]   
    | [ PRIMARY KEY | UNIQUE ]   
    | CHECK ( logical_expression )   
    }   
  
<table_constraint> ::=   
     { { PRIMARY KEY | UNIQUE } ( column_name [ ,...n ] )  
     | CHECK ( logical_expression )   
     }   

인수Arguments

table_type_definitiontable_type_definition
CREATE TABLE에서 테이블을 정의하는 데 사용되는 정보의 같은 하위 집합입니다.Is the same subset of information that is used to define a table in CREATE TABLE. 테이블 선언에는 열 정의, 이름, 데이터 형식 및 제약 조건 등이 포함되며The table declaration includes column definitions, names, data types, and constraints. 허용되는 제약 조건 유형은 PRIMARY KEY, UNIQUE KEY 및 NULL뿐입니다.The only constraint types allowed are PRIMARY KEY, UNIQUE KEY, and NULL.
구문에 대한 자세한 내용은 CREATE TABLE (Transact-SQL), CREATE FUNCTION (Transact-SQL)DECLARE @local_variable (Transact-SQL)을 참조하세요.For more information about the syntax, see CREATE TABLE (Transact-SQL), CREATE FUNCTION (Transact-SQL), and DECLARE @local_variable (Transact-SQL).

collation_definitioncollation_definition
MicrosoftMicrosoft Windows 로캘 및 비교 스타일, Windows 로캘 및 이진 표기법 또는 MicrosoftMicrosoft SQL ServerSQL Server 데이터 정렬로 구성된 열의 데이터 정렬입니다.Is the collation of the column that is made up of a MicrosoftMicrosoft Windows locale and a comparison style, a Windows locale, and the binary notation, or a MicrosoftMicrosoft SQL ServerSQL Server collation. collation_definition을 지정하지 않으면 현재 데이터베이스의 데이터 정렬이 해당 열에 상속됩니다.If collation_definition isn't specified, the column inherits the collation of the current database. 또는 CLR(공용 언어 런타임) 사용자 정의 형식으로 열을 정의할 경우 사용자 정의 형식의 데이터 정렬이 해당 열에 상속됩니다.Or if the column is defined as a common language runtime (CLR) user-defined type, the column inherits the collation of the user-defined type.

RemarksRemarks

테이블 다음 예에서와 같이 일괄 처리의 FROM 절에서 이름으로 변수를 참조합니다.table Reference variables by name in a batch's FROM clause, as shown the following example:

SELECT Employee_ID, Department_ID FROM @MyTableVar;  

FROM 절 밖에서는 다음 예에서와 같이 별칭을 사용하여 테이블 변수를 참조해야 합니다.Outside a FROM clause, table variables must be referenced by using an alias, as shown in the following example:

SELECT EmployeeID, DepartmentID   
FROM @MyTableVar m  
JOIN Employee on (m.EmployeeID =Employee.EmployeeID AND  
   m.DepartmentID = Employee.DepartmentID);  

테이블 변수는 변경되지 않는 쿼리 계획이 있는 소규모 쿼리의 경우와 다시 컴파일 기능이 중요한 경우에 다음과 같은 이점을 제공합니다.table variables provide the following benefits for small-scale queries that have query plans that don't change and when recompilation concerns are dominant:

  • 테이블 변수는 지역 변수처럼 작동하며A table variable behaves like a local variable. 잘 정의된 범위를 가집니다.It has a well-defined scope. 이 변수는 변수가 선언된 함수, 저장 프로시저 또는 일괄 처리입니다.This variable is the function, stored procedure, or batch that it's declared in.
    범위 내에서 일반 테이블처럼 테이블 변수를 사용할 수 있으며Within its scope, a table variable can be used like a regular table. SELECT, INSERT, UPDATE 및 DELETE 문에서 테이블 또는 테이블 식이 사용되는 어디에나 적용할 수 있습니다.It may be applied anywhere a table or table expression is used in SELECT, INSERT, UPDATE, and DELETE statements. 그러나 다음 문에서는 테이블을 사용할 수 없습니다.However, table can't be used in the following statement:
SELECT select_list INTO table_variable;

테이블 변수는 변수가 정의된 함수, 저장 프로시저 및 일괄 처리가 끝나면 자동으로 정리됩니다.table variables are automatically cleaned up at the end of the function, stored procedure, or batch in which they're defined.

  • 저장 프로시저에 테이블 변수를 사용하면 성능에 영향을 주는 비용 기반 선택 사항이 없는 경우 임시 테이블을 사용할 때보다 저장 프로시저를 다시 컴파일하는 횟수가 줄어듭니다.table variables that are used in stored procedures cause fewer stored procedure recompilations than when temporary tables are used when there are no cost-based choices that affect performance.
  • 테이블 변수와 관련된 트랜잭션은 테이블 변수가 업데이트되는 동안만 지속됩니다.Transactions involving table variables last only for the duration of an update on the table variable. 따라서 테이블 변수를 사용하면 리소스의 잠금과 로깅에 대한 요구가 줄어듭니다.As such, table variables require less locking and logging resources.

제한 사항Limitations and restrictions

테이블 변수에는 배포 통계가 없습니다.Table variables don't have distribution statistics. 이 변수는 다시 컴파일을 트리거하지 않습니다.They won't trigger recompiles. 대부분의 경우 최적화 프로그램은 테이블 변수에 행이 없다는 가정 하에 쿼리 계획을 빌드합니다.In many cases, the optimizer will build a query plan on the assumption that the table variable has no rows. 이러한 이유로, 많은 수의 행(100개 이상)을 예상하는 경우 테이블 변수를 사용할 때 주의해야 합니다.For this reason, you should be cautious about using a table variable if you expect a larger number of rows (greater than 100). 이러한 경우 임시 테이블이 좋은 해결책일 수 있습니다.Temp tables may be a better solution in this case. 테이블 변수를 다른 테이블에 조인하는 쿼리의 경우 RECOMPILE 힌트를 사용하세요. 그러면 최적화 프로그램이 테이블 변수에 올바른 카디널리티를 사용합니다.For queries that join the table variable with other tables, use the RECOMPILE hint, which will cause the optimizer to use the correct cardinality for the table variable.

SQL ServerSQL Server 최적화 프로그램의 비용 기반 추론 모델에서는 테이블 변수가 지원되지 않습니다.table variables aren't supported in the SQL ServerSQL Server optimizer's cost-based reasoning model. 따라서 효율적인 쿼리 계획을 얻기 위해 비용 기반 선택이 필요한 경우에는 이 변수를 사용하면 안 됩니다.As such, they shouldn't be used when cost-based choices are required to achieve an efficient query plan. 비용 기반 선택이 필요한 경우에는 임시 테이블이 적절합니다.Temporary tables are preferred when cost-based choices are required. 이 계획에는 일반적으로 조인, 병렬 처리 결정 및 인덱스 선택 사항 선택을 사용하는 쿼리가 포함됩니다.This plan typically includes queries with joins, parallelism decisions, and index selection choices.

테이블 변수를 수정하는 쿼리는 병렬 쿼리 실행 계획을 생성하지 않습니다.Queries that modify table variables don't generate parallel query execution plans. 테이블 변수나 복잡한 쿼리의 테이블 변수를 수정하면 성능에 영향을 줄 수 있습니다.Performance can be affected when large table variables, or table variables in complex queries, are modified. 테이블 변수가 수정되는 경우에는 임시 테이블을 대신 사용하는 것이 좋습니다.Consider using temporary tables instead in situations where table variables are modified. 자세한 내용은 CREATE TABLE(Transact-SQL)을 참조하세요.For more information, see CREATE TABLE (Transact-SQL). 수정하지 않고 테이블 변수를 읽는 쿼리는 병렬 처리할 수 있습니다.Queries that read table variables without modifying them can still be parallelized.

명시적으로 테이블 변수에 대한 인덱스를 만들 수 없으며 테이블 변수에 대한 통계는 유지되지 않습니다.Indexes can't be created explicitly on table variables, and no statistics are kept on table variables. SQL Server 2014(12.x)SQL Server 2014 (12.x)부터, 테이블 정의와 함께 특정 인덱스 유형을 인라인으로 만들 수 있는 새 구문이 도입되었습니다.Starting with SQL Server 2014(12.x)SQL Server 2014 (12.x), new syntax was introduced which allows you to create certain index types inline with the table definition. 이 새 구문을 사용하여 테이블 정의의 일부로 테이블 변수의 인덱스를 만들 수 있습니다.Using this new syntax, you can create indexes on table variables as part of the table definition. 경우에 따라 전체 인덱스 지원과 통계를 제공하는 임시 테이블을 대신 사용하여 성능을 향상할 수도 있습니다.In some cases, performance may improve by using temporary tables instead, which provide full index support and statistics. 임시 테이블 및 인라인 인덱스 만들기에 대한 자세한 내용은 CREATE TABLE (Transact-SQL)을 참조하세요.For more information about temporary tables and inline index creation, see CREATE TABLE (Transact-SQL).

테이블 형식 선언 내의 CHECK 제약 조건, DEFAULT 값 및 계산 열은 사용자 정의 함수를 호출할 수 없습니다.CHECK constraints, DEFAULT values, and computed columns in the table type declaration can't call user-defined functions.

테이블 변수 간의 할당 작업은 지원되지 않습니다.Assignment operation between table variables isn't supported.

테이블 변수는 제한된 범위를 가지며 영구 데이터베이스의 일부가 아니므로 트랜잭션 롤백의 영향을 받지 않습니다.Because table variables have limited scope and aren't part of the persistent database, transaction rollbacks don't affect them.

테이블 변수는 생성 후 변경할 수 없습니다.Table variables can't be altered after creation.

테이블 변수 지연 컴파일Table variable deferred compilation

테이블 변수 지연 컴파일은 테이블 변수를 참조하는 쿼리의 플랜 품질 및 전체 성능을 개선합니다.Table variable deferred compilation improves plan quality and overall performance for queries referencing table variables. 최적화 및 초기 플랜 컴파일 중에 이 기능은 실제 테이블 변수 행 수를 기반으로 하는 카디널리티 예측을 전파합니다.During optimization and initial plan compilation, this feature will propagate cardinality estimates that are based on actual table variable row counts. 이 정확한 행 수 정보는 다운스트림 계획 작업을 최적화하는 데 사용됩니다.This exact row count information will then be used for optimizing downstream plan operations.

참고

테이블 변수 지연 컴파일은 Azure SQL 데이터베이스Azure SQL DatabaseSQL Server 2019 (15.x)SQL Server 2019 (15.x)의 공개 미리 보기 기능입니다.Table variable deferred compilation is a public preview feature in Azure SQL 데이터베이스Azure SQL Database and SQL Server 2019 (15.x)SQL Server 2019 (15.x).

테이블 변수 지연 컴파일을 사용하면 테이블 변수를 참조하는 문 컴파일은 문이 실제로 처음 실행될 때까지 지연됩니다.With table variable deferred compilation, compilation of a statement that references a table variable is deferred until the first actual execution of the statement. 이 지연 컴파일 동작은 임시 테이블의 동작과 동일합니다.This deferred compilation behavior is identical to the behavior of temporary tables. 이 변경으로 인해 원래 1행 추측 대신에 실제 카디널리티가 사용됩니다.This change results in the use of actual cardinality instead of the original one-row guess.

테이블 변수 지연 컴파일의 공개 미리 보기를 사용하도록 설정하려면 쿼리가 실행될 때 연결된 데이터베이스의 데이터베이스 호환성 수준 150을 사용하도록 설정합니다.To enable the public preview of table variable deferred compilation, enable database compatibility level 150 for the database you're connected to when the query runs.

테이블 변수 지연 컴파일은 테이블 변수의 다른 특성을 변경하지 않습니다.Table variable deferred compilation doesn't change any other characteristics of table variables. 예를 들어 이 기능은 테이블 변수에 열 통계를 추가하지 않습니다.For example, this feature doesn't add column statistics to table variables.

테이블 변수 지연 컴파일은 다시 컴파일 빈도를 늘리지 않습니다.Table variable deferred compilation doesn't increase recompilation frequency. 대신 초기 컴파일이 발생하는 위치를 이동합니다.Rather, it shifts where the initial compilation occurs. 그 결과로 캐시된 계획은 초기 지연 컴파일 테이블 변수 행 개수를 기반으로 생성됩니다.The resulting cached plan generates based on the initial deferred compilation table variable row count. 캐시된 계획은 연속 쿼리에서 다시 사용됩니다.The cached plan is reused by consecutive queries. 해당 계획은 계획이 제거되거나 다시 컴파일될 때까지 다시 사용됩니다.It's reused until the plan is evicted or recompiled.

초기 계획 컴파일에 사용되는 테이블 변수 행 개수는 일반적인 값이 고정된 행 개수 추측과 다를 수 있음을 나타냅니다.Table variable row count that is used for initial plan compilation represents a typical value might be different from a fixed row count guess. 이러한 행 개수가 다른 경우 다운스트림 작업에 도움이 됩니다.If it's different, downstream operations will benefit. 테이블 변수 행 개수가 실행 간에 크게 달라지는 경우, 이 기능으로 성능이 향상되지 않을 수 있습니다.Performance may not be improved by this feature if the table variable row count varies significantly across executions.

호환성 수준을 변경하지 않고 테이블 변수 지연 컴파일 비활성화Disabling table variable deferred compilation without changing the compatibility level

데이터베이스 호환성 수준 150 이상을 유지하면서 데이터베이스 또는 문 범위에서 테이블 변수 지연 컴파일을 사용하지 않도록 설정합니다.Disable table variable deferred compilation at the database or statement scope while still maintaining database compatibility level 150 and higher. 데이터베이스에서 발생하는 모든 쿼리 실행에 대한 테이블 변수 지연 컴파일을 사용하지 않도록 설정하려면 해당 데이터베이스의 컨텍스트 내에서 다음 예제를 실행합니다.To disable table variable deferred compilation for all query executions originating from the database, execute the following example within the context of the applicable database:

ALTER DATABASE SCOPED CONFIGURATION SET DEFERRED_COMPILATION_TV = OFF;

데이터베이스에서 발생하는 모든 쿼리 실행에 대한 테이블 변수 지연 컴파일을 다시 사용하도록 설정하려면 해당 데이터베이스의 컨텍스트 내에서 다음 예제를 실행합니다.To re-enable table variable deferred compilation for all query executions originating from the database, execute the following example within the context of the applicable database:

ALTER DATABASE SCOPED CONFIGURATION SET DEFERRED_COMPILATION_TV = ON;

DISABLE_DEFERRED_COMPILATION_TV를 USE HINT 쿼리 힌트로 할당하여 특정 쿼리에 대한 테이블 변수 지연 컴파일을 사용하지 않도록 설정할 수도 있습니다.You can also disable table variable deferred compilation for a specific query by assigning DISABLE_DEFERRED_COMPILATION_TV as a USE HINT query hint. 예를 들어For example:

DECLARE @LINEITEMS TABLE 
    (L_OrderKey INT NOT NULL,
     L_Quantity INT NOT NULL
    );

INSERT @LINEITEMS
SELECT L_OrderKey, L_Quantity
FROM dbo.lineitem
WHERE L_Quantity = 5;

SELECT  O_OrderKey,
    O_CustKey,
    O_OrderStatus,
    L_QUANTITY
FROM    
    ORDERS,
    @LINEITEMS
WHERE   O_ORDERKEY  =   L_ORDERKEY
    AND O_OrderStatus = 'O'
OPTION (USE HINT('DISABLE_DEFERRED_COMPILATION_TV'));

Examples

1.A. 테이블 형식의 변수 선언Declaring a variable of type table

다음 예에서는 UPDATE 문의 OUTPUT 절에서 지정된 값을 저장하는 table 변수를 만듭니다.The following example creates a table variable that stores the values specified in the OUTPUT clause of the UPDATE statement. 각각 SELECT의 값과 @MyTableVar 테이블의 업데이트 작업 결과를 반환하는 두 개의 Employee 문이 이어집니다.Two SELECT statements follow that return the values in @MyTableVar and the results of the update operation in the Employee table. INSERTED.ModifiedDate 열의 결과 값은 Employee 테이블의 ModifiedDate 열 값과 다릅니다.Results in the INSERTED.ModifiedDate column differ from the values in the ModifiedDate column in the Employee table. 이 차이는 AFTER UPDATE 값을 현재 날짜로 업데이트하는 ModifiedDate 트리거가 Employee 테이블에 정의되어 있기 때문에 나타납니다.This difference is because the AFTER UPDATE trigger, which updates the value of ModifiedDate to the current date, is defined on the Employee table. 그러나 OUTPUT에서 반환된 열은 트리거가 실행되기 전의 데이터를 반영합니다.However, the columns returned from OUTPUT reflect the data before triggers are fired. 자세한 내용은 OUTPUT Clause(Transact-SQL)를 참조하세요.For more information, see OUTPUT Clause (Transact-SQL).

USE AdventureWorks2012;  
GO  
DECLARE @MyTableVar table(  
    EmpID int NOT NULL,  
    OldVacationHours int,  
    NewVacationHours int,  
    ModifiedDate datetime);  
UPDATE TOP (10) HumanResources.Employee  
SET VacationHours = VacationHours * 1.25   
OUTPUT INSERTED.BusinessEntityID,  
       DELETED.VacationHours,  
       INSERTED.VacationHours,  
       INSERTED.ModifiedDate  
INTO @MyTableVar;  
--Display the result set of the table variable.  
SELECT EmpID, OldVacationHours, NewVacationHours, ModifiedDate  
FROM @MyTableVar;  
GO  
--Display the result set of the table.  
--Note that ModifiedDate reflects the value generated by an  
--AFTER UPDATE trigger.  
SELECT TOP (10) BusinessEntityID, VacationHours, ModifiedDate  
FROM HumanResources.Employee;  
GO  

2.B. 인라인 테이블 반환 함수 만들기Creating an inline table-valued function

다음 예에서는 인라인 테이블 반환 함수를 반환합니다.The following example returns an inline table-valued function. ProductID 열, Name 열, 그리고 대리점에 판매된 각 제품에 대한 대리점별 총 연간 매출의 집계를 YTD Total 열로 반환합니다.It returns three columns ProductID, Name, and the aggregate of year-to-date totals by store as YTD Total for each product sold to the store.

USE AdventureWorks2012;  
GO  
IF OBJECT_ID (N'Sales.ufn_SalesByStore', N'IF') IS NOT NULL  
    DROP FUNCTION Sales.ufn_SalesByStore;  
GO  
CREATE FUNCTION Sales.ufn_SalesByStore (@storeid int)  
RETURNS TABLE  
AS  
RETURN   
(  
    SELECT P.ProductID, P.Name, SUM(SD.LineTotal) AS 'Total'  
    FROM Production.Product AS P   
    JOIN Sales.SalesOrderDetail AS SD ON SD.ProductID = P.ProductID  
    JOIN Sales.SalesOrderHeader AS SH ON SH.SalesOrderID = SD.SalesOrderID  
    JOIN Sales.Customer AS C ON SH.CustomerID = C.CustomerID  
    WHERE C.StoreID = @storeid  
    GROUP BY P.ProductID, P.Name  
);  
GO  

함수를 호출하려면 이 쿼리를 실행하세요.To invoke the function, run this query.

SELECT * FROM Sales.ufn_SalesByStore (602);  

관련 항목:See also

COLLATE(Transact-SQL)COLLATE (Transact-SQL)
CREATE FUNCTION(Transact-SQL)CREATE FUNCTION (Transact-SQL)
사용자 정의 함수User-Defined Functions
CREATE TABLE(Transact-SQL)CREATE TABLE (Transact-SQL)
DECLARE @local_variable&#40;Transact-SQL&#41;DECLARE @local_variable (Transact-SQL)
테이블 반환 매개 변수 사용(Database Engine)Use Table-Valued Parameters (Database Engine)
쿼리 힌트(Transact-SQL)Query Hints (Transact-SQL)