상세 컨텐츠

본문 제목

SQL Server 2008 T-SQL

DataBase/SQL Server

by 탑~! 2010. 11. 18. 13:14

본문

SQL Server가 2005에서 2008로 업그레이드 된지도 벌써 몇달이 지났다. 이제 본격적으로 SQL-Server 2008로 옮겨가야 할 때가 온 것 같다. 그래서 이번 기회에 SQL Server 2008이 어떻게 업그레이드 되었는지 살펴보고자 한다. 그 중에서 프로그래머에게 필수인 T-SQL에 대해 집중적으로 살펴보려고 한다.


1. 변수 선언과 함께 초기화 가능

T-SQL에서 변수를 선언할 때 초기화가 가능해졌다. 사실 C#이나 자바와 같은 언어에서는 당연한 기능이지만, T-SQL에서는 그동안 지원이 되지 않았다. 그래서 다음과 같이 변수 선언과 초기화가 별도의 문장으로 만들어져야 했다.


declare @i int
set @i = 0


그렇지만 SQL Server 2008에서는 다음과 같이 변수 선언과 함께 초기화가 가능해졌다. 어떻게 보면 당연한 이 기능은 그동안 많은 SQL 프로그래머들이 기다려왔던 것이다. 그래서 SQL Server 2008 강연에 가보면 이 기능에 가장 많은 박수가 나오는 것을 볼 수 있었다. (커다란 웃음과 함께…)


declare @i int = 0


참고로 SQL Server 2008에 포함된 개발 도구인 Management Studio에 중요한 기능이 업그레이드되었는데, 그것은 Visual Studio에서 볼 수 있었던 intellisense 기능이다. 코드를 입력할 때마다 상황에 가장 급접한 힌트가 드롭 다운으로 나오는 것이다. 아래 그림은 @i 변수를 선언한 후, select를 입력했을 때 나오는 intellisense를 캡쳐한 것이다. 그동안 Visual Studio를 사용하면서 가장 부러웠던 기능을 SQL 프로그래밍에서도 사용할 수 있게 된 것이다.


sql2008_1


2. 새로운 연산자

다음과 같은 새로운 연산자 역시 다른 언어에서는 당연했던 것인데, 이번에 T-SQL에도 추가되었다.


+=, –=, *=, /=, %=


다른 언어에 익숙한 사람이라면 이 복합 연산자를 손쉽게 이해할 수 있을 것이다. 다음은 복합 연산자를 사용한 예이다.


declare @i int = 10
set @i *= 2
select @i


3. Row Constructors

테이블에 데이터를 넣을 때 values를 사용하는데, 이 경우 오직 한 줄의 데이터만 입력이 가능했었다. 그런데 SQL Server 2008 부터는 “,”를 붙힌 후, 여러 줄을 동시에 입력할 수 있게 된다. 다음은 동시에 2줄을 입력하는 예이다.


create table #test
(idx int, data varchar(10))

insert into #test
(idx, data)
values
(1, ‘test1′),
(2, ‘test2′)


새로운 Row Contructors를 사용하면 inline table expression이라는게 가능하다. 테이블을 직접 정의하지 않고도, values를 이용하여 inline 테이블을 정의할 수도 있다.


select *
from
(values
    (1, ‘test1′),
    (2, ‘test2′)
)
tbl (idx, data)


4. Merge 추가


Insert, update, delete 를 주어진 조건에 따라 한 번의 명령으로 처리할 수 있는 Merge라는 새로운 명령어가 추가되었다. 가령 두개의 테이블을 비교해서 데이터가 이미 존재하면 데이터를 업데이트하고, 존재하지 않으면 추가하는 경우에 이 Merge를 통해 손쉽게 처리할 수 있게 된 것이다. 다음은 Merge를 사용한 예이다.


– Target 테이블

create table TargetTbl (
    id int,
    name varchar(30)
)
insert into TargetTbl
values
    (1, ‘name1′),
    (2, ‘name2′)


– Source 테이블
create table SourceTbl (
    id int,
    name varchar(30)
)
insert into SourceTbl
values
    (2, ‘name2_2′),
    (3, ‘name3′)

merge TargetTbl As t
using SourceTbl As s on t.id=s.id  — TargetTbl과 SrouceTbl을 Join
when matched then– id가 일치하는 경우 name 필드를 업데이트
    update set
        t.name = s.name
when not matched then – id가 일치하지 않는 경우 데이터 입력
    insert (id, name)
    values (s.id, s.name);

select * from TargetTbl;

출처: http://dreamsvc.com/2009/03/10/sql-server-2008%ec%97%90%ec%84%9c-%ec%97%85%ea%b7%b8%eb%a0%88%ec%9d%b4%eb%93%9c%eb%90%9c-t-sql-%eb%82%b4%ec%9a%a9-i/

관련글 더보기