UPDATE(Transact-SQL)UPDATE (Transact-SQL)

이 항목은 다음에 적용됩니다. 예SQL Server(2008부터)예Azure SQL Database예Azure SQL Data Warehouse 예병렬 데이터 웨어하우스 THIS TOPIC APPLIES TO: yesSQL Server (starting with 2008)yesAzure SQL DatabaseyesAzure SQL Data Warehouse yesParallel Data Warehouse

SQL Server 2017SQL Server 2017에서 테이블 또는 뷰의 기존 데이터를 변경합니다.Changes existing data in a table or view in SQL Server 2017SQL Server 2017. 예제를 보려면 예제합니다.For examples, see Examples.

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

구문Syntax

-- Syntax for SQL Server and Azure SQL Database  

[ WITH <common_table_expression> [...n] ]  
UPDATE   
    [ TOP ( expression ) [ PERCENT ] ]   
    { { table_alias | <object> | rowset_function_limited   
         [ WITH ( <Table_Hint_Limited> [ ...n ] ) ]  
      }  
      | @table_variable      
    }  
    SET  
        { column_name = { expression | DEFAULT | NULL }  
          | { udt_column_name.{ { property_name = expression  
                                | field_name = expression }  
                                | method_name ( argument [ ,...n ] )  
                              }  
          }  
          | column_name { .WRITE ( expression , @Offset , @Length ) }  
          | @variable = expression  
          | @variable = column = expression  
          | column_name { += | -= | *= | /= | %= | &= | ^= | |= } expression  
          | @variable { += | -= | *= | /= | %= | &= | ^= | |= } expression  
          | @variable = column { += | -= | *= | /= | %= | &= | ^= | |= } expression  
        } [ ,...n ]   

    [ <OUTPUT Clause> ]  
    [ FROM{ <table_source> } [ ,...n ] ]   
    [ WHERE { <search_condition>   
            | { [ CURRENT OF   
                  { { [ GLOBAL ] cursor_name }   
                      | cursor_variable_name   
                  }   
                ]  
              }  
            }   
    ]   
    [ OPTION ( <query_hint> [ ,...n ] ) ]  
[ ; ]  

<object> ::=  
{   
    [ server_name . database_name . schema_name .   
    | database_name .[ schema_name ] .   
    | schema_name .  
    ]  
    table_or_view_name}  
-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse  

UPDATE [ database_name . [ schema_name ] . | schema_name . ] table_name   
SET { column_name = { expression | NULL } } [ ,...n ]  
[ FROM from_clause ]  
[ WHERE <search_condition> ]   
[ OPTION ( LABEL = label_name ) ]  
[;]  

인수Arguments

와 <common_table_expression >WITH <common_table_expression>
UPDATE 문의 범위 내에서 정의된 임시 명명된 결과 집합 또는 뷰를 지정합니다. 이를 CTE(공통 테이블 식)라고 합니다.Specifies the temporary named result set or view, also known as common table expression (CTE), defined within the scope of the UPDATE statement. CTE 결과 집합은 단순 쿼리에서 파생되며 UPDATE 문에서 참조됩니다.The CTE result set is derived from a simple query and is referenced by UPDATE statement.

공통 테이블 식은 SELECT, INSERT, DELETE 및 CREATE VIEW 문에서도 사용됩니다.Common table expressions can also be used with the SELECT, INSERT, DELETE, and CREATE VIEW statements. 자세한 내용은 참조 common_table_expression &#40; Transact SQL ) .For more information, see WITH common_table_expression (Transact-SQL).

TOP ( ) [%]TOP ( expression) [ PERCENT ]
수 또는 업데이트 되는 행의 비율을 지정 합니다.Specifies the number or percent of rows that are updated. expression 은 행의 수 또는 비율일 수 있습니다.expression can be either a number or a percent of the rows.

INSERT, UPDATE 또는 DELETE와 함께 사용된 TOP 식에서 참조된 행은 어떠한 순서로도 정렬되지 않습니다.The rows referenced in the TOP expression used with INSERT, UPDATE, or DELETE are not arranged in any order.

구분 하는 괄호가 INSERT, UPDATE 및 DELETE 문에 TOP에 필요 합니다.Parentheses delimiting expression in TOP are required in INSERT, UPDATE, and DELETE statements. 자세한 내용은 참조 top( Transact SQL ) .For more information, see TOP (Transact-SQL).

table_aliastable_alias
행을 업데이트할 테이블 또는 뷰를 나타내는 FROM 절에 지정되는 별칭입니다.The alias specified in the FROM clause representing the table or view from which the rows are to be updated.

server_nameserver_name
서버 이름입니다 (연결 된 서버 이름을 사용 하 여 또는 OPENDATASOURCE 함수를 서버 이름으로)에 테이블이 나 뷰가 위치한 합니다.Is the name of the server (using a linked server name or the OPENDATASOURCE function as the server name) on which the table or view is located. 경우 server_name 지정 된 database_nameschema_name 필요 합니다.If server_name is specified, database_name and schema_name are required.

database_namedatabase_name
데이터베이스의 이름입니다.Is the name of the database.

schema_nameschema_name
테이블이나 뷰가 속한 스키마의 이름입니다.Is the name of the schema to which the table or view belongs.

table_or view_nametable_or view_name
행을 업데이트할 테이블 또는 뷰의 이름입니다.Is the name of the table or view from which the rows are to be updated. 참조 되는 뷰 table_or_view_name 업데이트할 수 있도록 하 고 보기의 FROM 절에서 정확히 한 개의 기본 테이블을 참조 해야 합니다.The view referenced by table_or_view_name must be updatable and reference exactly one base table in the FROM clause of the view. 업데이트할 수 있는 뷰에 대 한 자세한 내용은 참조 하세요. CREATE view( Transact SQL ) .For more information about updatable views, see CREATE VIEW (Transact-SQL).

rowset_function_limitedrowset_function_limited
OPENQUERY 또는 OPENROWSET 공급자 기능에 따라 함수입니다.Is either the OPENQUERY or OPENROWSET function, subject to provider capabilities.

( <Table_Hint_Limited > )WITH ( <Table_Hint_Limited> )
대상 테이블에 허용되는 하나 이상의 테이블 힌트를 지정합니다.Specifies one or more table hints that are allowed for a target table. WITH 키워드와 괄호가 필요합니다.The WITH keyword and the parentheses are required. NOLOCK 및 READUNCOMMITTED는 허용되지 않습니다.NOLOCK and READUNCOMMITTED are not allowed. 테이블 힌트에 대 한 정보를 참조 하십시오. 테이블 힌트 ( Transact SQL ) .For information about table hints, see Table Hints (Transact-SQL).

@table_variable@table_variable
지정 된 테이블 테이블 원본으로 변수입니다.Specifies a table variable as a table source.

SETSET
업데이트할 열이나 변수 이름의 목록을 지정합니다.Specifies the list of column or variable names to be updated.

column_namecolumn_name
변경할 데이터가 포함된 열입니다.Is a column that contains the data to be changed. column_name 에 존재 해야 table_or view_name합니다.column_name must exist in table_or view_name. ID 열은 업데이트할 수 없습니다.Identity columns cannot be updated.

expressionexpression
단일 값을 반환하는 변수, 리터럴 값, 식 또는 괄호로 묶인 하위 SELECT 문입니다.Is a variable, literal value, expression, or a subselect statement (enclosed with parentheses) that returns a single value. 반환한 값 의 기존 값을 대체 column_name 또는 @variable 합니다.The value returned by expression replaces the existing value in column_name or @variable.

참고

유니코드 문자 데이터 형식을 참조할 때는 nchar, nvarchar, 및 ntext, 'expression' 대문자 접두사로 추가 해야 ' N '입니다.When referencing the Unicode character data types nchar, nvarchar, and ntext, 'expression' should be prefixed with the capital letter 'N'. 'N'을 지정하지 않으면 SQL ServerSQL Server에서 데이터베이스 또는 열의 기본 데이터 정렬에 해당하는 코드 페이지로 문자열을 변환합니다.If 'N' is not specified, SQL ServerSQL Server converts the string to the code page that corresponds to the default collation of the database or column. 이 코드 페이지에 없는 문자는 모두 손실됩니다.Any characters not found in this code page are lost.

DEFAULTDEFAULT
열에 정의한 기본값이 열의 기존 값을 대체하도록 지정합니다.Specifies that the default value defined for the column is to replace the existing value in the column. 열에 기본값이 없고 NULL 값을 허용하도록 정의한 경우, 열을 NULL로 변경하는 데 사용할 수도 있습니다.This can also be used to change the column to NULL if the column has no default and is defined to allow null values.

{ += | -= | *= | /= | %= | &= | ^= | |= }{ += | -= | *= | /= | %= | &= | ^= | |= }
복합 할당 연산자:Compound assignment operator:
+ = 더하기 및 할당+= Add and assign
-= 빼기 및 할당-= Subtract and assign
* = 곱하기 및 할당*= Multiply and assign
/ = 나누기 및 할당/= Divide and assign
% = 모듈로 및 할당%= Modulo and assign
& = 비트 AND 및 할당&= Bitwise AND and assign
^ = 비트 XOR 및 할당^= Bitwise XOR and assign
| = 비트 OR 및 할당|= Bitwise OR and assign

udt_column_nameudt_column_name
사용자 정의 형식의 열입니다.Is a user-defined type column.

property_name | d _property_name | field_name
사용자 정의 형식의 공용 속성 또는 공용 데이터 멤버입니다.Is a public property or public data member of a user-defined type.

method_name ( 인수 [ ,... n] )method_name ( argument [ ,... n] )
비정적 공용 변경자 (mutator) 메서드가 udt_column_name 하는 하나 이상의 인수를 사용 하 고 사용 합니다.Is a nonstatic public mutator method of udt_column_name that takes one or more arguments.

. 쓰기 (,@Offset, @Length).WRITE (expression,@Offset,@Length)
지정 하는 값의 섹션 column_name 수정 하는 것입니다.Specifies that a section of the value of column_name is to be modified. 대체 @Length 에서 시작 하는 단위 @Offsetcolumn_name합니다.expression replaces @Length units starting from @Offset of column_name. 열만 varchar (max), nvarchar (max), 또는 varbinary (max) 이 절을 사용 하 여 지정할 수 있습니다.Only columns of varchar(max), nvarchar(max), or varbinary(max) can be specified with this clause. column_name NULL 일 수 없습니다 및 테이블 이름 또는 테이블 별칭으로 정규화 할 수 없습니다.column_name cannot be NULL and cannot be qualified with a table name or table alias.

에 복사 하는 값은 column_name합니다.expression is the value that is copied to column_name. 평가 되거나 암시적으로 캐스팅 될 수는 column_name 유형입니다.expression must evaluate to or be able to be implicitly cast to the column_name type. 경우 NULL로 설정 되어 @Length 무시 됩니다에 값 column_name 잘렸습니다. 지정 된 위치에서 @Offset .If expression is set to NULL, @Length is ignored, and the value in column_name is truncated at the specified @Offset.

@Offset클래스의 값의 시작 지점 column_name 입니다 기록 됩니다.@Offset is the starting point in the value of column_name at which expression is written. @Offset0부터 시작 하는 서 수 위치를 bigint, 및는 음수일 수 없습니다.@Offset is a zero-based ordinal position, is bigint, and cannot be a negative number. 경우 @Offset 이 NULL 이면 업데이트 작업이 추가 기존 끝날 때 column_name 값 및 @Length 는 무시 됩니다.If @Offset is NULL, the update operation appends expression at the end of the existing column_name value and @Length is ignored. 경우 @Offset 의 길이 보다 크면는 column_name 값의 데이터베이스 엔진Database Engine 에서 오류를 반환 합니다.If @Offset is greater than the length of the column_name value, the 데이터베이스 엔진Database Engine returns an error. 경우 @Offset 플러스 @Length 까지 삭제가 이루어집니다 마지막 값의 문자, 열에 기본 값의 끝을 초과 합니다.If @Offset plus @Length exceeds the end of the underlying value in the column, the deletion occurs up to the last character of the value. 경우 @Offset LEN 더하기 () 내부 보다 큰 크기를 선언 하면 오류가 발생 합니다.If @Offset plus LEN(expression) is greater than the underlying declared size, an error is raised.

@Length시작 하 여 열의의 섹션 길이 @Offset , 즉 교체 합니다.@Length is the length of the section in the column, starting from @Offset, that is replaced by expression. @Lengthbigint 하며 음수가 될 수 없습니다.@Length is bigint and cannot be a negative number. 경우 @Length 이 NULL 이면 업데이트 작업에서 데이터를 모두 제거 @Offset 의 끝에는 column_name 값입니다.If @Length is NULL, the update operation removes all data from @Offset to the end of the column_name value.

자세한 내용은 설명 부분을 참조하세요.For more information, see Remarks.

@변수@ variable
선언 된 변수에서 반환 된 값으로 설정 된 합니다.Is a declared variable that is set to the value returned by expression.

설정 @ 변수 = = 는 같은 변수를 설정 합니다. 열 값입니다.SET @variable = column = expression sets the variable to the same value as the column. 집합에서이 점에서 차이가 @ 변수 = , = , 변수 열의 업데이트 전 값을 설정 합니다.This differs from SET @variable = column, column = expression, which sets the variable to the pre-update value of the column.

<OUTPUT_Clause ><OUTPUT_Clause>
UPDATE 작업의 일부로서 업데이트된 데이터 또는 이를 바탕으로 한 식을 반환합니다.Returns updated data or expressions based on it as part of the UPDATE operation. OUTPUT 절은 원격 테이블 또는 뷰를 대상으로 하는 어떤 DML 문에서도 지원되지 않습니다.The OUTPUT clause is not supported in any DML statements that target remote tables or views. 자세한 내용은 참조 OUTPUT 절 ( Transact SQL ) .For more information, see OUTPUT Clause (Transact-SQL).

<b l e _ >FROM <table_source>
업데이트 작업의 기준이 될 테이블, 뷰 또는 파생된 테이블 원본을 지정합니다.Specifies that a table, view, or derived table source is used to provide the criteria for the update operation. 자세한 내용은 FROM(Transact-SQL)을 참조하세요.For more information, see FROM (Transact-SQL).

업데이트되는 개체가 FROM 절의 개체와 같고 개체에 대한 참조가 FROM 절에 하나만 있는 경우, 개체 별칭은 지정될 수도 있고 지정되지 않을 수도 있습니다.If the object being updated is the same as the object in the FROM clause and there is only one reference to the object in the FROM clause, an object alias may or may not be specified. 업데이트되는 개체가 FROM 절에서 두 번 이상 나타날 경우 개체에 대한 단 한 번의 참조로 테이블 별칭을 지정할 수는 없습니다.If the object being updated appears more than one time in the FROM clause, one, and only one, reference to the object must not specify a table alias. FROM 절의 개체에 대한 다른 모든 참조에는 개체 별칭이 포함되어야 합니다.All other references to the object in the FROM clause must include an object alias.

INSTEAD OF UPDATE 트리거가 있는 뷰는 FROM 절이 있는 UPDATE의 대상이 될 수 없습니다.A view with an INSTEAD OF UPDATE trigger cannot be a target of an UPDATE with a FROM clause.

참고

FROM 절에서 OPENDATASOURCE, OPENQUERY 또는 OPENROWSET에 대한 모든 호출은 두 호출에 동일한 인수가 제공되는 경우에도 업데이트의 대상으로 사용되는 함수에 대한 호출과는 개별적이고 독립적으로 평가됩니다.Any call to OPENDATASOURCE, OPENQUERY, or OPENROWSET in the FROM clause is evaluated separately and independently from any call to these functions used as the target of the update, even if identical arguments are supplied to the two calls. 특히 이러한 호출 중 하나의 결과에 적용되는 필터 또는 조인 조건은 다른 호출의 결과에 영향을 미치지 않습니다.In particular, filter or join conditions applied on the result of one of those calls have no effect on the results of the other.

WHEREWHERE
업데이트되는 열을 제한하는 조건을 지정합니다.Specifies the conditions that limit the rows that are updated. 어떤 형식의 WHERE 절을 사용하는가에 따라 다음 두 가지 업데이트 형식이 있습니다.There are two forms of update based on which form of the WHERE clause is used:

  • 검색 결과 업데이트 - 삭제할 행을 제한하는 검색 조건을 지정합니다.Searched updates specify a search condition to qualify the rows to delete.

  • 현재 위치 업데이트 - 커서를 지정하는 CURRENT OF 절을 사용합니다.Positioned updates use the CURRENT OF clause to specify a cursor. 이 경우 커서의 현재 위치에서 업데이트 작업이 이루어집니다.The update operation occurs at the current position of the cursor.

<c h _ c ><search_condition>
업데이트할 행을 결정하는 조건을 지정합니다.Specifies the condition to be met for the rows to be updated. 조인을 기반으로 하는 조건도 검색 조건으로 사용할 수 있습니다.The search condition can also be the condition upon which a join is based. 검색 조건에 포함시킬 수 있는 조건자의 개수에는 제한이 없습니다.There is no limit to the number of predicates that can be included in a search condition. 조건자와 검색 조건에 대 한 자세한 내용은 참조 검색 조건 ( Transact SQL ) .For more information about predicates and search conditions, see Search Condition (Transact-SQL).

CURRENT OFCURRENT OF
지정한 커서의 현재 위치에서 업데이트가 수행되도록 지정합니다.Specifies that the update is performed at the current position of the specified cursor.

WHERE CURRENT OF 절을 사용하여 현재 위치 업데이트를 수행하면 커서의 현재 위치에서 단일 행을 업데이트합니다.A positioned update using a WHERE CURRENT OF clause updates the single row at the current position of the cursor. 이 WHERE를 사용 하는 검색 결과 업데이트 보다 정확한 수 <c h _ c >는 업데이트할 행을 한 정하는 데 절.This can be more accurate than a searched update that uses a WHERE <search_condition> clause to qualify the rows to be updated. 검색 결과 업데이트는 검색 조건이 단일 행을 고유하게 식별하지 못할 경우 여러 행을 변경할 수 있습니다.A searched update modifies multiple rows when the search condition does not uniquely identify a single row.

GLOBALGLOBAL
지정 하는 cursor_name 전역 커서를 참조 합니다.Specifies that cursor_name refers to a global cursor.

cursor_namecursor_name
인출이 수행되는 열린 커서의 이름입니다.Is the name of the open cursor from which the fetch should be made. 전역 및 로컬 커서 이름의 경우 cursor_name 존재, GLOBAL이 고, 그렇지 않으면 지정 된 경우이 인수는 전역 커서를, 로컬 커서를 참조 합니다.If both a global and a local cursor with the name cursor_name exist, this argument refers to the global cursor if GLOBAL is specified; otherwise, it refers to the local cursor. 커서는 업데이트될 수 있어야 합니다.The cursor must allow updates.

cursor_variable_namecursor_variable_name
커서 변수의 이름입니다.Is the name of a cursor variable. cursor_variable_name 업데이트를 허용 하는 커서를 참조 해야 합니다.cursor_variable_name must reference a cursor that allows updates.

옵션 ( <쿼리 힌트 > [ ,... n ] )OPTION ( <query_hint> [ ,... n ] )
데이터베이스 엔진Database Engine이 문을 처리하는 방식을 사용자 지정하기 위한 최적화 프로그램 힌트를 지정합니다.Specifies that optimizer hints are used to customize the way the 데이터베이스 엔진Database Engine processes the statement. 자세한 내용은 쿼리 힌트(Transact-SQL)를 참조하세요.For more information, see Query Hints (Transact-SQL).

최선의 구현 방법Best Practices

사용 된 @@ROWCOUNT 삽입 된 클라이언트 응용 프로그램에는 행의 수를 반환 하는 함수입니다.Use the @@ROWCOUNT function to return the number of inserted rows to the client application. 자세한 내용은 참조 @@ROWCOUNT ( Transact SQL ) .For more information, see @@ROWCOUNT (Transact-SQL).

UPDATE 문에서 변수 이름을 사용하면 영향을 받는 이전 값과 새로운 값을 표시할 수 있지만 이는 UPDATE 문이 단일 레코드에 영향을 줄 경우에만 사용할 수 있는 방법입니다.Variable names can be used in UPDATE statements to show the old and new values affected, but this should be used only when the UPDATE statement affects a single record. 경우 UPDATE 문은 각 레코드에 대 한 기존 패턴과 새 값을 반환 하려면 여러 레코드를 사용 하 여는 OUTPUT 절합니다.If the UPDATE statement affects multiple records, to return the old and new values for each record, use the OUTPUT clause.

업데이트 작업의 기준을 제공하는 FROM 절을 지정할 때는 주의해야 합니다.Use caution when specifying the FROM clause to provide the criteria for the update operation. 업데이트되는 각 열에 대해 하나의 값만 가능하도록 지정되지 않은 FROM 절이 문에 포함된 경우(즉, UPDATE 문이 비결정적인 경우) UPDATE 문의 결과가 정의되지 않습니다.The results of an UPDATE statement are undefined if the statement includes a FROM clause that is not specified in such a way that only one value is available for each column occurrence that is updated, that is if the UPDATE statement is not deterministic. 예를 들어 다음 스크립트의 UPDATE 문에서 Table1에 있는 두 행이 UPDATE 문의 FROM 절 조건을 충족하지만 Table1의 행을 업데이트하기 위해 Table2.의 어떤 행을 사용할 것인지는 정의되지 않았습니다.For example, in the UPDATE statement in the following script, both rows in Table1 meet the qualifications of the FROM clause in the UPDATE statement; but it is undefined which row from Table1 is used to update the row in Table2.

USE AdventureWorks2012;  
GO  
IF OBJECT_ID ('dbo.Table1', 'U') IS NOT NULL  
    DROP TABLE dbo.Table1;  
GO  
IF OBJECT_ID ('dbo.Table2', 'U') IS NOT NULL  
    DROP TABLE dbo.Table2;  
GO  
CREATE TABLE dbo.Table1   
    (ColA int NOT NULL, ColB decimal(10,3) NOT NULL);  
GO  
CREATE TABLE dbo.Table2   
    (ColA int PRIMARY KEY NOT NULL, ColB decimal(10,3) NOT NULL);  
GO  
INSERT INTO dbo.Table1 VALUES(1, 10.0), (1, 20.0);  
INSERT INTO dbo.Table2 VALUES(1, 0.0);  
GO  
UPDATE dbo.Table2   
SET dbo.Table2.ColB = dbo.Table2.ColB + dbo.Table1.ColB  
FROM dbo.Table2   
    INNER JOIN dbo.Table1   
    ON (dbo.Table2.ColA = dbo.Table1.ColA);  
GO  
SELECT ColA, ColB   
FROM dbo.Table2;  

FROM 및 WHERE CURRENT OF 절을 함께 사용할 때도 같은 문제가 발생합니다.The same problem can occur when the FROM and WHERE CURRENT OF clauses are combined. 다음 예에서 Table2 테이블의 두 행은 FROM 문에 있는 UPDATE 절의 조건을 충족시킵니다.In the following example, both rows in Table2 meet the qualifications of the FROM clause in the UPDATE statement. 하지만 Table2의 행을 업데이트하기 위해 Table1의 어떤 행을 사용할 것인지는 정의되지 않았습니다.It is undefined which row from Table2 is to be used to update the row in Table1.

USE AdventureWorks2012;  
GO  
IF OBJECT_ID ('dbo.Table1', 'U') IS NOT NULL  
    DROP TABLE dbo.Table1;  
GO  
IF OBJECT_ID ('dbo.Table2', 'U') IS NOT NULL  
    DROP TABLE dbo.Table2;  
GO  
CREATE TABLE dbo.Table1  
    (c1 int PRIMARY KEY NOT NULL, c2 int NOT NULL);  
GO  
CREATE TABLE dbo.Table2  
    (d1 int PRIMARY KEY NOT NULL, d2 int NOT NULL);  
GO  
INSERT INTO dbo.Table1 VALUES (1, 10);  
INSERT INTO dbo.Table2 VALUES (1, 20), (2, 30);  
GO  
DECLARE abc CURSOR LOCAL FOR  
    SELECT c1, c2   
    FROM dbo.Table1;  
OPEN abc;  
FETCH abc;  
UPDATE dbo.Table1   
SET c2 = c2 + d2   
FROM dbo.Table2   
WHERE CURRENT OF abc;  
GO  
SELECT c1, c2 FROM dbo.Table1;  
GO  

호환성 지원Compatibility Support

UPDATE 또는 DELETE 문의 대상 테이블에 적용되는 FROM 절의 READUNCOMMITTED 및 NOLOCK 힌트 사용 지원은 SQL ServerSQL Server의 이후 버전에서 제거될 예정입니다.Support for use of the READUNCOMMITTED and NOLOCK hints in the FROM clause that apply to the target table of an UPDATE or DELETE statement will be removed in a future version of SQL ServerSQL Server. 새 개발 작업에서는 이 컨텍스트에서 이러한 힌트를 사용하지 않도록 하고 현재 이 힌트를 사용하는 응용 프로그램은 수정하세요.Avoid using these hints in this context in new development work, and plan to modify applications that currently use them.

데이터 형식Data Types

모든 charnchar 열은 정의 된 길이를 오른쪽으로 채워집니다.All char and nchar columns are right-padded to the defined length.

ANSI_PADDING이 OFF로 설정 하는 경우 모든 후행 공백이 삽입 된 데이터에서 제거 됩니다 varcharnvarchar 열, 공백만 포함 하는 문자열은 예외입니다.If ANSI_PADDING is set to OFF, all trailing spaces are removed from data inserted into varchar and nvarchar columns, except in strings that contain only spaces. 공백만 있는 문자열은 빈 문자열로 잘립니다.These strings are truncated to an empty string. ANSI_PADDING이 ON으로 설정되면 후행 공백이 삽입됩니다.If ANSI_PADDING is set to ON, trailing spaces are inserted. Microsoft SQL Server ODBC 드라이버와 SQL Server용 OLE DB 공급자는 각 연결에 대해 ANSI_PADDING ON을 자동 설정합니다.The Microsoft SQL Server ODBC driver and OLE DB Provider for SQL Server automatically set ANSI_PADDING ON for each connection. 이 설정은 ODBC 데이터 원본이나 연결 특성 또는 속성을 통해 구성할 수 있습니다.This can be configured in ODBC data sources or by setting connection attributes or properties. 자세한 내용은 SET ANSI_PADDING(Transact-SQL)을 참조하세요.For more information, see SET ANSI_PADDING (Transact-SQL).

text, ntext 및 image 열 업데이트Updating text, ntext, and image Columns

수정 된 텍스트, ntext, 또는 이미지 업데이트로 열 열 초기화 유효한 텍스트 포인터를 할당 하 고 하지 않는 한 하나 이상의 데이터 페이지가 할당는 열이 NULL로 업데이트 되 고 있습니다.Modifying a text, ntext, or image column with UPDATE initializes the column, assigns a valid text pointer to it, and allocates at least one data page, unless the column is being updated with NULL.

바꾸거나 수정 텍스트, ntext, 또는 이미지 데이터를 사용 하 여 WRITETEXT 또는 UPDATETEXT UPDATE 문 대신 합니다.To replace or modify large blocks of text, ntext, or image data, use WRITETEXT or UPDATETEXT instead of the UPDATE statement.

UPDATE 문이 모두 클러스터링 키와 하나 이상의 업데이트 하는 동안 하나 이상의 행을 변경할 수 있는 경우 텍스트, ntext, 또는 이미지 열, 부분 업데이트 이러한 열 값의 전체 대체 값으로 실행 됩니다.If the UPDATE statement could change more than one row while updating both the clustering key and one or more text, ntext, or image columns, the partial update to these columns is executed as a full replacement of the values.

중요

ntext, 텍스트, 및 이미지 데이터 형식은 나중 버전의에서 제거 됩니다 MicrosoftMicrosoft SQL ServerSQL Server합니다.The ntext, text, and image data types will be removed in a future version of MicrosoftMicrosoft SQL ServerSQL Server. 향후 개발 작업에서는 이 데이터 형식을 사용하지 않도록 하고 현재 이 데이터 형식을 사용하는 응용 프로그램은 수정하세요.Avoid using these data types in new development work, and plan to modify applications that currently use them. 대신 nvarchar(max), varchar(max)varbinary(max) 를 사용합니다.Use nvarchar(max), varchar(max), and varbinary(max) instead.

큰 값 데이터 형식 업데이트Updating Large Value Data Types

사용 하 여 . 쓰기 (, @Offset ,@Length) 절을 전체 또는 일부 업데이트를 수행 varchar (max), nvarchar (max), 및 varbinary (max) 데이터 형식입니다.Use the .WRITE (expression, @Offset,@Length) clause to perform a partial or full update of varchar(max), nvarchar(max), and varbinary(max) data types. 예를 들어의 부분 업데이트는 varchar (max) 열을 삭제 하거나 전체 업데이트는 삭제 하거나 열에서 모든 데이터를 수정 하는 반면 열의 처음 200 자만 수정할 수 있습니다.For example, a partial update of a varchar(max) column might delete or modify only the first 200 characters of the column, whereas a full update would delete or modify all the data in the column. . 삽입 또는 새 데이터 추가 최소 로깅하도록 업데이트 데이터베이스 복구 모델이 대량 로그 또는 단순으로 설정 된 경우를 작성 합니다..WRITE updates that insert or append new data are minimally logged if the database recovery model is set to bulk-logged or simple. 기존 값이 업데이트되면 최소 로깅이 사용되지 않습니다.Minimal logging is not used when existing values are updated. 자세한 내용은 트랜잭션 로그(SQL Server)을(를) 참조하세요.For more information, see The Transaction Log (SQL Server).

데이터베이스 엔진Database Engine은 UPDATE 문이 다음 중 한 가지 동작을 유발할 때 부분 업데이트를 전체 업데이트로 변환합니다.The 데이터베이스 엔진Database Engine converts a partial update to a full update when the UPDATE statement causes either of these actions:

  • 분할된 뷰 또는 테이블의 키 열을 변경합니다.Changes a key column of the partitioned view or table.
  • 하나 이상의 행을 변경하고 고유하지 않은 클러스터형 인덱스의 키를 상수가 아닌 값으로 업데이트합니다.Modifies more than one row and also updates the key of a nonunique clustered index to a nonconstant value.

사용할 수 없습니다는 . NULL 열을 업데이트 하거나 값을 설정 하려면 WRITE 절 column_name NULL로 합니다.You cannot use the .WRITE clause to update a NULL column or set the value of column_name to NULL.

@Offset@Length 에 대 한 바이트에 지정 된 varbinaryvarchar 데이터 형식 및에 대 한 문자는 nvarchar데이터 형식입니다.@Offset and @Length are specified in bytes for varbinary and varchar data types and in characters for the nvarchar data type. 오프셋은 DBCS(더블바이트 문자 집합) 데이터 정렬에 맞게 적절히 계산됩니다.The appropriate offsets are computed for double-byte character set (DBCS) collations.

최상의 성능을 위해 8,040바이트의 배수인 청크 크기로 데이터를 삽입 또는 업데이트하는 것이 좋습니다.For best performance, we recommend that data be inserted or updated in chunk sizes that are multiples of 8040 bytes.

수정 된 열은 . 절에서에서 참조 된 열의 전체 값 OUTPUT 절 즉 쓰기는 이전 이미지 삭제. column_name 또는 이후 이미지가 삽입. column_name, 테이블 변수에서 지정된 된 열에 반환 됩니다.If the column modified by the .WRITE clause is referenced in an OUTPUT clause, the complete value of the column, either the before image in deleted.column_name or the after image in inserted.column_name, is returned to the specified column in the table variable. 다음에 나오는 R 예제를 참조 하십시오.See example R that follows.

동일한 기능을 얻기 위해 . 다른 문자 또는 이진 데이터 형식 쓰기, 사용 된 항목 ( Transact SQL ) .To achieve the same functionality of .WRITE with other character or binary data types, use the STUFF (Transact-SQL).

사용자 정의 형식 열 업데이트Updating User-defined Type Columns

다음 중 한 가지 방법으로 사용자 정의 형식 열의 값을 업데이트할 수 있습니다.Updating values in user-defined type columns can be accomplished in one of the following ways:

  • 사용자 정의 형식에서 SQL ServerSQL Server 시스템 데이터 형식의 암시적 또는 명시적 변환이 지원되는 경우 해당 형식의 값을 제공합니다.Supplying a value in a SQL ServerSQL Server system data type, as long as the user-defined type supports implicit or explicit conversion from that type. 다음 예에서는 문자열에서 명시적 변환을 통해 사용자 정의 형식인 Point 열의 값을 업데이트하는 방법을 보여 줍니다.The following example shows how to update a value in a column of user-defined type Point, by explicitly converting from a string.

    UPDATE Cities  
    SET Location = CONVERT(Point, '12.3:46.2')  
    WHERE Name = 'Anchorage';  
    
  • 변경자(mutator)로 표시된 사용자 정의 형식의 메서드를 호출하여 업데이트를 수행합니다.Invoking a method, marked as a mutator, of the user-defined type, to perform the update. 다음 예에서는 Point라는 SetXY 유형의 변경자 메서드를 호출합니다.The following example invokes a mutator method of type Point named SetXY. 해당 유형의 인스턴스 상태가 업데이트됩니다.This updates the state of the instance of the type.

    UPDATE Cities  
    SET Location.SetXY(23.5, 23.5)  
    WHERE Name = 'Anchorage';  
    

    참고

    SQL ServerSQL Server Null 값에서 변경자(mutator) 메서드를 호출하거나 변경자(mutator) 메서드에 의해 생성된 새 값이 Null이면 Transact-SQLTransact-SQL에서 오류가 반환됩니다. returns an error if a mutator method is invoked on a Transact-SQLTransact-SQL null value, or if a new value produced by a mutator method is null.

  • 등록된 속성 또는 사용자 정의 형식의 공용 데이터 멤버 값을 변경합니다.Modifying the value of a registered property or public data member of the user-defined type. 값을 제공하는 식은 암시적으로 해당 속성 유형으로 변환할 수 있어야 합니다.The expression supplying the value must be implicitly convertible to the type of the property. 다음 예에서는 사용자 정의 형식 XPoint 속성 값을 수정합니다.The following example modifies the value of property X of user-defined type Point.

    UPDATE Cities  
    SET Location.X = 23.5  
    WHERE Name = 'Anchorage';  
    

    동일한 사용자 정의 형식 열의 다른 속성을 수정하려면 UPDATE 문을 실행하거나 해당 유형의 변경자(mutator) 메서드를 호출합니다.To modify different properties of the same user-defined type column, issue multiple UPDATE statements, or invoke a mutator method of the type.

FILESTREAM 데이터 업데이트Updating FILESTREAM Data

UPDATE 문을 통해 FILESTREAM 필드를 Null 값, 비어 있는 값 또는 상대적으로 짧은 인라인 데이터로 업데이트할 수 있습니다.You can use the UPDATE statement to update a FILESTREAM field to a null value, empty value, or a relatively small amount of inline data. 그러나 크기가 큰 데이터는 Win32 인터페이스를 사용하여 파일로 좀 더 효율적으로 스트리밍됩니다.However, a large amount of data is more efficiently streamed into a file by using Win32 interfaces. FILESTREAM 필드를 업데이트할 때 파일 시스템의 기본 BLOB 데이터를 수정합니다.When you update a FILESTREAM field, you modify the underlying BLOB data in the file system. FILESTREAM 필드를 NULL로 설정하면 이 필드와 연결된 BLOB 데이터가 삭제됩니다.When a FILESTREAM field is set to NULL, the BLOB data associated with the field is deleted. 사용할 수 없습니다. Write () FILESTREAM 데이터에 부분 업데이트를 수행 합니다.You cannot use .WRITE(), to perform partial updates to FILESTREAM data. 자세한 내용은 FILESTREAM(SQL Server)을 참조하세요.For more information, see FILESTREAM (SQL Server).

오류 처리Error Handling

행에 대한 업데이트가 제약 조건이나 규칙을 위반할 경우, 열에 대한 NULL 설정을 위반할 경우 또는 새 값이 호환되지 않는 데이터 형식인 경우에는 문이 취소되고 오류가 반환되며 레코드가 업데이트되지 않습니다.If an update to a row violates a constraint or rule, violates the NULL setting for the column, or the new value is an incompatible data type, the statement is canceled, an error is returned, and no records are updated.

식을 평가할 때 UPDATE 문에 산술 오류(오버플로, 0으로 나누기 또는 도메인 오류)가 발생하면 업데이트가 실행되지 않으며When an UPDATE statement encounters an arithmetic error (overflow, divide by zero, or a domain error) during expression evaluation, the update is not performed. 나머지 일괄 처리가 실행되지 않고 오류 메시지가 반환됩니다.The rest of the batch is not executed, and an error message is returned.

클러스터형 인덱스에 참여하는 열을 업데이트하여 클러스터형 인덱스와 행의 크기가 8,060바이트를 넘어서면 업데이트가 실패하고 오류 메시지가 반환됩니다.If an update to a column or columns participating in a clustered index causes the size of the clustered index and the row to exceed 8,060 bytes, the update fails and an error message is returned.

상호 운용성Interoperability

수정되고 있는 테이블이 테이블 변수인 경우에만 UPDATE 문이 사용자 정의 함수의 본문에 허용됩니다.UPDATE statements are allowed in the body of user-defined functions only if the table being modified is a table variable.

테이블에 대한 UPDATE 동작에 INSTEAD OF 트리거가 정의되면 UPDATE 문 대신 트리거가 실행됩니다.When an INSTEAD OF trigger is defined on UPDATE actions against a table, the trigger is running instead of the UPDATE statement. 이전 버전의 SQL ServerSQL Server에서는 UPDATE 및 기타 데이터 수정 문에서 정의된 AFTER 트리거만 지원되었습니다.Earlier versions of SQL ServerSQL Server only support AFTER triggers defined on UPDATE and other data modification statements. INSTEAD OF 트리거가 정의되어 있는 뷰를 직접 또는 간접적으로 참조하는 UPDATE 문에는 FROM 절을 지정할 수 없습니다.The FROM clause cannot be specified in an UPDATE statement that references, either directly or indirectly, a view with an INSTEAD OF trigger defined on it. Instead of 트리거에 대 한 자세한 내용은 참조 하세요. CREATE trigger( Transact SQL ) .For more information about INSTEAD OF triggers, see CREATE TRIGGER (Transact-SQL).

제한 사항Limitations and Restrictions

INSTEAD OF 트리거가 정의되어 있는 뷰를 직접 또는 간접적으로 참조하는 UPDATE 문에는 FROM 절을 지정할 수 없습니다.The FROM clause cannot be specified in an UPDATE statement that references, either directly or indirectly, a view that has an INSTEAD OF trigger defined on it. Instead of 트리거에 대 한 자세한 내용은 참조 하세요. CREATE trigger( Transact SQL ) .For more information about INSTEAD OF triggers, see CREATE TRIGGER (Transact-SQL).

CTE(공통 테이블 식)가 UPDATE 문의 대상인 경우 문에서 CTE에 대한 모든 참조가 일치해야 합니다.When a common table expression (CTE) is the target of an UPDATE statement, all references to the CTE in the statement must match. 예를 들어 FROM 절에서 CTE에 별칭이 지정된 경우 CTE에 대한 다른 모든 참조에서 이 별칭을 사용해야 합니다.For example, if the CTE is assigned an alias in the FROM clause, the alias must be used for all other references to the CTE. SQL ServerSQL Server에서는 개체 ID를 사용하여 개체와 해당 별칭 간의 암시적 관계를 인식하는데, CTE는 개체 ID가 없기 때문에 CTE 참조가 분명해야 합니다.Unambiguous CTE references are required because a CTE does not have an object ID, which SQL ServerSQL Server uses to recognize the implicit relationship between an object and its alias. 이 관계가 없으면 쿼리 계획에서 예기치 않은 조인 동작과 의도하지 않은 쿼리 결과가 발생할 수 있습니다.Without this relationship, the query plan may produce unexpected join behavior and unintended query results. 다음 예에서는 CTE가 업데이트 작업의 대상 개체일 때 CTE를 지정하는 올바른 방법과 잘못된 방법을 보여 줍니다.The following examples demonstrate correct and incorrect methods of specifying a CTE when the CTE is the target object of the update operation.

USE tempdb;  
GO  
-- UPDATE statement with CTE references that are correctly matched.  
DECLARE @x TABLE (ID int, Value int);  
DECLARE @y TABLE (ID int, Value int);  
INSERT @x VALUES (1, 10), (2, 20);  
INSERT @y VALUES (1, 100),(2, 200);  

WITH cte AS (SELECT * FROM @x)  
UPDATE x -- cte is referenced by the alias.  
SET Value = y.Value  
FROM cte AS x  -- cte is assigned an alias.  
INNER JOIN @y AS y ON y.ID = x.ID;  
SELECT * FROM @x;  
GO  

결과 집합은 다음과 같습니다.Here is the result set.

ID     Value  
------ -----  
1      100  
2      200  
(2 row(s) affected)  

UPDATE 문을 올바르게 일치 CTE 참조를 사용 합니다.UPDATE statement with CTE references that are incorrectly matched.

USE tempdb;  
GO  
DECLARE @x TABLE (ID int, Value int);  
DECLARE @y TABLE (ID int, Value int);  
INSERT @x VALUES (1, 10), (2, 20);  
INSERT @y VALUES (1, 100),(2, 200);  

WITH cte AS (SELECT * FROM @x)  
UPDATE cte   -- cte is not referenced by the alias.  
SET Value = y.Value  
FROM cte AS x  -- cte is assigned an alias.  
INNER JOIN @y AS y ON y.ID = x.ID;   
SELECT * FROM @x;   
GO  

결과 집합은 다음과 같습니다.Here is the result set.

ID     Value  
------ -----  
1      100  
2      100  
(2 row(s) affected)  

잠금 동작Locking Behavior

UPDATE 문은 항상 수정하는 테이블에 대해 배타적(X) 잠금을 획득하고 해당 트랜잭션이 완료될 때까지 이 잠금을 보유합니다.An UPDATE statement always acquires an exclusive (X) lock on the table it modifies, and holds that lock until the transaction completes. 배타적 잠금이 설정되면 다른 트랜잭션에서 데이터를 수정할 수 없습니다.With an exclusive lock, no other transactions can modify data. 테이블 힌트를 지정해 다른 잠금 방법을 지정하여 UPDATE 문의 기간에 이 기본 동작을 재정의할 수 있지만, 숙련된 개발자 및 데이터베이스 관리자가 최후의 수단으로만 힌트를 사용하시기 바랍니다.You can specify table hints to override this default behavior for the duration of the UPDATE statement by specifying another locking method, however, we recommend that hints be used only as a last resort by experienced developers and database administrators. 자세한 내용은 테이블 힌트(Transact-SQL)를 참조하세요.For more information, see Table Hints (Transact-SQL).

로깅 동작Logging Behavior

UPDATE 문은 기록 됩니다. 그러나 한 부분을 사용 하 여 큰 값 데이터 형식 업데이트는 . 절은 최소한으로 기록에 작성 합니다.The UPDATE statement is logged; however, partial updates to large value data types using the .WRITE clause are minimally logged. 자세한 내용은 "업데이트 큰 값 데이터 형식" 이전 단원의 "데이터 형식"을 참조 하십시오.For more information, see "Updating Large Value Data Types" in the earlier section “Data Types”.

보안Security

PermissionsPermissions

대상 테이블에 대한 UPDATE 권한이 필요합니다.UPDATE permissions are required on the target table. 되어 필요한 경우 또는 UPDATE 문의 WHERE 절을 포함 하는 경우 업데이트 되는 테이블에 대 한 SELECT 권한도 집합에 절에서 테이블의 열을 사용 합니다.SELECT permissions are also required for the table being updated if the UPDATE statement contains a WHERE clause, or if expression in the SET clause uses a column in the table.

멤버에 게 권한은 기본적으로 업데이트는 sysadmin 고정 서버 역할의 db_ownerdb_datawriter 고정 데이터베이스 역할 및 테이블 소유자입니다.UPDATE permissions default to members of the sysadmin fixed server role, the db_owner and db_datawriter fixed database roles, and the table owner. 멤버는 sysadmin, db_owner, 및 db_securityadmin 역할 및 테이블 소유자 권한을 다른 사용자에 게 위임할 수 있습니다.Members of the sysadmin, db_owner, and db_securityadmin roles, and the table owner can transfer permissions to other users.

Examples

범주Category 중요한 구문 요소Featured syntax elements
기본 구문Basic Syntax UPDATEUPDATE
업데이트 되는 행 제한Limiting the Rows that Are Updated WHERE • TOP • WITH 공통 테이블 식 • WHERE CURRENT OFWHERE • TOP • WITH common table expression • WHERE CURRENT OF
열 값 설정Setting Column Values 계산 값 • 복합 연산자 • 기본값 • 하위 쿼리computed values • compound operators • default values • subqueries
표준 테이블 이외의 대상 개체 지정Specifying Target Objects Other than Standard Tables 뷰 • 테이블 변수 • 테이블 별칭views • table variables • table aliases
다른 테이블의 데이터를 기반으로 하는 데이터 업데이트Updating Data Based on Data From Other Tables FROMFROM
원격 테이블의 행 업데이트Updating Rows in a Remote Table 연결된 서버 • OPENQUERY • OPENDATASOURCElinked server • OPENQUERY • OPENDATASOURCE
큰 개체 데이터 형식 업데이트Updating Large Object Data Types . • OPENROWSET 작성.WRITE • OPENROWSET
사용자 정의 형식 업데이트Updating User-defined Types 사용자 정의 형식user-defined types
힌트를 사용 하 여 쿼리 최적화 프로그램의 기본 동작 재정의Overriding the Default Behavior of the Query Optimizer by Using Hints 테이블 힌트 • 쿼리 힌트table hints • query hints
UPDATE 문의 결과 캡처Capturing the Results of the UPDATE Statement OUTPUT 절OUTPUT clause
다른 문에서 UPDATE 사용Using UPDATE in Other Statements 저장 프로시저 • TRY…CATCHStored Procedures • TRY…CATCH

기본 구문 Basic Syntax

이 섹션의 예에서는 최소 필수 구문을 사용하여 UPDATE 문의 기본 기능을 보여 줍니다.Examples in this section demonstrate the basic functionality of the UPDATE statement using the minimum required syntax.

1.A. 단순 UPDATE 문 사용Using a simple UPDATE statement

다음 예에서는 Person.Address 테이블의 모든 행에 대해 단일 열을 업데이트합니다.The following example updates a single column for all rows in the Person.Address table.

USE AdventureWorks2012;  
GO  
UPDATE Person.Address  
SET ModifiedDate = GETDATE();  

2.B. 여러 열 업데이트Updating multiple columns

다음 예에서는 Bonus 테이블의 모든 행에 대해 CommissionPct, SalesQuotaSalesPerson 열의 값을 업데이트합니다.The following example updates the values in the Bonus, CommissionPct, and SalesQuota columns for all rows in the SalesPerson table.

USE AdventureWorks2012;  
GO  
UPDATE Sales.SalesPerson  
SET Bonus = 6000, CommissionPct = .10, SalesQuota = NULL;  
GO  

업데이트 되는 행 제한 Limiting the Rows that Are Updated

이 섹션의 예에서는 UPDATE 문의 영향을 받는 행 수를 제한하는 데 사용할 수 있는 방법을 보여 줍니다.Examples in this section demonstrate ways that you can use to limit the number of rows affected by the UPDATE statement.

3.C. WHERE 절 사용Using the WHERE clause

다음 예에서는 WHERE 절을 사용하여 업데이트할 행을 지정합니다.The following example uses the WHERE clause to specify which rows to update. 이 문은 Color 테이블에서 Production.Product 열의 기존 값이 'Red'이고 Color 열의 값이 'Road-250'으로 시작하는 모든 행에 대해 Name 열의 값을 업데이트합니다.The statement updates the value in the Color column of the Production.Product table for all rows that have an existing value of 'Red' in the Color column and have a value in the Name column that starts with 'Road-250'.

USE AdventureWorks2012;  
GO  
UPDATE Production.Product  
SET Color = N'Metallic Red'  
WHERE Name LIKE N'Road-250%' AND Color = N'Red';  
GO  

4.D. TOP 절 사용Using the TOP clause

다음 예에서는 UPDATE 문에 TOP 절을 사용하여 수정되는 행 수를 제한합니다.The following examples use the TOP clause to limit the number of rows that are modified in an UPDATE statement. Top (n) 절을 사용 하 여 업데이트, 업데이트 작업을 임의로 선택에서 수행 됩니다 'n' 개 행입니다.When a TOP (n) clause is used with UPDATE, the update operation is performed on a random selection of 'n' number of rows. 다음 예에서는 VacationHours 테이블에 있는 임의의 10개 행의 Employee 열을 25% 업데이트합니다.The following example updates the VacationHours column by 25 percent for 10 random rows in the Employee table.

USE AdventureWorks2012;
GO
UPDATE TOP (10) HumanResources.Employee
SET VacationHours = VacationHours * 1.25 ;
GO  

TOP를 사용하여 의미 있는 연대순으로 업데이트를 적용해야 할 경우 하위 SELECT 문에서 TOP를 ORDER BY와 함께 사용해야 합니다.If you must use TOP to apply updates in a meaningful chronology, you must use TOP together with ORDER BY in a subselect statement. 다음 예에서는 채용일이 가장 빠른 직원 10명의 휴가 기간을 업데이트합니다.The following example updates the vacation hours of the 10 employees with the earliest hire dates.

UPDATE HumanResources.Employee  
SET VacationHours = VacationHours + 8  
FROM (SELECT TOP 10 BusinessEntityID FROM HumanResources.Employee  
     ORDER BY HireDate ASC) AS th  
WHERE HumanResources.Employee.BusinessEntityID = th.BusinessEntityID;  
GO  

5.E. WITH common_table_expression 절 사용Using the WITH common_table_expression clause

다음 예에서는 PerAssemnblyQty을 만드는 데 직접 또는 간접적으로 사용되는 모든 부분과 구성 요소의 ProductAssemblyID 800 값을 업데이트합니다.The following example updates the PerAssemnblyQty value for all parts and components that are used directly or indirectly to create the ProductAssemblyID 800. 공통 테이블 식은 ProductAssemblyID 800를 만드는 데 직접 사용되는 부분 및 해당 구성 요소를 만드는 데 사용되는 부분과 같은 식으로 이어지는 계층적 목록을 반환합니다.The common table expression returns a hierarchical list of parts that are used directly to build ProductAssemblyID 800 and parts that are used to build those components, and so on. 이렇게 공통 테이블 식이 반환한 행만 수정됩니다.Only the rows returned by the common table expression are modified.

USE AdventureWorks2012;  
GO  
WITH Parts(AssemblyID, ComponentID, PerAssemblyQty, EndDate, ComponentLevel) AS  
(  
    SELECT b.ProductAssemblyID, b.ComponentID, b.PerAssemblyQty,  
        b.EndDate, 0 AS ComponentLevel  
    FROM Production.BillOfMaterials AS b  
    WHERE b.ProductAssemblyID = 800  
          AND b.EndDate IS NULL  
    UNION ALL  
    SELECT bom.ProductAssemblyID, bom.ComponentID, p.PerAssemblyQty,  
        bom.EndDate, ComponentLevel + 1  
    FROM Production.BillOfMaterials AS bom   
        INNER JOIN Parts AS p  
        ON bom.ProductAssemblyID = p.ComponentID  
        AND bom.EndDate IS NULL  
)  
UPDATE Production.BillOfMaterials  
SET PerAssemblyQty = c.PerAssemblyQty * 2  
FROM Production.BillOfMaterials AS c  
JOIN Parts AS d ON c.ProductAssemblyID = d.AssemblyID  
WHERE d.ComponentLevel = 0;  

6.F. WHERE CURRENT OF 절 사용Using the WHERE CURRENT OF clause

다음 예에서는 WHERE CURRENT OF 절을 사용하여 커서가 있는 행만 업데이트합니다.The following example uses the WHERE CURRENT OF clause to update only the row on which the cursor is positioned. 커서가 조인을 기반으로 할 경우 UPDATE 문에 지정된 table_name만 수정되고When a cursor is based on a join, only the table_name specified in the UPDATE statement is modified. 커서에 사용한 다른 테이블은 영향을 받지 않습니다.Other tables participating in the cursor are not affected.

USE AdventureWorks2012;  
GO  
DECLARE complex_cursor CURSOR FOR  
    SELECT a.BusinessEntityID  
    FROM HumanResources.EmployeePayHistory AS a  
    WHERE RateChangeDate <>   
         (SELECT MAX(RateChangeDate)  
          FROM HumanResources.EmployeePayHistory AS b  
          WHERE a.BusinessEntityID = b.BusinessEntityID) ;  
OPEN complex_cursor;  
FETCH FROM complex_cursor;  
UPDATE HumanResources.EmployeePayHistory  
SET PayFrequency = 2   
WHERE CURRENT OF complex_cursor;  
CLOSE complex_cursor;  
DEALLOCATE complex_cursor;  
GO  

열 값 설정 Setting Column Values

이 섹션의 예에서는 계산 값, 하위 쿼리 및 DEFAULT 값을 사용하여 열을 업데이트하는 방법을 보여 줍니다.Examples in this section demonstrate updating columns by using computed values, subqueries, and DEFAULT values.

7.G. 계산 값 지정Specifying a computed value

다음 예에서는 UPDATE 문에 계산 값을 사용합니다.The following examples uses computed values in an UPDATE statement. 이 예에서는 ListPrice 테이블의 모든 행에 대해 Product 열의 값을 두 배로 만듭니다.The example doubles the value in the ListPrice column for all rows in the Product table.

USE AdventureWorks2012 ;  
GO  
UPDATE Production.Product  
SET ListPrice = ListPrice * 2;  
GO  

8.H. 복합 연산자 지정Specifying a compound operator

다음 예에서는 @NewPrice 변수를 사용하여 현재 가격을 가져오고 여기에 10을 더하여 모든 빨간색 자전거의 가격을 올립니다.The following example uses the variable @NewPrice to increment the price of all red bicycles by taking the current price and adding 10 to it.

USE AdventureWorks2012;  
GO  
DECLARE @NewPrice int = 10;  
UPDATE Production.Product  
SET ListPrice += @NewPrice  
WHERE Color = N'Red';  
GO  

다음 예에서는 += 복합 연산자를 사용하여 ' - tool malfunction'가 10에서 12 사이인 행에 대해 Name 열의 기존 값에 ScrapReasonID을 추가합니다.The following example uses the compound operator += to append the data ' - tool malfunction' to the existing value in the column Name for rows that have a ScrapReasonID between 10 and 12.

USE AdventureWorks2012;  
GO  
UPDATE Production.ScrapReason   
SET Name += ' - tool malfunction'  
WHERE ScrapReasonID BETWEEN 10 and 12;  

9.I. SET 절에 하위 쿼리 지정Specifying a subquery in the SET clause

다음 예에서는 SET 절에 하위 쿼리를 사용하여 열을 업데이트하는 데 사용되는 값을 확인합니다.The following example uses a subquery in the SET clause to determine the value that is used to update the column. 이 하위 쿼리는 스칼라 값, 즉 각 행에 대해 단일 값을 반환해야 합니다.The subquery must return only a scalar value (that is, a single value per row). 이 예에서는 SalesYTD 테이블의 SalesPerson 열을 변경하여 SalesOrderHeader 테이블의 가장 최근 판매 기록을 반영합니다.The example modifies the SalesYTD column in the SalesPerson table to reflect the most recent sales recorded in the SalesOrderHeader table. 하위 쿼리는 UPDATE 문에서 각 영업 사원의 판매를 집계합니다.The subquery aggregates the sales for each salesperson in the UPDATE statement.

USE AdventureWorks2012;  
GO  
UPDATE Sales.SalesPerson  
SET SalesYTD = SalesYTD +   
    (SELECT SUM(so.SubTotal)   
     FROM Sales.SalesOrderHeader AS so  
     WHERE so.OrderDate = (SELECT MAX(OrderDate)  
                           FROM Sales.SalesOrderHeader AS so2  
                           WHERE so2.SalesPersonID = so.SalesPersonID)  
     AND Sales.SalesPerson.BusinessEntityID = so.SalesPersonID  
     GROUP BY so.SalesPersonID);  
GO  

10.J. DEFAULT 값을 사용하여 행 업데이트Updating rows using DEFAULT values

다음 예에서는 CostRate 값이 CostRate보다 큰 모든 행에 대해 20.00 열을 기본값(0.00)으로 설정합니다.The following example sets the CostRate column to its default value (0.00) for all rows that have a CostRate value greater than 20.00.

USE AdventureWorks2012;  
GO  
UPDATE Production.Location  
SET CostRate = DEFAULT  
WHERE CostRate > 20.00;  

표준 테이블 이외의 대상 개체 지정 Specifying Target Objects Other Than Standard Tables

이 섹션의 예에서는 뷰, 테이블 별칭 또는 테이블 변수를 지정하여 행을 업데이트하는 방법을 보여 줍니다.Examples in this section demonstrate how to update rows by specifying a view, table alias, or table variable.

11.K. 뷰를 대상 개체로 지정Specifying a view as the target object

다음 예에서는 뷰를 대상 개체로 지정하여 테이블의 행을 업데이트합니다.The following example updates rows in a table by specifying a view as the target object. 뷰 정의에서는 여러 테이블을 참조하지만 UPDATE 문은 기본 테이블 중 하나의 열만 참조하므로 성공적으로 실행됩니다.The view definition references multiple tables, however, the UPDATE statement succeeds because it references columns from only one of the underlying tables. 모든 테이블의 열을 지정하면 UPDATE 문이 실패합니다.The UPDATE statement would fail if columns from both tables were specified. 자세한 내용은 참조 수정 데이터 뷰를 통해합니다.For more information, see Modify Data Through a View.

USE AdventureWorks2012;  
GO  
UPDATE Person.vStateProvinceCountryRegion  
SET CountryRegionName = 'United States of America'  
WHERE CountryRegionName = 'United States';  

12.L. 테이블 별칭을 대상 개체로 지정Specifying a table alias as the target object

다음 예에서는 Production.ScrapReason 테이블의 행을 업데이트합니다.The follow example updates rows in the table Production.ScrapReason. FROM 절에서 ScrapReason에 할당된 테이블 별칭은 UPDATE 절에서 대상 개체로 지정됩니다.The table alias assigned to ScrapReason in the FROM clause is specified as the target object in the UPDATE clause.

USE AdventureWorks2012;  
GO  
UPDATE sr  
SET sr.Name += ' - tool malfunction'  
FROM Production.ScrapReason AS sr  
JOIN Production.WorkOrder AS wo   
     ON sr.ScrapReasonID = wo.ScrapReasonID  
     AND wo.ScrappedQty > 300;  

13.M. 테이블 변수를 대상 개체로 지정Specifying a table variable as the target object

다음 예에서는 테이블 변수의 행을 업데이트합니다.The following example updates rows in a table variable.

USE AdventureWorks2012;  
GO  
-- Create the table variable.  
DECLARE @MyTableVar table(  
    EmpID int NOT NULL,  
    NewVacationHours int,  
    ModifiedDate datetime);  

-- Populate the table variable with employee ID values from HumanResources.Employee.  
INSERT INTO @MyTableVar (EmpID)  
    SELECT BusinessEntityID FROM HumanResources.Employee;  

-- Update columns in the table variable.  
UPDATE @MyTableVar  
SET NewVacationHours = e.VacationHours + 20,  
    ModifiedDate = GETDATE()  
FROM HumanResources.Employee AS e   
WHERE e.BusinessEntityID = EmpID;  

-- Display the results of the UPDATE statement.  
SELECT EmpID, NewVacationHours, ModifiedDate FROM @MyTableVar  
ORDER BY EmpID;  
GO  

다른 테이블의 데이터를 기반으로 하는 데이터 업데이트 Updating Data Based on Data From Other Tables

이 섹션의 예에서는 한 테이블의 행을 다른 테이블의 정보에 따라 업데이트하는 방법을 보여 줍니다.Examples in this section demonstrate methods of updating rows from one table based on information in another table.

14.N. 다른 테이블의 정보와 함께 UPDATE 문 사용Using the UPDATE statement with information from another table

다음 예에서는 SalesYTD 테이블의 SalesPerson 열을 변경하여 SalesOrderHeader 테이블의 가장 최근 판매 기록을 반영합니다.The following example modifies the SalesYTD column in the SalesPerson table to reflect the most recent sales recorded in the SalesOrderHeader table.

USE AdventureWorks2012;  
GO  
UPDATE Sales.SalesPerson  
SET SalesYTD = SalesYTD + SubTotal  
FROM Sales.SalesPerson AS sp  
JOIN Sales.SalesOrderHeader AS so  
    ON sp.BusinessEntityID = so.SalesPersonID  
    AND so.OrderDate = (SELECT MAX(OrderDate)  
                        FROM Sales.SalesOrderHeader  
                        WHERE SalesPersonID = sp.BusinessEntityID);  
GO  

앞의 예에서는 특정 날짜에 지정된 판매 직원에 대해 하나의 판매 정보만 기록되고 테이블이 최신 상태로 업데이트된 상태라고 가정합니다.The previous example assumes that only one sale is recorded for a specified salesperson on a specific date and that updates are current. 지정된 판매 직원에 대해 두 건 이상의 판매 정보를 같은 날 기록할 수 있는 경우 이 예는 제대로 실행되지 않습니다.If more than one sale for a specified salesperson can be recorded on the same day, the example shown does not work correctly. 이 예제에서는 실행 되지만 각 오류 없이 SalesYTD 값이 해당 날짜에 판매 실적에 관계 없이 하나의 판매와 업데이트 합니다.The example runs without error, but each SalesYTD value is updated with only one sale, regardless of how many sales actually occurred on that day. 이는 하나의 UPDATE 문이 같은 행을 두 번 업데이트하지 않기 때문입니다.This is because a single UPDATE statement never updates the same row two times.

지정된 판매 직원에 대해 하루에 두 번 이상의 판매가 발생할 수 있는 상황에서 각 판매 직원에 대한 모든 판매 정보는 다음 예와 같이 UPDATE 문 내에서 함께 집계되어야 합니다.In the situation in which more than one sale for a specified salesperson can occur on the same day, all the sales for each sales person must be aggregated together within the UPDATE statement, as shown in the following example:

USE AdventureWorks2012;  
GO  
UPDATE Sales.SalesPerson  
SET SalesYTD = SalesYTD +   
    (SELECT SUM(so.SubTotal)   
     FROM Sales.SalesOrderHeader AS so  
     WHERE so.OrderDate = (SELECT MAX(OrderDate)  
                           FROM Sales.SalesOrderHeader AS so2  
                           WHERE so2.SalesPersonID = so.SalesPersonID)  
     AND Sales.SalesPerson.BusinessEntityID = so.SalesPersonID  
     GROUP BY so.SalesPersonID);  
GO  

원격 테이블의 행 업데이트 Updating Rows in a Remote Table

이 섹션의 예를 사용 하 여 원격 대상 테이블의 행을 업데이트 하는 방법을 보여 주기는 연결 된 서버 또는 행 집합 함수 원격 테이블을 참조 합니다.Examples in this section demonstrate how to update rows in a remote target table by using a linked server or a rowset function to reference the remote table.

15.O. 연결된 서버를 사용하여 원격 테이블의 데이터 업데이트Updating data in a remote table by using a linked server

다음 예에서는 원격 서버의 테이블을 업데이트합니다.The following example updates a table on a remote server. 사용 하 여 원격 데이터 원본에 대 한 링크 만들기 먼저 sp_addlinkedserver합니다.The example begins by creating a link to the remote data source by using sp_addlinkedserver. 그런 다음 연결된 서버 이름 MyLinkServer가 server.catalog.schema.object와 같이 네 부분으로 구성된 개체 이름의 일부로 지정됩니다.The linked server name, MyLinkServer, is then specified as part of the four-part object name in the form server.catalog.schema.object. @datasrc에는 유효한 서버 이름을 지정해야 합니다.Note that you must specify a valid server name for @datasrc.

USE master;  
GO  
-- Create a link to the remote data source.   
-- Specify a valid server name for @datasrc as 'server_name' or 'server_nameinstance_name'.  

EXEC sp_addlinkedserver @server = N'MyLinkServer',  
    @srvproduct = N' ',  
    @provider = N'SQLNCLI10',   
    @datasrc = N'<server name>',  
    @catalog = N'AdventureWorks2012';  
GO  
USE AdventureWorks2012;  
GO  
-- Specify the remote data source using a four-part name   
-- in the form linked_server.catalog.schema.object.  

UPDATE MyLinkServer.AdventureWorks2012.HumanResources.Department  
SET GroupName = N'Public Relations'  
WHERE DepartmentID = 4;  

16.P. OPENQUERY 함수를 사용하여 원격 테이블의 데이터 업데이트Updating data in a remote table by using the OPENQUERY function

지정 하 여 원격 테이블의 행을 업데이트 하는 다음 예제는 OPENQUERY 행 집합 함수입니다.The following example updates a row in a remote table by specifying the OPENQUERY rowset function. 이 예에서는 이전 예에서 만든 연결된 서버 이름이 사용됩니다.The linked server name created in the previous example is used in this example.

UPDATE OPENQUERY (MyLinkServer, 'SELECT GroupName FROM HumanResources.Department WHERE DepartmentID = 4')   
SET GroupName = 'Sales and Marketing';  

17.Q. OPENDATASOURCE 함수를 사용하여 원격 테이블의 데이터 업데이트Updating data in a remote table by using the OPENDATASOURCE function

다음 예제에서는 지정 하 여 원격 테이블에 행을 삽입의 OPENDATASOURCE 행 집합 함수입니다.The following example inserts a row into a remote table by specifying the OPENDATASOURCE rowset function. 형식을 사용 하 여 데이터 원본에 대 한 올바른 서버 이름을 지정 server_name 또는 server_name\instance_name합니다.Specify a valid server name for the data source by using the format server_name or server_name\instance_name. 임시 분산 쿼리에 맞게 SQL ServerSQL Server 인스턴스를 구성해야 할 수 있습니다.You may need to configure the instance of SQL ServerSQL Server for Ad Hoc Distributed Queries. 자세한 내용은 참조 임시 분산 쿼리 서버 구성 옵션합니다.For more information, see ad hoc distributed queries Server Configuration Option.

UPDATE OPENQUERY (MyLinkServer, 'SELECT GroupName FROM HumanResources.Department WHERE DepartmentID = 4')   
SET GroupName = 'Sales and Marketing';  

큰 개체 데이터 형식 업데이트 Updating Large Object Data Types

이 섹션의 예에서는 LOB(Large Object) 데이터 형식을 사용하여 정의된 열의 값을 업데이트하는 방법을 보여 줍니다.Examples in this section demonstrate methods of updating values in columns that are defined with large object (LOB) data types.

18.R. UPDATE를 .WRITE와 함께 사용하여 nvarchar(max) 열의 데이터 수정Using UPDATE with .WRITE to modify data in an nvarchar(max) column

다음 예제에서는 사용 하 여 여 합니다. 부분 값을 업데이트 하려면 WRITE 절 DocumentSummary, nvarchar (max) 열에는 Production.Document 테이블입니다.The following example uses the .WRITE clause to update a partial value in DocumentSummary, an nvarchar(max) column in the Production.Document table. 대체 단어, 기존 데이터에서 대체할 단어의 시작 위치(오프셋) 및 대체할 문자 수(길이)를 지정하여 componentsfeatures로 대체합니다.The word components is replaced with the word features by specifying the replacement word, the starting location (offset) of the word to be replaced in the existing data, and the number of characters to be replaced (length). 또한이 예제에서는 OUTPUT 절을 반환 하는 이전 및 이후 이미지는 DocumentSummary 열을는 @MyTableVar 테이블 변수입니다.The example also uses the OUTPUT clause to return the before and after images of the DocumentSummary column to the @MyTableVar table variable.

USE AdventureWorks2012;  
GO  
DECLARE @MyTableVar table (  
    SummaryBefore nvarchar(max),  
    SummaryAfter nvarchar(max));  
UPDATE Production.Document  
SET DocumentSummary .WRITE (N'features',28,10)  
OUTPUT deleted.DocumentSummary,   
       inserted.DocumentSummary   
    INTO @MyTableVar  
WHERE Title = N'Front Reflector Bracket Installation';  
SELECT SummaryBefore, SummaryAfter   
FROM @MyTableVar;  
GO  

S.는S. UPDATE를 .WRITE와 함께 사용하여 nvarchar(max) 열의 데이터 추가 및 제거Using UPDATE with .WRITE to add and remove data in an nvarchar(max) column

다음 예에서는 추가 하 고 데이터를 제거는 nvarchar (max) NULL로 설정 된 현재 값이 있는 열입니다.The following examples add and remove data from an nvarchar(max) column that has a value currently set to NULL. 때문에 합니다. NULL 열을 수정 하려면 절을 사용할 수 없습니다, 열이 먼저 임시 데이터로 채워져 작성 합니다.Because the .WRITE clause cannot be used to modify a NULL column, the column is first populated with temporary data. 그런 다음 .WRITE 절을 사용하여 이 데이터를 올바른 데이터로 대체합니다.This data is then replaced with the correct data by using the .WRITE clause. 다음 추가 예에서는 열 값의 끝에 데이터를 추가하고 열에서 데이터를 제거(잘라내기)하고 마지막으로 열에서 일부 데이터를 제거합니다.The additional examples append data to the end of the column value, remove (truncate) data from the column and, finally, remove partial data from the column. SELECT 문은 각각의 UPDATE 문에 의한 데이터 수정 내용을 표시합니다.The SELECT statements display the data modification generated by each UPDATE statement.

USE AdventureWorks2012;  
GO  
-- Replacing NULL value with temporary data.  
UPDATE Production.Document  
SET DocumentSummary = N'Replacing NULL value'  
WHERE Title = N'Crank Arm and Tire Maintenance';  
GO  
SELECT DocumentSummary   
FROM Production.Document  
WHERE Title = N'Crank Arm and Tire Maintenance';  
GO  
-- Replacing temporary data with the correct data. Setting @Length to NULL   
-- truncates all existing data from the @Offset position.  
UPDATE Production.Document  
SET DocumentSummary .WRITE(N'Carefully inspect and maintain the tires and crank arms.',0,NULL)  
WHERE Title = N'Crank Arm and Tire Maintenance';  
GO  
SELECT DocumentSummary   
FROM Production.Document  
WHERE Title = N'Crank Arm and Tire Maintenance';  
GO  
-- Appending additional data to the end of the column by setting   
-- @Offset to NULL.  
UPDATE Production.Document  
SET DocumentSummary .WRITE (N' Appending data to the end of the column.', NULL, 0)  
WHERE Title = N'Crank Arm and Tire Maintenance';  
GO  
SELECT DocumentSummary   
FROM Production.Document  
WHERE Title = N'Crank Arm and Tire Maintenance';  
GO  
-- Removing all data from @Offset to the end of the existing value by   
-- setting expression to NULL.   
UPDATE Production.Document  
SET DocumentSummary .WRITE (NULL, 56, 0)  
WHERE Title = N'Crank Arm and Tire Maintenance';  
GO  
SELECT DocumentSummary   
FROM Production.Document  
WHERE Title = N'Crank Arm and Tire Maintenance';  
GO  
-- Removing partial data beginning at position 9 and ending at   
-- position 21.  
UPDATE Production.Document  
SET DocumentSummary .WRITE ('',9, 12)  
WHERE Title = N'Crank Arm and Tire Maintenance';  
GO  
SELECT DocumentSummary   
FROM Production.Document  
WHERE Title = N'Crank Arm and Tire Maintenance';  
GO  

20.T. UPDATE를 OPENROWSET와 함께 사용하여 varbinary(max) 열 수정Using UPDATE with OPENROWSET to modify a varbinary(max) column

다음 예제에서는 대체에 저장 된 기존 이미지는 varbinary (max) 새 이미지가 포함 된 열입니다.The following example replaces an existing image stored in a varbinary(max) column with a new image. OPENROWSET 함수는 열에 이미지를 로드 하 고 BULK 옵션을 함께 사용 합니다.The OPENROWSET function is used with the BULK option to load the image into the column. 이 예에서는 지정된 파일 경로에 Tires.jpg라는 이름의 파일이 존재하는 것으로 가정합니다.This example assumes that a file named Tires.jpg exists in the specified file path.

USE AdventureWorks2012;  
GO  
UPDATE Production.ProductPhoto  
SET ThumbNailPhoto = (  
    SELECT *  
    FROM OPENROWSET(BULK 'c:Tires.jpg', SINGLE_BLOB) AS x )  
WHERE ProductPhotoID = 1;  
GO  

21.U. UPDATE를 사용하여 FILESTREAM 데이터 수정Using UPDATE to modify FILESTREAM data

다음 예에서는 UPDATE 문을 사용하여 파일 시스템 파일의 데이터를 수정합니다.The following example uses the UPDATE statement to modify the data in the file system file. 많은 양의 데이터를 파일로 스트리밍하는 데는 이 방법을 사용하지 않는 것이 좋습니다.We do not recommend this method for streaming large amounts of data to a file. 적절한 Win32 인터페이스를 사용해야 합니다.Use the appropriate Win32 interfaces. 다음 예에서는 파일 레코드에 있는 임의의 텍스트를 Xray 1로 바꿉니다.The following example replaces any text in the file record with the text Xray 1. 자세한 내용은 FILESTREAM(SQL Server)을 참조하세요.For more information, see FILESTREAM (SQL Server).

UPDATE Archive.dbo.Records  
SET [Chart] = CAST('Xray 1' as varbinary(max))  
WHERE [SerialNumber] = 2;  

사용자 정의 형식 업데이트 Updating User-defined Types

다음 예에서는 CLR UDT(사용자 정의 형식) 열의 값을 수정하는The following examples modify values in CLR user-defined type (UDT) columns. 세 가지 방법을 보여 줍니다.Three methods are demonstrated. 사용자 정의 열에 대 한 자세한 내용은 참조 clr 사용자 정의 형식합니다.For more information about user-defined columns, see CLR User-Defined Types.

22.V. 시스템 데이터 형식 사용Using a system data type

사용자 정의 형식에서 SQL ServerSQL Server 시스템 데이터 형식의 암시적 또는 명시적 변환이 지원되는 경우 해당 형식의 값을 제공하여 UDT를 업데이트할 수 있습니다.You can update a UDT by supplying a value in a SQL ServerSQL Server system data type, as long as the user-defined type supports implicit or explicit conversion from that type. 다음 예에서는 문자열에서 명시적 변환을 통해 사용자 정의 형식인 Point 열의 값을 업데이트하는 방법을 보여 줍니다.The following example shows how to update a value in a column of user-defined type Point, by explicitly converting from a string.

UPDATE dbo.Cities  
SET Location = CONVERT(Point, '12.3:46.2')  
WHERE Name = 'Anchorage';  

W.W. 메서드 호출Invoking a method

변경자(mutator)로 표시된 사용자 정의 형식의 메서드를 호출하여 업데이트를 수행하는 방법으로 UDT를 업데이트할 수 있습니다.You can update a UDT by invoking a method, marked as a mutator, of the user-defined type, to perform the update. 다음 예에서는 Point라는 SetXY 유형의 변경자 메서드를 호출합니다.The following example invokes a mutator method of type Point named SetXY. 해당 유형의 인스턴스 상태가 업데이트됩니다.This updates the state of the instance of the type.

UPDATE dbo.Cities  
SET Location.SetXY(23.5, 23.5)  
WHERE Name = 'Anchorage';  

X입니다.X. 속성 또는 데이터 멤버의 값 수정Modifying the value of a property or data member

등록된 속성 또는 사용자 정의 형식의 공용 데이터 멤버 값을 수정하여 UDT를 업데이트할 수 있습니다.You can update a UDT by modifying the value of a registered property or public data member of the user-defined type. 값을 제공하는 식은 암시적으로 해당 속성 유형으로 변환할 수 있어야 합니다.The expression supplying the value must be implicitly convertible to the type of the property. 다음 예에서는 사용자 정의 형식 XPoint 속성 값을 수정합니다.The following example modifies the value of property X of user-defined type Point.

UPDATE dbo.Cities  
SET Location.X = 23.5  
WHERE Name = 'Anchorage';  

힌트를 사용 하 여 쿼리 최적화 프로그램의 기본 동작 재정의 Overriding the Default Behavior of the Query Optimizer by Using Hints

이 섹션의 예에서는 UPDATE 문을 처리할 때 쿼리 최적화 프로그램의 기본 동작을 임시로 재정의하기 위해 테이블 및 쿼리 힌트를 사용하는 방법을 보여 줍니다.Examples in this section demonstrate how to use table and query hints to temporarily override the default behavior of the query optimizer when processing the UPDATE statement.

주의

일반적으로 SQL ServerSQL Server 쿼리 최적화 프로그램은 쿼리에 대해 최상의 실행 계획을 선택하므로 숙련된 개발자 및 데이터베이스 관리자가 마지막 방법으로만 힌트를 사용하는 것이 좋습니다.Because the SQL ServerSQL Server query optimizer typically selects the best execution plan for a query, we recommend that hints be used only as a last resort by experienced developers and database administrators.

Y입니다.Y. 테이블 힌트 지정Specifying a table hint

다음 예에서는 지정 된 테이블 힌트 TABLOCK 합니다.The following example specifies the table hint TABLOCK. 이 힌트는 Production.Product 테이블에 공유 잠금을 사용하고 UPDATE 문이 끝날 때까지 이 잠금을 유지하도록 지정합니다.This hint specifies that a shared lock is taken on the table Production.Product and held until the end of the UPDATE statement.

USE AdventureWorks2012;  
GO  
UPDATE Production.Product  
WITH (TABLOCK)  
SET ListPrice = ListPrice * 1.10  
WHERE ProductNumber LIKE 'BK-%';  
GO  

Z 합니다.Z. 쿼리 힌트 지정Specifying a query hint

다음 예에서는 지정 된 쿼리 힌트 OPTIMIZE FOR (@variable) UPDATE 문의 합니다.The following example specifies the query hintOPTIMIZE FOR (@variable) in the UPDATE statement. 이 힌트는 쿼리가 컴파일되고 최적화될 때 쿼리 최적화 프로그램이 지역 변수에 대해 특정 값을 사용하도록 지시합니다.This hint instructs the query optimizer to use a particular value for a local variable when the query is compiled and optimized. 해당 값은 쿼리 최적화 중에만 사용되고 쿼리 실행 중에는 사용되지 않습니다.The value is used only during query optimization, and not during query execution.

USE AdventureWorks2012;  
GO  
CREATE PROCEDURE Production.uspProductUpdate  
@Product nvarchar(25)  
AS  
SET NOCOUNT ON;  
UPDATE Production.Product  
SET ListPrice = ListPrice * 1.10  
WHERE ProductNumber LIKE @Product  
OPTION (OPTIMIZE FOR (@Product = 'BK-%') );  
GO  
-- Execute the stored procedure   
EXEC Production.uspProductUpdate 'BK-%';  

UPDATE 문의 결과 캡처 Capturing the Results of the UPDATE Statement

이 섹션의 예에 사용 하는 방법을 보여 줍니다는 OUTPUT 절 UPDATE 문에 의해 영향을 각 행의 정보 또는 식을 기반으로 돌아갑니다.Examples in this section demonstrate how to use the OUTPUT Clause to return information from, or expressions based on, each row affected by an UPDATE statement. 이러한 결과를 처리 응용 프로그램에 반환하여 확인 메시지, 보관 및 기타 응용 프로그램 요구 사항을 충족시키는 데 사용할 수 있습니다.These results can be returned to the processing application for use in such things as confirmation messages, archiving, and other such application requirements.

AA 합니다.AA. OUTPUT 절과 함께 UPDATE 사용Using UPDATE with the OUTPUT clause

다음 예에서는 VacationHours 테이블의 처음 10개 행에 대해 Employee 열을 25% 업데이트하고 ModifiedDate 열의 값을 현재 날짜로 설정합니다.The following example updates the column VacationHours in the Employee table by 25 percent for the first 10 rows and also sets the value in the column ModifiedDate to the current date. OUTPUT 의 값을 반환 하는 절 VacationHours 적용 하기 전에 존재 하는 UPDATE 에서 문을 deleted.VacationHours 열과 업데이트 된 값에는 inserted.VacationHours 열을는 @MyTableVar 테이블 변수입니다.The OUTPUT clause returns the value of VacationHours that exists before applying the UPDATE statement in the deleted.VacationHours column and the updated value in the inserted.VacationHours column to the @MyTableVar table variable.

각각 SELECT의 값과 @MyTableVar 테이블의 업데이트 작업 결과를 반환하는 두 개의 Employee 문이 이어집니다.Two SELECT statements follow that return the values in @MyTableVar and the results of the update operation in the Employee table. OUTPUT 절을 사용 하 여 더 많은 예제를 참조 하십시오. OUTPUT 절 ( Transact SQL ) .For more examples using the OUTPUT clause, 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,  
    ModifiedDate = GETDATE()   
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.  
SELECT TOP (10) BusinessEntityID, VacationHours, ModifiedDate  
FROM HumanResources.Employee;  
GO  

다른 문에서 UPDATE 사용 Using UPDATE in other statements

이 섹션의 예에서는 다른 문에 UPDATE를 사용하는 방법을 보여 줍니다.Examples in this section demonstrate how to use UPDATE in other statements.

AB.AB. 저장 프로시저에 UPDATE 사용Using UPDATE in a stored procedure

다음 예에서는 저장 프로시저에 UPDATE 문을 사용합니다.The following example uses an UPDATE statement in a stored procedure. 이 프로시저에서는 @NewHours라는 입력 매개 변수 하나와 @RowCount라는 출력 매개 변수 하나를 사용합니다.The procedure takes one input parameter, @NewHours and one output parameter @RowCount. @NewHours 매개 변수 값은 UPDATE 문이 열을 업데이트 사용 VacationHours 표에 HumanResources.Employee합니다.The @NewHours parameter value is used in the UPDATE statement to update the column VacationHours in the table HumanResources.Employee. @RowCount 출력 매개 변수는 영향을 받는 행 수를 지역 변수에 반환하는 데 사용됩니다.The @RowCount output parameter is used to return the number of rows affected to a local variable. SET 절에 사용된 CASE 식은 VacationHours에 대해 설정되는 값을 조건에 따라 결정합니다.The CASE expression is used in the SET clause to conditionally determine the value that is set for VacationHours. 시간당 급여를 받는 직원(SalariedFlag = 0)의 경우 현재 시간 수에 VacationHours에 지정된 값을 더한 값으로 @NewHours가 설정되고, 그 외의 경우에는 VacationHours에 지정된 값으로 @NewHours가 설정됩니다.When the employee is paid hourly (SalariedFlag = 0), VacationHours is set to the current number of hours plus the value specified in @NewHours; otherwise, VacationHours is set to the value specified in @NewHours.

USE AdventureWorks2012;  
GO  
CREATE PROCEDURE HumanResources.Update_VacationHours  
@NewHours smallint  
AS   
SET NOCOUNT ON;  
UPDATE HumanResources.Employee  
SET VacationHours =   
    ( CASE  
         WHEN SalariedFlag = 0 THEN VacationHours + @NewHours  
         ELSE @NewHours  
       END  
    )  
WHERE CurrentFlag = 1;  
GO  

EXEC HumanResources.Update_VacationHours 40;  

AC 합니다.AC. TRY…CATCH 블록에 UPDATE 사용Using UPDATE in a TRY…CATCH Block

다음 예제에서는 UPDATE 문을 사용 하 여 try... CATCH 블록 업데이트 작업 중 발생할 수 있는 실행 오류를 처리 합니다.The following example uses an UPDATE statement in a TRY…CATCH block to handle execution errors that may occur during the update operation.

USE AdventureWorks2012;  
GO  
BEGIN TRANSACTION;  

BEGIN TRY  
    -- Intentionally generate a constraint violation error.  
    UPDATE HumanResources.Department  
    SET Name = N'MyNewName'  
    WHERE DepartmentID BETWEEN 1 AND 2;  
END TRY  
BEGIN CATCH  
    SELECT   
         ERROR_NUMBER() AS ErrorNumber  
        ,ERROR_SEVERITY() AS ErrorSeverity  
        ,ERROR_STATE() AS ErrorState  
        ,ERROR_PROCEDURE() AS ErrorProcedure  
        ,ERROR_LINE() AS ErrorLine  
        ,ERROR_MESSAGE() AS ErrorMessage;  

    IF @@TRANCOUNT > 0  
        ROLLBACK TRANSACTION;  
END CATCH;  

IF @@TRANCOUNT > 0  
    COMMIT TRANSACTION;  
GO  

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

AD 합니다.AD. 단순 UPDATE 문 사용Using a simple UPDATE statement

다음 예제에서는 보여 모든 행의 영향을 받을 수 있는 방법 WHERE 절 사용 하지 않는 경우 업데이트 하는 행 (또는 행)을 지정할 수 있습니다.The following examples show how all rows can be affected when a WHERE clause is not used to specify the row (or rows) to update.

값을 업데이트 하는이 예제는 EndDateCurrentFlag 의 모든 행에 대 한 열은 DimEmployee 테이블입니다.This example updates the values in the EndDate and CurrentFlag columns for all rows in the DimEmployee table.

-- Uses AdventureWorks  

UPDATE DimEmployee  
SET EndDate = '2010-12-31', CurrentFlag='False';  

UPDATE 문에서 계산된 값을 사용할 수도 있습니다.You can also use computed values in an UPDATE statement. 다음 예에서는 ListPrice 테이블의 모든 행에 대해 Product 열의 값을 두 배로 만듭니다.The following example doubles the value in the ListPrice column for all rows in the Product table.

-- Uses AdventureWorks  

UPDATE DimEmployee  
SET BaseRate = BaseRate * 2;  

AE 합니다.AE. WHERE 절과 함께 UPDATE 문 사용Using the UPDATE statement with a WHERE clause

다음 예에서는 WHERE 절을 사용하여 업데이트할 행을 지정합니다.The following example uses the WHERE clause to specify which rows to update.

-- Uses AdventureWorks  

UPDATE DimEmployee  
SET FirstName = 'Gail'  
WHERE EmployeeKey = 500;  

AF 합니다.AF. 레이블이 있는 UPDATE 문 사용Using the UPDATE statement with label

다음 예에서는 UPDATE 문에 대 한 레이블의 사용 방법을 보여 줍니다.The following example shows use of a LABEL for the UPDATE statement.

-- Uses AdventureWorks  

UPDATE DimProduct  
SET ProductSubcategoryKey = 2   
WHERE ProductKey = 313  
OPTION (LABEL = N'label1');  

AG 합니다.AG. 다른 테이블의 정보와 함께 UPDATE 문 사용Using the UPDATE statement with information from another table

이 예에서는 연도별 총 판매액을 저장 하는 테이블을 만듭니다.This example creates a table to store total sales by year. 2004 년의 총 판매액 FactInternetSales 테이블에 대해 SELECT 문을 실행 하 여 업데이트 합니다.It updates the total sales for the year 2004 by running a SELECT statement against the FactInternetSales table.

-- Uses AdventureWorks  

CREATE TABLE YearlyTotalSales (  
    YearlySalesAmount money NOT NULL,  
    Year smallint NOT NULL )  
WITH ( DISTRIBUTION = REPLICATE );  

INSERT INTO YearlyTotalSales VALUES (0, 2004);  
INSERT INTO YearlyTotalSales VALUES (0, 2005);  
INSERT INTO YearlyTotalSales VALUES (0, 2006);  

UPDATE YearlyTotalSales  
SET YearlySalesAmount=  
(SELECT SUM(SalesAmount) FROM FactInternetSales WHERE OrderDateKey >=20040000 AND OrderDateKey < 20050000)  
WHERE Year=2004;  

SELECT * FROM YearlyTotalSales;   

아 합니다.AH. Update 문에 대 한 ANSI 조인 대체ANSI join replacement for update statements

UPDATE 또는 DELETE를 수행 하려면 ANSI 조인 구문을 사용 하 여 함께 두 개 이상의 테이블을 조인 하는 복잡 한 업데이트가 있는 알 수 있습니다.You may find you have a complex update that joins more than two tables together using ANSI joining syntax to perform the UPDATE or DELETE.

이 테이블을 업데이트 해야 했습니다 같이 가정해 봅니다.Imagine you had to update this table:

CREATE TABLE [dbo].[AnnualCategorySales]
(   [EnglishProductCategoryName]    NVARCHAR(50)    NOT NULL
,   [CalendarYear]                  SMALLINT        NOT NULL
,   [TotalSalesAmount]              MONEY           NOT NULL
)
WITH
(
    DISTRIBUTION = ROUND_ROBIN
)
;  

원래 쿼리 다음과 같이 보지 못했을 수 있습니다.The original query might have looked something like this:

UPDATE  acs
SET     [TotalSalesAmount] = [fis].[TotalSalesAmount]
FROM    [dbo].[AnnualCategorySales]     AS acs
JOIN    (
        SELECT  [EnglishProductCategoryName]
        ,       [CalendarYear]
        ,       SUM([SalesAmount])              AS [TotalSalesAmount]
        FROM    [dbo].[FactInternetSales]       AS s
        JOIN    [dbo].[DimDate]                 AS d    ON s.[OrderDateKey]             = d.[DateKey]
        JOIN    [dbo].[DimProduct]              AS p    ON s.[ProductKey]               = p.[ProductKey]
        JOIN    [dbo].[DimProductSubCategory]   AS u    ON p.[ProductSubcategoryKey]    = u.[ProductSubcategoryKey]
        JOIN    [dbo].[DimProductCategory]      AS c    ON u.[ProductCategoryKey]       = c.[ProductCategoryKey]
        WHERE   [CalendarYear] = 2004
        GROUP BY
                [EnglishProductCategoryName]
        ,       [CalendarYear]
        ) AS fis
ON  [acs].[EnglishProductCategoryName]  = [fis].[EnglishProductCategoryName]
AND [acs].[CalendarYear]                = [fis].[CalendarYear]
;  

이후 SQL 데이터 웨어하우스SQL Data Warehouse ANSI는 UPDATE 문의 FROM 절에 조인 하는 지원 하지 않습니다, 약간 변경 하지 않고 위에이 코드를 복사할 수 없습니다.Since SQL 데이터 웨어하우스SQL Data Warehouse does not support ANSI joins in the FROM clause of an UPDATE statement, you cannot copy this code over without changing it slightly.

이 코드를 바꾸려면 CTAS에는 및 암시적 조인을의 조합을 사용할 수 있습니다.You can use a combination of a CTAS and an implicit join to replace this code:

-- Create an interim table
CREATE TABLE CTAS_acs
WITH (DISTRIBUTION = ROUND_ROBIN)
AS
SELECT  ISNULL(CAST([EnglishProductCategoryName] AS NVARCHAR(50)),0)    AS [EnglishProductCategoryName]
,       ISNULL(CAST([CalendarYear] AS SMALLINT),0)                      AS [CalendarYear]
,       ISNULL(CAST(SUM([SalesAmount]) AS MONEY),0)                     AS [TotalSalesAmount]
FROM    [dbo].[FactInternetSales]       AS s
JOIN    [dbo].[DimDate]                 AS d    ON s.[OrderDateKey]             = d.[DateKey]
JOIN    [dbo].[DimProduct]              AS p    ON s.[ProductKey]               = p.[ProductKey]
JOIN    [dbo].[DimProductSubCategory]   AS u    ON p.[ProductSubcategoryKey]    = u.[ProductSubcategoryKey]
JOIN    [dbo].[DimProductCategory]      AS c    ON u.[ProductCategoryKey]       = c.[ProductCategoryKey]
WHERE   [CalendarYear] = 2004
GROUP BY
        [EnglishProductCategoryName]
,       [CalendarYear]
;

-- Use an implicit join to perform the update
UPDATE  AnnualCategorySales
SET     AnnualCategorySales.TotalSalesAmount = CTAS_ACS.TotalSalesAmount
FROM    CTAS_acs
WHERE   CTAS_acs.[EnglishProductCategoryName] = AnnualCategorySales.[EnglishProductCategoryName]
AND     CTAS_acs.[CalendarYear]               = AnnualCategorySales.[CalendarYear]
;

--Drop the interim table
DROP TABLE CTAS_acs
;

관련 항목:See Also

CREATE TABLE(Transact-SQL) CREATE TABLE (Transact-SQL)
CREATE TRIGGER(Transact-SQL) CREATE TRIGGER (Transact-SQL)
커서(Transact-SQL) Cursors (Transact-SQL)
DELETE(Transact-SQL) DELETE (Transact-SQL)
INSERT(Transact-SQL) INSERT (Transact-SQL)
텍스트 및 이미지 함수 ( Transact SQL ) Text and Image Functions (Transact-SQL)
Common_table_expression &#40; Transact SQL ) WITH common_table_expression (Transact-SQL)
FILESTREAM(SQL Server)FILESTREAM (SQL Server)