적용 대상:Applies to: 예SQL ServerSQL Server(지원되는 모든 버전)yesSQL ServerSQL Server (all supported versions) 예Azure SQL DatabaseAzure SQL DatabaseYesAzure SQL DatabaseAzure SQL Database 예Azure SQL Managed InstanceAzure SQL Managed InstanceYesAzure SQL Managed InstanceAzure SQL Managed Instance 예Azure Synapse AnalyticsAzure Synapse AnalyticsyesAzure Synapse AnalyticsAzure Synapse Analytics 예병렬 데이터 웨어하우스Parallel Data Warehouseyes병렬 데이터 웨어하우스Parallel Data Warehouse적용 대상:Applies to: 예SQL ServerSQL Server(지원되는 모든 버전)yesSQL ServerSQL Server (all supported versions) 예Azure SQL DatabaseAzure SQL DatabaseYesAzure SQL DatabaseAzure SQL Database 예Azure SQL Managed InstanceAzure SQL Managed InstanceYesAzure SQL Managed InstanceAzure SQL Managed Instance 예Azure Synapse AnalyticsAzure Synapse AnalyticsyesAzure Synapse AnalyticsAzure Synapse Analytics 예병렬 데이터 웨어하우스Parallel Data Warehouseyes병렬 데이터 웨어하우스Parallel Data Warehouse

쿼리에 의해 내용(열과 행)이 정의되는 가상 테이블을 만듭니다.Creates a virtual table whose contents (columns and rows) are defined by a query. 이 문을 사용하여 데이터베이스에서 하나 이상의 테이블에 있는 데이터의 뷰를 만들 수 있습니다.Use this statement to create a view of the data in one or more tables in the database. 예를 들어 뷰는 다음과 같은 용도로 사용할 수 있습니다.For example, a view can be used for the following purposes:

  • 각 사용자가 데이터베이스를 보는 시각에 초점을 맞추고 데이터 조작을 간소화하며 사용자 지정할 수 있습니다.To focus, simplify, and customize the perception each user has of the database.

  • 뷰는 원본이 되는 기본 테이블에 직접 액세스할 수 있는 권한을 부여하지 않고 뷰를 통해 데이터에 액세스하도록 하기 때문에 보안 메커니즘으로 사용할 수 있습니다.As a security mechanism by allowing users to access data through the view, without granting the users permissions to directly access the underlying base tables.

  • 이전 버전과 호환되는 인터페이스를 통해 스키마가 변경된 기존 테이블을 에뮬레이트할 수 있습니다.To provide a backward compatible interface to emulate a table whose schema has changed.

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


-- Syntax for SQL Server and Azure SQL Database  
CREATE [ OR ALTER ] VIEW [ schema_name . ] view_name [ (column [ ,...n ] ) ]
[ WITH <view_attribute> [ ,...n ] ]
AS select_statement
[ ; ]  
<view_attribute> ::=
    [ ENCRYPTION ]  
-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse  
CREATE VIEW [ schema_name . ] view_name [  ( column_name [ ,...n ] ) ]   
AS <select_statement>   
<select_statement> ::=  
    [ WITH <common_table_expression> [ ,...n ] ]  
    SELECT <select_criteria>  


SQL Server 2014 이전 버전의 Transact-SQL 구문을 보려면 이전 버전 설명서를 참조하세요.To view Transact-SQL syntax for SQL Server 2014 and earlier, see Previous versions documentation.


적용 대상: Azure SQL DatabaseAzure SQL DatabaseSQL ServerSQL Server (SQL Server 2016(13.x)SQL Server 2016 (13.x) SP1부터)Applies to: Azure SQL DatabaseAzure SQL Database and SQL ServerSQL Server (starting with SQL Server 2016(13.x)SQL Server 2016 (13.x) SP1).

이미 있는 경우에만 뷰를 조건부로 변경합니다.Conditionally alters the view only if it already exists.

뷰가 속한 스키마의 이름입니다.Is the name of the schema to which the view belongs.

뷰의 이름입니다.Is the name of the view. 뷰 이름은 반드시 식별자에 적용되는 규칙을 준수해야 합니다.View names must follow the rules for identifiers. 뷰 소유자 이름을 지정하는 것은 선택 사항입니다.Specifying the view owner name is optional.

뷰에 있는 열에 사용할 이름입니다.Is the name to be used for a column in a view. 열이 산술 식, 함수 또는 상수에서 파생된 경우, 일반적으로 조인 때문에 둘 이상의 열이 같은 이름을 갖는 경우, 뷰의 열이 파생된 열과 다른 이름을 갖는 경우에만 열 이름이 필요합니다.A column name is required only when a column is derived from an arithmetic expression, a function, or a constant; when two or more columns may otherwise have the same name, typically because of a join; or when a column in a view is specified a name different from that of the column from which it is derived. SELECT 문에서 열 이름을 할당할 수도 있습니다.Column names can also be assigned in the SELECT statement.

column을 지정하지 않으면 뷰 열의 이름과 SELECT 문에 있는 열의 이름이 같아집니다.If column is not specified, the view columns acquire the same names as the columns in the SELECT statement.


뷰에 대한 열에서 열 이름에 대한 사용 권한은 기본 데이터의 원본에 상관없이 CREATE VIEW 또는 ALTER VIEW 문에 적용할 수 있습니다.In the columns for the view, the permissions for a column name apply across a CREATE VIEW or ALTER VIEW statement, regardless of the source of the underlying data. 예를 들어 CREATE VIEW 문에서 SalesOrderID 열에 사용 권한이 부여된 경우 ALTER VIEW 문은 SalesOrderID 열에 OrderRef 등의 다른 이름을 지정할 수 있으며 여전히 SalesOrderID를 사용하는 뷰에 연결된 사용 권한을 가집니다.For example, if permissions are granted on the SalesOrderID column in a CREATE VIEW statement, an ALTER VIEW statement can name the SalesOrderID column with a different column name, such as OrderRef, and still have the permissions associated with the view using SalesOrderID.

뷰가 수행할 동작을 지정합니다.Specifies the actions the view is to perform.

뷰를 정의하는 SELECT 문입니다.Is the SELECT statement that defines the view. 이 문은 둘 이상의 테이블과 다른 뷰를 사용할 수 있습니다.The statement can use more than one table and other views. 생성된 뷰의 SELECT 절에 참조된 개체 중에서 선택하려면 알맞은 사용 권한이 있어야 합니다.Appropriate permissions are required to select from the objects referenced in the SELECT clause of the view that is created.

뷰가 한 특정 테이블의 행과 열로 된 간단한 하위 집합일 필요는 없습니다.A view does not have to be a simple subset of the rows and columns of one particular table. 복잡도에 구애받지 않고 SELECT 절이 있는 둘 이상의 테이블 또는 다른 뷰를 사용하여 뷰를 만들 수 있습니다.A view can be created that uses more than one table or other views with a SELECT clause of any complexity.

인덱싱된 뷰 정의에서 SELECT 문은 반드시 단일 테이블 문 또는 선택적 집계가 있는 복수 테이블 JOIN이어야 합니다.In an indexed view definition, the SELECT statement must be a single table statement or a multitable JOIN with optional aggregation.

뷰를 정의하는 SELECT 절에는 다음을 포함할 수 없습니다.The SELECT clauses in a view definition cannot include the following:

  • SELECT 문의 선택 목록에 TOP 절도 함께 있는 경우를 제외한 ORDER BY 절An ORDER BY clause, unless there is also a TOP clause in the select list of the SELECT statement


    ORDER BY 절은 뷰 정의의 TOP 또는 OFFSET 절에서 반환되는 행을 결정하기 위한 용도로만 사용됩니다.The ORDER BY clause is used only to determine the rows that are returned by the TOP or OFFSET clause in the view definition. 쿼리 자체에서 ORDER BY를 지정하지 않으면 ORDER BY 절은 뷰 쿼리 시 정렬된 결과를 보장하지 않습니다.The ORDER BY clause does not guarantee ordered results when the view is queried, unless ORDER BY is also specified in the query itself.

  • INTO 키워드The INTO keyword

  • OPTION 절The OPTION clause

  • 임시 테이블 또는 테이블 변수 참조A reference to a temporary table or a table variable.

select_statement가 SELECT 문을 사용하므로 <join_hint> 및 <table_hint> 힌트를 FROM 절에서 지정된 대로 사용해야 합니다.Because select_statement uses the SELECT statement, it is valid to use <join_hint> and <table_hint> hints as specified in the FROM clause. 자세한 내용은 FROM(Transact-SQL)SELECT(Transact-SQL)를 참조하세요.For more information, see FROM (Transact-SQL) and SELECT (Transact-SQL).

select_statement에는 UNION 또는 UNION ALL로 구분된 함수 및 여러 SELECT 문을 사용할 수 있습니다.Functions and multiple SELECT statements separated by UNION or UNION ALL can be used in select_statement.

뷰에 대해 실행된 모든 데이터 수정 명령문이 select_statement 내의 기준 집합을 준수하도록 설정합니다.Forces all data modification statements executed against the view to follow the criteria set within select_statement. 뷰를 통해 행을 수정한 경우에는 WITH CHECK OPTION을 사용하여 수정이 커밋된 후에도 계속 뷰를 통해 데이터를 볼 수 있도록 합니다.When a row is modified through a view, the WITH CHECK OPTION makes sure the data remains visible through the view after the modification is committed.


CHECK OPTION을 지정해도 뷰의 기본 테이블을 직접 업데이트한 결과는 뷰에서 확인되지 않습니다.Any updates performed directly to a view's underlying tables are not verified against the view, even if CHECK OPTION is specified.

적용 대상: SQL Server 2008SQL Server 2008 이상 및 Azure SQL DatabaseAzure SQL DatabaseApplies to: SQL Server 2008SQL Server 2008 and later and Azure SQL DatabaseAzure SQL Database.

CREATE VIEW 문의 텍스트가 포함된 sys.syscomments의 항목을 암호화합니다.Encrypts the entries in sys.syscomments that contain the text of the CREATE VIEW statement. WITH ENCRYPTION을 사용하면 뷰가 SQL Server 복제의 일부로 게시되지 않도록 할 수 있습니다.Using WITH ENCRYPTION prevents the view from being published as part of SQL Server replication.

기본 테이블의 스키마에 뷰를 바인딩합니다.Binds the view to the schema of the underlying table or tables. SCHEMABINDING을 지정하면 뷰 정의에 영향을 미치는 방법으로 기본 테이블을 수정할 수 없습니다.When SCHEMABINDING is specified, the base table or tables cannot be modified in a way that would affect the view definition. 뷰 정의 자체를 먼저 수정하거나 삭제하여 수정할 테이블에 대해 종속성을 제거해야 합니다.The view definition itself must first be modified or dropped to remove dependencies on the table that is to be modified. SCHEMABINDING을 사용하는 경우 select_statement에 참조되는 테이블, 뷰 또는 사용자 정의 함수의 두 부분으로 구성된 이름(schema . object)이 있어야 합니다.When you use SCHEMABINDING, the select_statement must include the two-part names (schema.object) of tables, views, or user-defined functions that are referenced. 참조된 개체는 모두 같은 데이터베이스에 있어야 합니다.All referenced objects must be in the same database.

SCHEMABINDING 절로 만든 뷰에서 사용하는 뷰 또는 테이블은 뷰가 삭제되거나 변경되어 스키마 바인딩이 더 이상 존재하지 않는 경우에만 삭제할 수 있습니다.Views or tables that participate in a view created with the SCHEMABINDING clause cannot be dropped unless that view is dropped or changed so that it no longer has schema binding. 그렇지 않으면 데이터베이스 엔진Database Engine에서 오류가 발생합니다.Otherwise, the 데이터베이스 엔진Database Engine raises an error. 또한 ALTER TABLE 문이 뷰 정의에 영향을 미치는 경우에는 스키마 바인딩이 있는 뷰에서 사용하는 테이블에서 이러한 문을 실행할 수 없습니다.Also, executing ALTER TABLE statements on tables that participate in views that have schema binding fail when these statements affect the view definition.

뷰를 참조하는 쿼리에 대해 찾아보기 모드 메타데이터가 요청된 경우 SQL ServerSQL Server 인스턴스에서 기본 테이블 대신 뷰에 대한 메타데이터 정보를 DB-Library, ODBC 및 OLE DB API에 반환하도록 지정합니다.Specifies that the instance of SQL ServerSQL Server will return to the DB-Library, ODBC, and OLE DB APIs the metadata information about the view, instead of the base table or tables, when browse-mode metadata is being requested for a query that references the view. 찾아보기 모드 메타데이터는 SQL ServerSQL Server 인스턴스가 이 클라이언트 쪽 API에 반환하는 추가 메타데이터입니다.Browse-mode metadata is additional metadata that the instance of SQL ServerSQL Server returns to these client-side APIs. 이 메타데이터를 사용하면 클라이언트 쪽 API가 업데이트할 수 있는 클라이언트 쪽 커서를 구현할 수 있습니다.This metadata enables the client-side APIs to implement updatable client-side cursors. 찾아보기 모드 메타데이터에는 결과 집합의 열이 속한 기본 테이블에 대한 정보가 포함되어 있습니다.Browse-mode metadata includes information about the base table that the columns in the result set belong to.

VIEW_METADATA를 사용하여 만든 뷰의 경우 찾아보기 모드 메타데이터는 결과 집합의 뷰에서 열을 설명할 때 기본 테이블 이름 대신 뷰 이름을 반환합니다.For views created with VIEW_METADATA, the browse-mode metadata returns the view name and not the base table names when it describes columns from the view in the result set.

WITH VIEW_METADATA를 사용하여 뷰를 만드는 경우 뷰에 INSTEAD OF INSERT 또는 INSTEAD OF UPDATE 트리거가 있으면 timestamp 열을 제외한 모든 열을 업데이트할 수 있습니다.When a view is created by using WITH VIEW_METADATA, all its columns, except a timestamp column, are updatable if the view has INSTEAD OF INSERT or INSTEAD OF UPDATE triggers. 업데이트할 수 있는 뷰에 대한 자세한 내용은 주의를 참조하세요.For more information about updatable views, see Remarks.


현재 데이터베이스에서만 뷰를 만들 수 있습니다.A view can be created only in the current database. CREATE VIEW는 쿼리 일괄 처리에서 첫째 문이어야 합니다.The CREATE VIEW must be the first statement in a query batch. 최대 1,024개의 열을 뷰에 포함시킬 수 있습니다.A view can have a maximum of 1,024 columns.

뷰를 통해 쿼리할 때 데이터베이스 엔진Database Engine은 문에 참조된 모든 데이터베이스 개체가 존재하는지, 문의 컨텍스트 내에서 유효한지, 데이터 변경 문이 데이터 무결성 규칙을 위반하지 않는지 확인합니다.When querying through a view, the 데이터베이스 엔진Database Engine checks to make sure that all the database objects referenced anywhere in the statement exist and that they are valid in the context of the statement, and that data modification statements do not violate any data integrity rules. 확인이 실패하면 오류 메시지가 반환됩니다.A check that fails returns an error message. 성공적으로 확인한 경우 작업이 기본 테이블에 대한 동작으로 변환됩니다.A successful check translates the action into an action against the underlying table or tables.

뷰가 삭제된 테이블이나 뷰에 종속된 경우 뷰를 사용하려고 하면 데이터베이스 엔진Database Engine에서 오류 메시지를 표시합니다.If a view depends on a table or view that was dropped, the 데이터베이스 엔진Database Engine produces an error message when anyone tries to use the view. 새 테이블이나 뷰가 만들어지고 삭제된 테이블을 대체하기 위해 테이블 구조가 이전의 기본 테이블과 달라지지 않은 경우 뷰를 다시 사용할 수 있게 됩니다.If a new table or view is created and the table structure does not change from the previous base table to replace the one dropped, the view again becomes usable. 새 테이블이나 뷰 구조가 변경된 경우에는 뷰를 삭제하고 다시 만들어야 합니다.If the new table or view structure changes, the view must be dropped and re-created.

SCHEMABINDING 절을 사용하여 뷰를 만들지 않은 경우 뷰의 기반이 되는 개체에 대한 변경 내용이 뷰의 정의에 영향을 주면 sp_refreshview를 실행합니다.If a view is not created with the SCHEMABINDING clause, run sp_refreshview when changes are made to the objects underlying the view that affect the definition of the view. 그렇지 않으면 뷰를 쿼리할 때 예기치 않은 결과가 발생할 수 있습니다.Otherwise, the view might produce unexpected results when it is queried.

뷰를 만들면 뷰에 대한 정보가 sys.views, sys.columnssys.sql_expression_dependencies 카탈로그 뷰에 저장됩니다.When a view is created, information about the view is stored in the following catalog views: sys.views, sys.columns, and sys.sql_expression_dependencies. CREATE VIEW 문의 텍스트는 sys.sql_modules 카탈로그 뷰에 저장됩니다.The text of the CREATE VIEW statement is stored in the sys.sql_modules catalog view.

numeric 또는 float 식으로 정의된 뷰에 인덱스를 사용하는 쿼리의 결과는 뷰에 인덱스를 사용하지 않는 유사한 쿼리와 다를 수 있습니다.A query that uses an index on a view defined with numeric or float expressions may have a result that is different from a similar query that does not use the index on the view. 기본 테이블의 INSERT, DELETE 또는 UPDATE 동작 동안 발생하는 반올림 오류 때문에 이런 차이가 생길 수 있습니다.This difference may be caused by rounding errors during INSERT, DELETE, or UPDATE actions on underlying tables.

데이터베이스 엔진Database Engine에서는 뷰가 만들어질 때 SET QUOTED_IDENTIFIER 및 SET ANSI_NULLS의 설정을 저장합니다.The 데이터베이스 엔진Database Engine saves the settings of SET QUOTED_IDENTIFIER and SET ANSI_NULLS when a view is created. 이러한 원래 설정은 뷰를 사용할 때 뷰를 구문 분석하기 위해 사용되므로These original settings are used to parse the view when the view is used. 뷰에 액세스할 때 SET QUOTED_IDENTIFIER 및 SET ANSI_NULLS의 클라이언트 세션 설정은 뷰 정의에 영향을 미치지 않습니다.Therefore, any client-session settings for SET QUOTED_IDENTIFIER and SET ANSI_NULLS do not affect the view definition when the view is accessed.

업데이트할 수 있는 뷰Updatable Views

다음 조건이 만족되면 뷰를 통해 기본 테이블의 데이터를 수정할 수 있습니다.You can modify the data of an underlying base table through a view, as long as the following conditions are true:

  • UPDATE, INSERT 및 DELETE 문을 비롯한 모든 수정은 하나의 기본 테이블에 있는 열만 참조해야 합니다.Any modifications, including UPDATE, INSERT, and DELETE statements, must reference columns from only one base table.

  • 뷰에서 수정하는 열은 테이블 열에 있는 기본 데이터를 직접 참조해야 합니다.The columns being modified in the view must directly reference the underlying data in the table columns. 다음과 같은 기타 방법으로 열이 파생되면 안 됩니다.The columns cannot be derived in any other way, such as through the following:


    • 계산:A computation. 다른 열을 사용하는 식으로 열을 계산할 수 없습니다.The column cannot be computed from an expression that uses other columns. 집합 연산자 UNION, UNION ALL, CROSSJOIN, EXCEPT 및 INTERSECT를 사용하여 구성한 열은 계산되지만 업데이트할 수 없습니다.Columns that are formed by using the set operators UNION, UNION ALL, CROSSJOIN, EXCEPT, and INTERSECT amount to a computation and are also not updatable.

  • 수정하는 열이 GROUP BY, HAVING 또는 DISTINCT 절의 영향을 받지 않습니다.The columns being modified are not affected by GROUP BY, HAVING, or DISTINCT clauses.

  • TOP는 위치에 관계없이 뷰의 select_statement에서 WITH CHECK OPTION 절과 함께 사용되지 않습니다.TOP is not used anywhere in the select_statement of the view together with the WITH CHECK OPTION clause.

이전의 제한이 뷰 자체에 적용되는 것과 마찬가지로 뷰의 FROM 절 하위 쿼리에 적용됩니다.The previous restrictions apply to any subqueries in the FROM clause of the view, just as they apply to the view itself. 일반적으로 데이터베이스 엔진Database Engine은 뷰 정의에서 특정 기본 테이블에 대해 이루어진 수정을 분명하게 추적할 수 있어야 합니다.Generally, the 데이터베이스 엔진Database Engine must be able to unambiguously trace modifications from the view definition to one base table. 자세한 내용은 뷰를 통해 데이터 수정을 참조하세요.For more information, see Modify Data Through a View.

이전의 제한으로 인해 뷰를 통해 직접 데이터를 수정할 수 없는 경우 다음 방법을 사용하세요.If the previous restrictions prevent you from modifying data directly through a view, consider the following options:


    뷰를 업데이트할 수 있도록 뷰에 INSTEAD OF 트리거를 만들 수 있습니다.INSTEAD OF triggers can be created on a view to make a view updatable. INSTEAD OF 트리거는 정의된 지점에서 데이터 수정 문 대신 실행됩니다.The INSTEAD OF trigger is executed instead of the data modification statement on which the trigger is defined. 이 트리거를 사용하면 데이터 수정 문을 처리할 일련의 동작을 지정할 수 있습니다.This trigger lets the user specify the set of actions that must happen to process the data modification statement. 따라서 특정 데이터 수정 문(INSERT, UPDATE 또는 DELETE)의 뷰에 INSTEAD OF 트리거가 있을 경우 문을 통해 해당 뷰를 업데이트할 수 있습니다.Therefore, if an INSTEAD OF trigger exists for a view on a specific data modification statement (INSERT, UPDATE, or DELETE), the corresponding view is updatable through that statement. INSTEAD OF 트리거에 대한 자세한 내용은 DML 트리거를 참조하세요.For more information about INSTEAD OF triggers, see DML Triggers.

  • 분할 뷰Partitioned Views

    뷰가 분할 뷰일 경우 특정 제한에 따라 뷰를 업데이트할 수 있습니다.If the view is a partitioned view, the view is updatable, subject to certain restrictions. 필요할 경우 데이터베이스 엔진Database Engine은 사용하고 있는 모든 테이블 및 뷰가 동일한 SQL ServerSQL Server 인스턴스에 있는 로컬 분할 뷰, 그리고 뷰의 테이블 중 하나 이상이 다른 서버나 원격 서버에 있는 분산형 분할 뷰로 구분합니다.When it is needed, the 데이터베이스 엔진Database Engine distinguishes local partitioned views as the views in which all participating tables and the view are on the same instance of SQL ServerSQL Server, and distributed partitioned views as the views in which at least one of the tables in the view resides on a different or remote server.

분할 뷰Partitioned Views

분할 뷰란 구조가 같은 멤버 테이블이 UNION ALL로 정의되었으나 같은 SQL ServerSQL Server 인스턴스 또는 연결된 데이터베이스 서버라고 하는 SQL ServerSQL Server 서버의 자치 인스턴스 그룹에 여러 테이블로 따로 저장된 뷰입니다.A partitioned view is a view defined by a UNION ALL of member tables structured in the same way, but stored separately as multiple tables in either the same instance of SQL ServerSQL Server or in a group of autonomous instances of SQL ServerSQL Server servers, called federated database servers.


데이터를 하나의 서버에 대해 로컬로 분할할 때는 분할된 테이블을 사용하는 것이 좋습니다.The preferred method for partitioning data local to one server is through partitioned tables. 자세한 내용은 Partitioned Tables and Indexes을 참조하세요.For more information, see Partitioned Tables and Indexes.

파티션 구성표를 디자인할 때 각 파티션에 포함할 데이터를 명확히 해야 합니다.In designing a partitioning scheme, it must be clear what data belongs to each partition. 예를 들어 Customers 테이블의 데이터는 Customers_33에 있는 Server1 멤버 테이블, Customers_66에 있는 Server2 멤버 테이블 및 Customers_99에 있는 Server3 멤버 테이블의 세 위치에 분산되어 있습니다.For example, the data for the Customers table is distributed in three member tables in three server locations: Customers_33 on Server1, Customers_66 on Server2, and Customers_99 on Server3.

Server1의 분할 뷰는 다음과 같이 정의됩니다.A partitioned view on Server1 is defined in the following way:

--Partitioned view as defined on Server1  
CREATE VIEW Customers  
--Select from local member table.  
FROM CompanyData.dbo.Customers_33  
--Select from member table on Server2.  
FROM Server2.CompanyData.dbo.Customers_66  
--Select from member table on Server3.  
FROM Server3.CompanyData.dbo.Customers_99;  

일반적으로 뷰의 형식이 다음과 같은 경우에 분할 뷰라고 합니다.Generally, a view is said to be a partitioned view if it is of the following form:

SELECT <select_list1>  
SELECT <select_list2>  
SELECT <select_listn>  
FROM Tn;  

분할 뷰를 만들기 위한 조건Conditions for Creating Partitioned Views

  1. SELECT listThe select list

    • 뷰 정의의 열 목록에서 멤버 테이블의 모든 열을 선택합니다.In the column list of the view definition, select all columns in the member tables.

    • select list의 같은 서수 위치에 있는 열은 데이터 정렬 등의 형식이 같아야 합니다.Ensure that the columns in the same ordinal position of each select list are of the same type, including collations. UNION의 경우와 같이 일반적으로 열이 암시적으로 변환할 수 있는 형식인 것으로는 충분하지 않습니다.It is not sufficient for the columns to be implicitly convertible types, as is generally the case for UNION.

      또한 적어도 하나 이상의 열(예: <col>)이 같은 서수 위치에 있는 모든 SELECT 목록에 표시되어야 합니다.Also, at least one column (for example <col>) must appear in all the select lists in the same ordinal position. 멤버 테이블 T1, ..., Tn에서 CHECK 제약 조건 C1, ..., Cn이 각각 <col>에 정의되는 것과 같이 <col>을 정의합니다.Define <col> in a way that the member tables T1, ..., Tn have CHECK constraints C1, ..., Cn defined on <col>, respectively.

      C1 테이블에 정의되는 T1 제약 조건은 다음 형식을 따라야 합니다.Constraint C1 defined on table T1 must be of the following form:

      C1 ::= < simple_interval > [ OR < simple_interval > OR ...]  
      < simple_interval > :: =   
      < col > { < | > | \<= | >= | = < value >}   
      | < col > BETWEEN < value1 > AND < value2 >  
      | < col > IN ( value_list )  
      | < col > { > | >= } < value1 > AND  
      < col > { < | <= } < value2 >  
    • 제약 조건은 <col>의 지정된 값이 모두 C1, ..., Cn 제약 조건을 최대 하나까지 만족시켜 제약 조건이 결합되지 않거나 겹치지 않는 일련의 간격을 구성하도록 해야 합니다.The constraints must be in such a way that any specified value of <col> can satisfy, at most, one of the constraints C1, ..., Cn so that the constraints form a set of disjointed or nonoverlapping intervals. 결합되지 않은 제약 조건이 정의된 <col> 열을 분할 열이라고 합니다.The column <col> on which the disjointed constraints are defined is called the partitioning column. 분할 열 이름은 기본 테이블에 있는 이름과 다를 수 있습니다.Note that the partitioning column may have different names in the underlying tables. 앞에서 언급한 분할 열의 조건을 만족시키려면 제약 조건이 활성화되어 트러스트된 상태여야 합니다.The constraints must be in an enabled and trusted state for them to meet the previously mentioned conditions of the partitioning column. 제약 조건이 해제되면 ALTER TABLE의 CHECK CONSTRAINT constraint_name 옵션을 사용하고 WITH CHECK 옵션으로 제약 조건의 유효성을 검사하여 제약 조건 검사를 다시 설정하세요.If the constraints are disabled, re-enable constraint checking by using the CHECK CONSTRAINT constraint_name option of ALTER TABLE, and using the WITH CHECK option to validate them.

      다음 예에서는 올바른 제약 조건 집합을 보여 줍니다.The following examples show valid sets of constraints:

      { [col < 10], [col between 11 and 20] , [col > 20] }  
      { [col between 11 and 20], [col between 21 and 30], [col between 31 and 100] }  
    • SELECT 목록에 같은 열을 여러 번 사용할 수 없습니다.The same column cannot be used multiple times in the select list.

  2. 분할 열Partitioning column

    • 분할 열은 테이블에 있는 PRIMARY KEY의 일부입니다.The partitioning column is a part of the PRIMARY KEY of the table.

    • 분할 열은 계산 열, ID 열, 기본 열 또는 timestamp 열이 될 수 없습니다.It cannot be a computed, identity, default, or timestamp column.

    • 멤버 테이블의 동일한 열에 제약 조건이 둘 이상 있는 경우에는 데이터베이스 엔진에서 뷰가 분할 뷰인지 여부를 결정할 때 모든 제약 조건을 고려하지 않고 무시합니다.If there is more than one constraint on the same column in a member table, the Database Engine ignores all the constraints and does not consider them when determining whether the view is a partitioned view. 분할 뷰의 조건을 만족하려면 분할 열에 분할 제약 조건이 하나만 있어야 합니다.To meet the conditions of the partitioned view, ensure that there is only one partitioning constraint on the partitioning column.

    • 분할 열의 업데이트 가능성에는 제한이 없습니다.There are no restrictions on the updatability of the partitioning column.

  3. 멤버 테이블 또는 기본 테이블 T1, ..., TnMember tables, or underlying tables T1, ..., Tn

    • 테이블은 4부분으로 된 이름 또는 OPENDATASOURCE나 OPENROWSET 기반 이름을 통해 참조되며 SQL ServerSQL Server를 실행하는 다른 컴퓨터의 로컬 테이블 또는 테이블이 될 수 있습니다.The tables can be either local tables or tables from other computers that are running SQL ServerSQL Server that are referenced either through a four-part name or an OPENDATASOURCE- or OPENROWSET-based name. OPENDATASOURCE 및 OPENROWSET 구문은 테이블 이름을 지정할 수 있으나 통과 쿼리는 지정할 수 없습니다.The OPENDATASOURCE and OPENROWSET syntax can specify a table name, but not a pass-through query. 자세한 내용은 OPENDATASOURCE(Transact-SQL)OPENROWSET(Transact-SQL)을 참조하세요.For more information, see OPENDATASOURCE (Transact-SQL) and OPENROWSET (Transact-SQL).

      하나 이상의 멤버 테이블이 원격이면 뷰를 분산형 분할 뷰라고 하며 추가 조건이 적용됩니다.If one or more of the member tables are remote, the view is called distributed partitioned view, and additional conditions apply. 자세한 내용은 이 섹션의 뒷부분에서 설명합니다.They are described later in this section.

    • UNION ALL 문과 결합된 테이블 집합에 같은 테이블을 두 번 표시할 수 없습니다.The same table cannot appear two times in the set of tables that are being combined with the UNION ALL statement.

    • 멤버 테이블은 테이블의 계산 열에 대해 만들어진 인덱스를 가질 수 없습니다.The member tables cannot have indexes created on computed columns in the table.

    • 멤버 테이블은 같은 수의 열에 모두 PRIMARY KEY 제약 조건이 있습니다.The member tables have all PRIMARY KEY constraints on the same number of columns.

    • 뷰에 있는 모든 멤버 테이블의 ANSI 패딩 설정이 같습니다.All member tables in the view have the same ANSI padding setting. sp_configureuser options 옵션을 사용하거나 SET 문을 사용하여 설정할 수 있습니다.This can be set by using either the user options option in sp_configure or the SET statement.

분할된 뷰의 데이터를 수정하기 위한 조건Conditions for Modifying Data in Partitioned Views

분할된 뷰의 데이터를 수정하는 문에는 다음 제한이 적용됩니다.The following restrictions apply to statements that modify data in partitioned views:

  • 기본 멤버 테이블에 이러한 열에 대한 DEFAULT 제약 조건이 있거나 Null 값을 허용해도 INSERT 문은 뷰의 모든 열에 대해 값을 제공합니다.The INSERT statement supplies values for all the columns in the view, even if the underlying member tables have a DEFAULT constraint for those columns or if they allow for null values. DEFAULT 정의가 있는 멤버 테이블 열의 경우에는 문에 DEFAULT 키워드를 명시적으로 사용할 수 없습니다.For those member table columns that have DEFAULT definitions, the statements cannot explicitly use the keyword DEFAULT.

  • 분할 열에 삽입되는 값은 적어도 하나 이상의 기본 제약 조건을 만족합니다. 그렇지 않으면 제약 조건을 위반하여 INSERT 동작이 실패합니다.The value being inserted into the partitioning column satisfies at least one of the underlying constraints; otherwise, the insert action will fail with a constraint violation.

  • 해당 멤버 테이블에 정의된 DEFAULT 값이 열에 포함되어 있어도 UPDATE 문은 SET 절에서 DEFAULT 키워드를 값으로 지정할 수 없습니다.UPDATE statements cannot specify the DEFAULT keyword as a value in the SET clause, even if the column has a DEFAULT value defined in the corresponding member table.

  • 하나 이상의 멤버 테이블에 ID 열이 있는 뷰의 열은 INSERT 또는 UPDATE 문을 사용하여 수정할 수 없습니다.Columns in the view that are an identity column in one or more of the member tables cannot be modified by using an INSERT or UPDATE statement.

  • 멤버 테이블 중 하나에 timestamp 열이 포함되어 있으면 INSERT 또는 UPDATE 문을 사용하여 데이터를 수정할 수 없습니다.If one of the member tables contains a timestamp column, the data cannot be modified by using an INSERT or UPDATE statement.

  • 멤버 테이블 중 하나에 트리거나 ON UPDATE CASCADE/SET NULL/SET DEFAULT 또는 ON DELETE CASCADE/SET NULL/SET DEFAULT 제약 조건이 있으면 뷰를 수정할 수 없습니다.If one of the member tables contains a trigger or an ON UPDATE CASCADE/SET NULL/SET DEFAULT or ON DELETE CASCADE/SET NULL/SET DEFAULT constraint, the view cannot be modified.

  • 문에 멤버 테이블 또는 같은 뷰와 자체 조인이 있으면 분할 뷰에 대해 INSERT, UPDATE 및 DELETE 동작을 수행할 수 없습니다.INSERT, UPDATE, and DELETE actions against a partitioned view are not allowed if there is a self-join with the same view or with any of the member tables in the statement.

  • bcp 또는 BULK INSERT 및 INSERT ... SELECT * FROM OPENROWSET(BULK...) 문은 분할 뷰로 데이터를 대량 가져오는 것을 지원하지 않습니다.Bulk importing data into a partitioned view is unsupported by bcp or the BULK INSERT and INSERT ... SELECT * FROM OPENROWSET(BULK...) statements. 그러나 INSERT 문을 사용하여 분할된 뷰에 여러 행을 삽입할 수 있습니다.However, you can insert multiple rows into a partitioned view by using the INSERT statement.


    분할 뷰를 업데이트하려면 사용자에게 멤버 테이블에 대한 INSERT, UPDATE 및 DELETE 권한이 있어야 합니다.To update a partitioned view, the user must have INSERT, UPDATE, and DELETE permissions on the member tables.

분산형 분할 뷰에 대한 추가 조건Additional Conditions for Distributed Partitioned Views

분산형 분할 뷰(하나 이상의 멤버 테이블이 원격일 때)의 경우 다음 추가 조건이 적용됩니다.For distributed partitioned views (when one or more member tables are remote), the following additional conditions apply:

  • 업데이트의 영향을 받는 모든 노드에서 원자성을 보장하기 위해 분산 트랜잭션이 시작됩니다.A distributed transaction will be started to guarantee atomicity across all nodes affected by the update.

  • 작업할 INSERT, UPDATE 또는 DELETE 문에 대해 XACT_ABORT SET 옵션을 ON으로 설정합니다.Set the XACT_ABORT SET option to ON for INSERT, UPDATE, or DELETE statements to work.

  • 분할 뷰에서 참조되는 smallmoney 형식의 원격 테이블 열은 money로 매핑됩니다.Any columns in remote tables of type smallmoney that are referenced in a partitioned view are mapped as money. 따라서 로컬 테이블의 해당 열(SELECT 목록의 동일한 서수 위치에 있는 열)도 money 형식이어야 합니다.Therefore, the corresponding columns (in the same ordinal position in the select list) in the local tables must also be of type money.

  • 데이터베이스 호환성 수준 110 이상에서는 분할 뷰에서 참조되는 smalldatetime 형식의 원격 테이블 열이 smalldatetime으로 매핑됩니다.Under database compatibility level 110 and higher, any columns in remote tables of type smalldatetime that are referenced in a partitioned view are mapped as smalldatetime. 로컬 테이블의 해당 열(SELECT 목록의 동일한 서수 위치에 있는 열)은 smalldatetime이어야 합니다.Corresponding columns (in the same ordinal position in the select list) in the local tables must be smalldatetime. 이 동작은 분할 뷰에서 참조되는 smalldatetime 형식의 원격 테이블 열이 datetime으로 매핑되고 로컬 테이블의 해당 열이 datetime 형식이어야 하는 이전 버전 SQL ServerSQL Server의 동작에서 달라진 점입니다.This is a change in behavior from earlier versions of SQL ServerSQL Server in which any columns in remote tables of type smalldatetime that are referenced in a partitioned view are mapped as datetime and corresponding columns in local tables must be of type datetime. 자세한 내용은 ALTER DATABASE 호환성 수준(Transact-SQL)을 참조하세요.For more information, see ALTER DATABASE Compatibility Level (Transact-SQL).

  • 분할 뷰의 연결된 서버는 루프백 연결 서버가 될 수 없습니다.Any linked server in the partitioned view cannot be a loopback linked server. 이 서버는 같은 SQL ServerSQL Server 인스턴스를 가리키는 연결된 서버입니다.This is a linked server that points to the same instance of SQL ServerSQL Server.

업데이트할 수 있는 분할 뷰 및 원격 테이블과 관련된 INSERT, UPDATE 및 DELETE 동작에 대해서는 SET ROWCOUNT 옵션의 설정이 무시됩니다.The setting of the SET ROWCOUNT option is ignored for INSERT, UPDATE, and DELETE actions that involve updatable partitioned views and remote tables.

멤버 테이블 및 분할 뷰 정의가 지정되면 SQL ServerSQL Server 쿼리 최적화 프로그램은 쿼리를 효율적으로 사용하는 지능적 계획을 수립하여 멤버 테이블의 데이터에 액세스합니다.When the member tables and partitioned view definition are in place, the SQL ServerSQL Server query optimizer builds intelligent plans that use queries efficiently to access data from member tables. 쿼리 프로세서는 CHECK 제약 조건 정의를 사용하여 멤버 테이블에 키 값의 배포를 매핑합니다.With the CHECK constraint definitions, the query processor maps the distribution of key values across the member tables. 사용자가 쿼리를 실행하면 쿼리 프로세서가 WHERE 절에 지정된 값에 대한 매핑과 비교한 다음 멤버 서버 간 데이터 전송량을 최소화하도록 실행 계획을 수립합니다.When a user issues a query, the query processor compares the map to the values specified in the WHERE clause, and builds an execution plan with a minimal amount of data transfer between member servers. 따라서 일부 멤버 테이블이 원격 서버에 있더라도 SQL ServerSQL Server 인스턴스에서 분산 쿼리를 확인하여 전송할 분산 데이터의 양을 최소화할 수 있습니다.Therefore, although some member tables may be located in remote servers, the instance of SQL ServerSQL Server resolves distributed queries so that the amount of distributed data that has to be transferred is minimal.

복제 고려 사항Considerations for Replication

복제와 관련된 멤버 테이블에 분할 뷰를 만들려면 다음을 고려해야 합니다.To create partitioned views on member tables that are involved in replication, the following considerations apply:

  • 기본 테이블이 업데이트 구독이 있는 트랜잭션 복제 또는 병합 복제와 관련된 경우에는 uniqueidentifier 열도 SELECT 목록에 포함되어야 합니다.If the underlying tables are involved in merge replication or transactional replication with updating subscriptions, ensure that the uniqueidentifier column is also included in the select list.

    분할 뷰에 대한 INSERT 동작은 uniqueidentifier 열에 대해 NEWID() 값을 제공해야 합니다.Any INSERT actions into the partitioned view must provide a NEWID() value for the uniqueidentifier column. uniqueidentifier 열에 대한 UPDATE 동작은 DEFAULT 키워드를 사용할 수 없으므로 NEWID()를 값으로 제공해야 합니다.Any UPDATE actions against the uniqueidentifier column must supply NEWID() as the value because the DEFAULT keyword cannot be used.

  • 뷰를 사용하여 수행된 업데이트의 복제는 서로 다른 두 데이터베이스에서 테이블이 복제될 때와 동일합니다. 서로 다른 복제 에이전트에서 테이블을 제공하며 업데이트 순서는 보장되지 않습니다.The replication of updates made by using the view is the same as when tables are replicated in two different databases: the tables are served by different replication agents and the order of the updates is not guaranteed.

사용 권한Permissions

데이터베이스에는 CREATE VIEW 권한이 필요하고 뷰를 만들 구성표에는 ALTER 권한이 필요합니다.Requires CREATE VIEW permission in the database and ALTER permission on the schema in which the view is being created.


이 예에서는 AdventureWorks 2012 또는 AdventureWorksDW 데이터베이스를 사용합니다.The following examples use the AdventureWorks 2012 or AdventureWorksDW database.

A.A. 간단한 CREATE VIEW 사용Using a simple CREATE VIEW

다음 예에서는 간단한 SELECT 문을 사용하여 뷰를 만듭니다.The following example creates a view by using a simple SELECT statement. 간단한 뷰는 열 조합을 자주 쿼리할 때 유용합니다.A simple view is helpful when a combination of columns is queried frequently. 이 뷰의 데이터는 AdventureWorks2012AdventureWorks2012 데이터베이스의 HumanResources.EmployeePerson.Person 테이블에 있습니다.The data from this view comes from the HumanResources.Employee and Person.Person tables of the AdventureWorks2012AdventureWorks2012 database. 이 데이터는 Adventure Works CyclesAdventure Works Cycles의 직원 이름과 채용 날짜 정보를 제공합니다.The data provides name and hire date information for the employees of Adventure Works CyclesAdventure Works Cycles. 입사일 추적 담당자에게 이 테이블의 모든 데이터에 액세스할 권한을 주지 않아도 해당 뷰를 만들 수 있습니다.The view could be created for the person in charge of tracking work anniversaries but without giving this person access to all the data in these tables.

CREATE VIEW hiredate_view  
SELECT p.FirstName, p.LastName, e.BusinessEntityID, e.HireDate  
FROM HumanResources.Employee e   
JOIN Person.Person AS p ON e.BusinessEntityID = p.BusinessEntityID ;  


다음 예에서는 WITH ENCRYPTION 옵션을 사용하여 계산 열, 이름이 바뀐 열 및 복수 열을 보여 줍니다.The following example uses the WITH ENCRYPTION option and shows computed columns, renamed columns, and multiple columns.

적용 대상: SQL Server 2008SQL Server 2008 이상 및 SQL DatabaseSQL DatabaseApplies to: SQL Server 2008SQL Server 2008 and later and SQL DatabaseSQL Database.

CREATE VIEW Purchasing.PurchaseOrderReject  
SELECT PurchaseOrderID, ReceivedQty, RejectedQty,   
    RejectedQty / ReceivedQty AS RejectRatio, DueDate  
FROM Purchasing.PurchaseOrderDetail  
WHERE RejectedQty / ReceivedQty > 0  
AND DueDate > CONVERT(DATETIME,'20010630',101) ;  


다음 예에서는 5개의 테이블을 참조하고 데이터 수정을 허용하여 시애틀에 사는 직원에게만 적용하는 SeattleOnly라는 뷰를 보여 줍니다.The following example shows a view named SeattleOnly that references five tables and allows for data modifications to apply only to employees who live in Seattle.

CREATE VIEW dbo.SeattleOnly  
SELECT p.LastName, p.FirstName, e.JobTitle, a.City, sp.StateProvinceCode  
FROM HumanResources.Employee e  
INNER JOIN Person.Person p  
ON p.BusinessEntityID = e.BusinessEntityID  
    INNER JOIN Person.BusinessEntityAddress bea   
    ON bea.BusinessEntityID = e.BusinessEntityID   
    INNER JOIN Person.Address a   
    ON a.AddressID = bea.AddressID  
    INNER JOIN Person.StateProvince sp   
    ON sp.StateProvinceID = a.StateProvinceID  
WHERE a.City = 'Seattle'  

D.D. 뷰에서 기본 제공 함수 사용Using built-in functions within a view

다음 예에서는 기본 제공 함수를 포함하는 뷰 정의를 보여 줍니다.The following example shows a view definition that includes a built-in function. 함수를 사용할 때는 파생 열의 열 이름을 지정해야 합니다.When you use functions, you must specify a column name for the derived column.

CREATE VIEW Sales.SalesPersonPerform  
SELECT TOP (100) SalesPersonID, SUM(TotalDue) AS TotalSales  
FROM Sales.SalesOrderHeader  
WHERE OrderDate > CONVERT(DATETIME,'20001231',101)  
GROUP BY SalesPersonID;  

E.E. 분할된 데이터 사용Using partitioned data

다음 예에서는 SUPPLY1, SUPPLY2, SUPPLY3SUPPLY4 테이블을 사용합니다.The following example uses tables named SUPPLY1, SUPPLY2, SUPPLY3, and SUPPLY4. 이러한 테이블은 서로 다른 국가/지역에 있는 4개 사무실의 공급자 테이블입니다.These tables correspond to the supplier tables from four offices, located in different countries/regions.

--Create the tables and insert the values.  
supplyID INT PRIMARY KEY CHECK (supplyID BETWEEN 1 and 150),  
supplier CHAR(50)  
supplyID INT PRIMARY KEY CHECK (supplyID BETWEEN 151 and 300),  
supplier CHAR(50)  
supplyID INT PRIMARY KEY CHECK (supplyID BETWEEN 301 and 450),  
supplier CHAR(50)  
supplyID INT PRIMARY KEY CHECK (supplyID BETWEEN 451 and 600),  
supplier CHAR(50)  
--Create the view that combines all supplier tables.  
CREATE VIEW dbo.all_supplier_view  
SELECT supplyID, supplier  
  FROM dbo.SUPPLY1  
SELECT supplyID, supplier  
  FROM dbo.SUPPLY2  
SELECT supplyID, supplier  
  FROM dbo.SUPPLY3  
SELECT supplyID, supplier  
  FROM dbo.SUPPLY4;  
INSERT dbo.all_supplier_view VALUES ('1', 'CaliforniaCorp'), ('5', 'BraziliaLtd')    
, ('231', 'FarEast'), ('280', 'NZ')  
, ('321', 'EuroGroup'), ('442', 'UKArchip')  
, ('475', 'India'), ('521', 'Afrique');  

예: SQL Data WarehouseSQL Data Warehouse병렬 데이터 웨어하우스Parallel Data WarehouseExamples: SQL Data WarehouseSQL Data Warehouse and 병렬 데이터 웨어하우스Parallel Data Warehouse

F.F. 간단한 뷰 만들기Creating a simple view

다음 예는 원본 테이블에서 일부 열만 선택하여 뷰를 만듭니다.The following example creates a view by selecting only some of the columns from the source table.

CREATE VIEW DimEmployeeBirthDates AS  
SELECT FirstName, LastName, BirthDate   
FROM DimEmployee;  

G.G. 두 테이블을 조인하여 뷰 만들기Create a view by joining two tables

다음 예에서는 OUTER JOIN이 있는 SELECT 문을 사용하여 뷰를 만듭니다.The following example creates a view by using a SELECT statement with an OUTER JOIN. 조인 쿼리의 결과가 뷰를 채웁니다.The results of the join query populate the view.

SELECT fis.CustomerKey, fis.ProductKey, fis.OrderDateKey, 
  fis.SalesTerritoryKey, dst.SalesTerritoryRegion  
FROM FactInternetSales AS fis   
LEFT OUTER JOIN DimSalesTerritory AS dst   
ON (fis.SalesTerritoryKey=dst.SalesTerritoryKey);  

참고 항목See Also

DELETE(Transact-SQL) DELETE (Transact-SQL)
DROP VIEW (Transact-SQL) DROP VIEW (Transact-SQL)
INSERT(Transact-SQL) INSERT (Transact-SQL)
저장 프로시저 만들기 Create a Stored Procedure
sys.dm_sql_referenced_entities(Transact-SQL) sys.dm_sql_referenced_entities (Transact-SQL)
sys.dm_sql_referencing_entities(Transact-SQL) sys.dm_sql_referencing_entities (Transact-SQL)
sp_help(Transact-SQL) sp_help (Transact-SQL)
sp_helptext(Transact-SQL) sp_helptext (Transact-SQL)
sp_refreshview(Transact-SQL) sp_refreshview (Transact-SQL)
sp_rename(Transact-SQL) sp_rename (Transact-SQL)
sys.views(Transact-SQL) sys.views (Transact-SQL)
UPDATE(Transact-SQL) UPDATE (Transact-SQL)