본문으로 바로가기

MSSQL

category Database 2020. 1. 29. 14:18
    반응형

    특징

    1. oracle과 다르게 mssql은 ''을 null로 처리하지 않는다.
    2. boolean 형이 존재하지 않는다. bit로 0, 1 처리

    SSMS (SQL Server Management Studio)

    • 쿼리 편집창에 접속정보가 없으면 현재 연결가능한 정보로 접속함.
    • SSMS 단축키
      • tab to space 셋업
      • 로컬캐시새로고침 : Ctrl + Shift + R
      • 쿼리 실행 : ctrl + enter (설정)
      • T-SQL : ctrl + shift + f(설치, 설정)
      • 줄삭제 : ctrl + D (설정)
      • 쿼리바로가기(프로시저 단축키)
        • ctrl + 3 : sp_help(설정)
      • 오토커밋 해제 : SET IMPLICIT_TRANSACTIONS
      • 주석셋 : ctrl + /
      • 주석해제 : alt + /
      • 탭이동 : ctrl + alt + 방향키

    ADMIN

    1. 오라클과 달리 Object 관리를 프로시저를 제공한다.
    • sp_who
    • sp_lock
    • sp_help
    1. sys 계정을 통해서 DB 시스템 관리가 가능하다.

    프로시저내 검색

    SELECT OBJECT_NAME(object_id)
        , OBJECT_DEFINITION(object_id) 
    FROM sys.procedures 
    WHERE OBJECT_DEFINITION(object_id) LIKE '%찾을 내용%'

    메일서버

    • msdb는 외부 메일 서버로 메일을 발송하는 프로세스를 제공한다.

    DDL

    DML

    Group by 문자열 합치기

    SELECT USERID
    
         , STUFF (( SELECT ',' + HOBBY
    
                    FROM dbo.HOBBY_TBL
    
                    WHERE USERID = A.USERID
    
                    FOR XML PATH('')
    
                   ), 1, 1, '') AS HOBBY
    
     FROM dbo.HOBBY_TBL AS A
    
     GROUP BY USERID

    count(case when 조건 then 1 end)

    특정 조건에 해당하는 컬럼만을 카운트한다.

    • 속도가 너무 느리다.....

    with(nolock)

    select 시 insert, update, delete 작업이 있으면 x-lock 걸려 데이터를 읽을 수 없다. 하지만 with(nolock)을 하면 읽을 수 있게 한다. READ UNCOMMITTED랑 같은 의미.

    SELECT *
    FROM TB_COMM_CODE_M WITH (NOLOCK);

    print

    콘솔로그

    PRINT 'TEST'

    iif

    select iif(1=1, 1, 2) // 1출력

    가상테이블

    @tbl TABLE( NAME NVARCHAR(100),
                PHONE NVARCAHR(100));

    부분 출력

    숫자 만큼 row를 출력한다.

    select  top 1
    from tb_comm_type_m;

    트리

    
    WITH WH AS 
           (
            SELECT 
                      A.FOLDER_ID
                    , A.NAME
                    , A.PARENT_ID
                    , A.ITEM_INDEX
                    , CONVERT(NVARCHAR(1000), '/' + CONCAT(A.ITEM_INDEX, A.NAME) ) AS SORT  
            FROM FOLDERS A
            WHERE A.FOLDER_ID = #{value} 
            UNION ALL
            SELECT 
                 B.FOLDER_ID
               , B.NAME
               , B.PARENT_ID
               , B.ITEM_INDEX
               , CONVERT(NVARCHAR(1000), WH.SORT + '/' + CONCAT(B.ITEM_INDEX, B.NAME) ) AS  SORT  
            FROM FOLDERS B
                       , WH 
            WHERE B.FOLDER_ID = #{value} 
            AND WH.FOLDER_ID = B.PARENT_ID
           )
        SELECT WH.*  
        FROM WH
        ORDER BY WH.SORT

    ROW_NUMBER, PARTITION BY

    SELECT ROW_NUMBER() OVER(PARTITION BY EMP_NO ORDER BY EMP_NO)
    FROM EMP

    ROW_NUMBER() OVER은 PARTITION BY 와 함께 사용된다.

    PARTITION BY 는 분할을 함. 그룹핑과는 다름.

    ROW_NUMBER는 숫자를 매김.

    예외처리

    BEGIN TRY  
    EXECUTE SP\_Nothing; // SP\_Nothing 는 없는 프로시저 이다.  
    EBD TRY  
    BEGIN CATCH  
    SELECT  
    @@Error as Error ,  
    Error\_Number() as Number,  
    Error\_Line() as Line,  
    Error\_Message() as \[Message\],  
    Error\_Procedure() as \[Procedure\],  
    Error\_Severity() as severity,  
    Error\_State() as state  
    END CATCH

    TRANSACITON

    BEGIN TRAN--트랜잭션 시작
    
    ROLLBACK TRAN --트랜잭션 이전상태로 ROLL BACK
    
    COMMIT TRAN --트랜잭션 완료  
    반응형