declare @day datetime

set @day = '2/7/2007'

SELECT DATEADD(dd, 2-DATEPART(dw, @day), @day) as mondaydate


 


-- 현재달의 첫째날 

SELECT DATEADD(mm, DATEDIFF(mm, 0, GETDATE()), 0)


 


-- 현재주의 월요일

SELECT DATEADD(wk, DATEDIFF(wk, 0, GETDATE()), 0)


 


-- 현재해의 첫째날

SELECT DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0)


 


-- 현재분기의 첫째날

SELECT DATEADD(qq, DATEDIFF(qq, 0, GETDATE()), 0)


 


-- 현재날의 자정주의 구하기

SELECT DATEADD(dd, DATEDIFF(dd, 0, GETDATE()), 0)


 


-- 지난달의 마지막날 구하기

SELECT DATEADD(ms, -3, DATEADD(mm, DATEDIFF(mm, 0, GETDATE()), 0))


 


-- 지난해의 마지막날 구하기

SELECT DATEADD(ms, -3, DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0))


 


-- 현재달의 마지막날 

SELECT DATEADD(ms, -3, DATEADD(mm, DATEDIFF(m, 0, GETDATE()) + 1, 0))


 


-- 현재해의 마지막날

SELECT DATEADD(ms, -3, DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, 0))


 


-- 현재달의 첫째주 월요일

SELECT DATEADD(wk, DATEDIFF(wk, 0, DATEADD(dd, 6-DATEPART(day, GETDATE()), GETDATE())), 0)

Posted by 안낭우훗

SELECT * INTO [생성될 테이블 명] FROM [원본 테이블 명] [WHERE (옵션)];

 

 * 옵션 :  '1' = '2'; (데이터 없이 테이블 구조만 복사)

              '1' = '1'; (데이터까지 복사)

 

  예) SELECT * INTO copy_table FROM original_table WHERE '1' = '1'  -- (데이터까지 모두 복사)

 


Posted by 안낭우훗

TRY CATCH을 이용하여 오류를 처리해보자



BEGIN
    SET NOCOUNT ON;
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
 
    BEGIN TRY
        BEGIN TRAN
 
        /* 쿼리 작업 */
 
        SELECT '성공'
        COMMIT TRAN;
 
    END TRY
    BEGIN CATCH
    
        DECLARE @ErrorNumber    INT
        DECLARE @ErrorSeverity  INT
        DECLARE @ErrorState     INT
        DECLARE @ErrorProcedure NVARCHAR(MAX)
        DECLARE @ErrorLine      INT
        DECLARE @ErrorMessage   NVARCHAR(MAX)
 
        SELECT  @ErrorNumber    = ERROR_NUMBER(),   -- 오류 번호
                @ErrorSeverity  = ERROR_SEVERITY(), -- 오류 심각도
                @ErrorState     = ERROR_STATE(),    -- 오류 상태 번호
                @ErrorProcedure = ERROR_PROCEDURE(),-- 오류 발생 프로시저
                @ErrorLine      = ERROR_LINE(),     -- 오류 발생 행 번호
                @ErrorMessage   = ERROR_MESSAGE();  -- 오류 메세지
 
        SELECT '에러발생'
        IF XACT_STATE() <> 0 ROLLBACK TRAN;
 
    END CATCH
 
    SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
END

쿼리 실행 중 에러 없이 정상 실행시

TRY안에서 COMMIT TRAN과 함께 쿼리가 성공적으로 실행된다.


그러나 쿼리 실행 중 에러가 발생한다면,

CATCH로 빠지게 되고, 해당 에러를 파악 후 ROLLBACK TRAN으로 해당 쿼리를 롤백시킨다.



XACT_STATE()

1 : 활성상태의 커밋 가능한 트랜잭션 존재

-1 : 활성상태의 커밋 불가능한 트랜잭션 존재

0 : 비 활성 트랜잭션



에러 메세지 예)









출처: http://ggmouse.tistory.com/206?category=938079 [초보개발자꽁쥐]

Posted by 안낭우훗

 데이터를 암호화해보자



1. PWDENCRYPT



암호화


PWDENCRYPT('암호화할 문자')



암호비교

SELECT PWDCOMPARE('비교 대상 문자', '암호화된 Hash값')



PWDENCRYPT는 단방향 암호화 방식의 함수로 복호화가 되지 않는 함수다.
또한, 동일한 문자임에도 불구하고 새로운 Hash값을 제공한다.

SELECT PWDENCRYPT('123')



즉, 위의 쿼리를 실행해서 결과를 보면 실행할때 마다 매번 다른 결과의 Hash값을 볼 수 있다.
그렇다면, '123'이라는 문자와 '123'이 암호화된 데이터와 동일한지 어떻게 알 수 있을까? 이때 사용하는 함수가 바로 PWDCOMPARE다.





  예제


PWDENCRYPT 함수를 이용하여, 123이라는 문자를 암호화해보자

1
2
3
4
DECLARE @pwd VARBINARY(MAX);
SET @pwd = PWDENCRYPT('123');
 
SELECT @pwd
cs


@pwd는 다음과 같이 암호화된 문자열로 나오게 된다.

▶ 0x0200A40C6793E359E5EA06D8A3FB8C5CBF103B389D4C01559525886C81A73A1824B2B6D19735A626303EB2F0008E1CA1EBEC80E2ABA77BE8A82AD1F5085BC8706F86DD5A3DDB



※ 주의
HashBytes 함수의 반환값은 이진수이기 때문에 VARBINARY를 사용해야 한다.




그렇다면, 저 암호화된 문자열이 123이 암호화된 값이 맞는지 확인해보는 방법은?

위의 설명한바와 같이 PWDCOMPARE 함수를 이용해서 비교해보면 된다.


DECLARE @pwd VARBINARY(MAX);
SET @pwd = PWDENCRYPT('123');
 
SELECT PWDCOMPARE('123', @pwd)
SELECT PWDCOMPARE('12345', @pwd)
먼저 @pwd라는 변수를 설정 후 123 문자를 암호화한 값으로 설정해준다.

그 후 PWDCOMPARE 함수를 이용하여 암호화된 문자와 비교 대상 문자가 동일한지 확인해보자.


▶ 첫번째 결과는 1이 나오고, 두번째 결과는 0이 나오게된다.
1은 true로 123과 @pwd의 값이 동일함을 의미하고,
0는 false로 12345와 @pwd의 값이 동일하지 않음을 의미한다.





2. HASHBYTES


HASHBYTES('암호화알고리즘', '암호화할 문자')


암호화알고리즘은 다음과 같다.
MD2, MD4, MD5, SHA, SHA1, SHA2_256, SHA2_512

PWDENCRYPT와는 다르게 HASHBYTES는 매번 새로운 Hash값이 아닌 동일한 Hash을 반환한다.
그렇기 때문에 PWDCOMPARE와 같은 암호비교 함수를 사용하지 않아도 된다.





  예제



SELECT HASHBYTES('SHA2_512', '123')


▶ 0x3C9909AFEC25354D551DAE21590BB26E38D53F2173B8D3DC3EEE4C047E7AB1C1EB8B85103E3BE7BA613B31BB5C9C36214DC9F14A42FD7A2FDB84856BCA5C44C2




DECLARE @pwd VARBINARY(MAX);
SET @pwd = HASHBYTES('SHA2_512', '123')
 
IF (@pwd = HASHBYTES('SHA2_512', '123'))
    SELECT 1
ELSE
    SELECT 0

▶ 1 (true)



출처: http://ggmouse.tistory.com/208?category=938079 [초보개발자꽁쥐]


Posted by 안낭우훗


 효율적인 동적쿼리 실행을 위해 sp_executesql 저장 프로시저를 사용해보자



▶ sp_executesql 저장 프로시저는 매개 변수 대체를 지원하기 때문에 EXECUTE보다 융통성이 뛰어나다.

▶ sp_executesql은 SQL Server에서 재사용이 쉬운 실행 계획을 생성하므로 sp_executesql이 EXECUTE 문보다 효율적이다.


CREATE PROCEDURE [dbo].[USP_TEST_PROC]
    @in_Name VARCHAR(20) = '',
    @in_Age INT = ''
AS
BEGIN
 
    DECLARE @query VARCHAR(MAX);
    DECLARE @whereQuery VARCHAR(MAX);
 
    SET @query = '';
    SET @whereQuery = '';
 
    IF (@in_Name <> '')
        BEGIN
            SET @whereQuery = N' AND A.Name = ''' + @in_Name + ''' '
        END
 
    IF (@in_Age > 0)
        BEGIN
            SET @whereQuery = N' AND A.Age = ''' + @in_Age + ''' '
        END
 
    SET @query = N'SELECT *
                    FROM TBL_TEST_TABLE A
                        INNER JOIN TBL_TEST_TABLE2 B ON A.ID = B.ID
                    WHERE 1=1'
 
    /*****************************************************************/
 
    -- 1. EXECUTE 사용
    EXEC (@query + @whereQuery)
 
    -- 2. sp_executesql 사용
    DECLARE @SQLString NVARCHAR(MAX);
    DECLARE @ParmDefinition NVARCHAR(500);
 
    SET @SQLString = @query + @whereQuery;
 
    SET @ParmDefinition = N'@in_Name    VARCHAR(20),
                            @in_Age        INT'
 
    EXECUTE sp_executesql
        @SQLString,
        @ParmDefinition,
        @in_Name = @in_Name,
        @in_Age = @in_Age
 
END


  참고


https://technet.microsoft.com/ko-kr/library/ms175170(v=sql.105).aspx



출처: http://ggmouse.tistory.com/213?category=938079 [초보개발자꽁쥐]


Posted by 안낭우훗

시퀀스를 이용해서 별도의 유니크한 번호를 생성해보자



시퀀스 생성


CREATE SEQUENCE [schema_name . ] sequence_name  
    [ AS [ built_in_integer_type | user-defined_integer_type ] ]  
    [ START WITH <constant> ]  
    [ INCREMENT BY <constant> ]  
    [ { MINVALUE [ <constant> ] } | { NO MINVALUE } ]  
    [ { MAXVALUE [ <constant> ] } | { NO MAXVALUE } ]  
    [ CYCLE | { NO CYCLE } ]  
    [ { CACHE [ <constant> ] } | { NO CACHE } ]  
    [ ; ] 




  예제



다음과 같은 정수형 시퀀스를 생성해보자


CREATE SEQUENCE [dbo].[SEQ_TEST_NO] 
AS [int]                -- 정수형
START WITH 0            -- 0 부터 시작
INCREMENT BY 1          -- 1씩 증가 (-1일 경우 1씩 감소)
MINVALUE -2147483648    -- 최소값
MAXVALUE 2147483647     -- 최대값
CACHE



이제, 생성한 시퀀스를 사용해보자


SELECT NEXT VALUE FOR 시퀀스명



시퀀스 값 조회 결과 0 부터 시작하여 1씩 증가하는 값을 반환한다.


SELECT NEXT VALUE FOR SEQ_TEST_NO    -- 0
SELECT NEXT VALUE FOR SEQ_TEST_NO    -- 1
SELECT NEXT VALUE FOR SEQ_TEST_NO    -- 2








[출처]

https://docs.microsoft.com/ko-kr/sql/t-sql/statements/create-sequence-transact-sql



출처: http://ggmouse.tistory.com/214?category=938079 [초보개발자꽁쥐]

Posted by 안낭우훗


  LOCK 걸린 SPID 확인


EXEC sp_lock




SPID : 잠금을 요청하는 프로세스의 세션 ID

DBID : 데이터베이스의 식별번호

OBID : 개체의 식별번호

INDLD : 인덱스의 식별번호

TYPE : 잠금유형

RESOURCE : 리소스 식별값

MODE : 잠금

STATUS : 잠금요청상태


MODE

S : 공유 잠금

U : 업데이트 잠금

X : 독점 잠금

IS : 의도 공유

IU : 의도 업데이트

IX : 독점 의도

BU : 대량 업데이트




  수행된 쿼리 정보 확인


DBCC inputbuffer (spid값)





  SPID 관련 정보 확인


EXEC sp_who (spid값)




  해당 프로세스 종료


kill (spid값)



 



출처: http://ggmouse.tistory.com/214?category=938079 [초보개발자꽁쥐]

Posted by 안낭우훗
이전버튼 1 이전버튼

블로그 이미지
좋은싸이트 공유, 재해석 , 공부 정리, 틀린거 알려 주세요~
안낭우훗

태그목록

공지사항

Yesterday
Today
Total

달력

 « |  » 2025.5
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

최근에 올라온 글

최근에 달린 댓글

글 보관함