개요
MSSQL Update 문의 기본 사용법, 다른 테이블을 참조해서 Update, 업데이트 결과 받기 등에 대해서 알아봅니다.
기본 구문
-- 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}
기본 구문이 상당히 복잡합니다. 워낙 기본적인 문장이다보니 쓰임새도 많고, 옵션도 많습니다.
MSSQL Update 기본 구문 예제
가장 단순한 형태의 예제를 보겠습니다.

예제 테이블입니다. 유저 아이디와 이름이 있습니다.
여기에서 2행의 부끄를 시끄로 변경해보겠습니다.

MSSQL Update JOIN 예제
다른 테이블을 참조해서 UPDATE 해보겠습니다.

첫번째 예제의 #t 테이블의 2행의 descr 컬럼을 #t2 테이블을 이용해서 업데이트 합니다.

update 문의 From 절 부터는 Select 문과 사용법은 동일합니다. 첫 번째 줄의 UPDATE #t 도 UPDATE A 처럼 alias 를 이용해도 됩니다.
MSSQL Update SELECT 예제
Update 는 위에서 언급한것처럼 From 절부터는 Select 문과 같습니다. 그래서 서브쿼리도 사용할 수 있는데요, 위의 UPDATE Join 예제를 아래 두 개의 쿼리처럼 서브쿼리를 사용해도 결과는 동일합니다.
-- From 절에 서브쿼리
UPDATE #t
SET descr = b.usr_descr
FROM #t A
JOIN ( SELECT * FROM #t2 ) B ON A.usr_name = B.usr_name
WHERE A.usr_id = 2
-- Set 절에 서브쿼리
UPDATE #t
SET descr = ( SELECT USR_DESCR FROM #T2 B WHERE A.USR_NAME = B.usr_name )
FROM #t A
WHERE A.usr_id = 2
OUTPUT 절 이용
업데이트 컬럼에 대해서 업데이트 전의 값이나 업데이트 후의 값을 받으려면 아래와 같이 OUTPUT 절을 사용할 수 있습니다.
DECLARE @tbl_out TABLE (
del nvarchar(100)
, ins nvarchar(100)
)
UPDATE #t
SET descr = b.usr_descr
OUTPUT deleted.descr, inserted.descr
INTO @tbl_out
FROM #t A
JOIN #t2 B ON A.usr_name = B.usr_name
WHERE A.usr_id = 2
SELECT * FROM @tbl_out
샘플 데이터
아래는 샘플데이터 생성 쿼리입니다.
create table #t (
usr_id int
, usr_name nvarchar(100)
, descr nvarchar(100)
)
insert into #t values ( 1, '김복순', '목욕')
insert into #t values ( 2, '부끄', '앙스키')
insert into #t values ( 3, '밀란', '배고파')
create table #t2 (
usr_name nvarchar(100)
, usr_descr nvarchar(100)
)
insert into #t2 values ( '김복순', '목욕')
insert into #t2 values ( '부끄', '앙스키')
insert into #t2 values ( '시끄', '심심해')
insert into #t2 values ( '밀란', '배고파')
그 외
UPDATE 에 대해 썼지만 Delete 도 동일합니다.
MS 문서 Update 링크