2020년 2월 13일 목요일

[기타] rundll , rundll32 명령어






-

( 1 )  Rundll 과 Rundll32 비교
Rundll은16-비트 DLL을 로드하고 실행하며, 반면 Rundll32는32-비트 DLL을 로드하고 실행함. 잘못된 DLL을 Rundll 나 Rundll32에 사용하는 경우, 오류 메시지 없이 실행에 실패함.



( 2 ) Rundll 커맨드 라인
RUNDLL.EXE <DLL 명>,<엔트리 포인트> <옵션 아규먼트>
ex. RUNDLL.EXE SETUPX.DLL,InstallHinfSection 132 C:\WINDOWS\INF\SHELL.INF



( 3 ) Rundll 명령어 라인에서 주의해야 할 3가지 문제
1. Rundll 이나 Rundll32은 주어진 DLL 파일명을 LoadLibrary() 함수가 사용하는 표준위치에서 찾음. 정확을 기하기 위해서는 DLL의 풀-패스를 기술하고, 유효한 파일명이 되기 위해서는 긴 파일명 대신 짧은 파일 명을 기술함. 즉 "C:\Program Files" 폴더는 반드시 짧은 폴더 명으로 변환되어야 함.
2. <DLL 명>에는 스페이스, 콤마, 따옴표 등이 포함될 수 없음. 이것은 Rundll 커맨드 분석기의 한계임.
3. 위 커맨드 라인에서, <DLL 명>과 <엔트리 포인트> 사이의 컴마(,)는 매우 중요함. 만약 컴마가 없다면, Rundll이나 Rundll32는 어떤 오류 메시지 없이 실패함. 또한 <DLL 명>, 컴마와 <엔트리 포인트> 함수 사이에는 스페이스도 없어야만 함.



( 4 ) Rundll 동작 방법
1. 커맨드 라인을 분석함.
2. LoadLibrary()로 명시된 DLL을 로드함.
3. GetProcAddress()로 <엔트리 포인트> 함수의 어드레스를 얻음.
4. <옵션 아규먼트>를 <엔트리 포인트> 함수로 패스하면서 콜함.
5. <엔트리 포인트> 함수 리턴시 Rundll.exe는 DLL을 언로드하고 종료함.



( 5 ) RunDll32.exe 사용 예


[프로그램 추가/제거] 열기
RunDll32.exe shell32.dll,Control_RunDLL appwiz.cpl,,0


[콘텐츠 관리자] 열기
RunDll32.exe msrating.dll,RatingSetupUI


[제어판] 열기
RunDll32.exe shell32.dll,Control_RunDLL

[인터넷 임시 파일] 삭제
RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 8

[인터넷 쿠키] 삭제
RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 2

[인터넷 히스토리] 삭제
RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 1

[인터넷 폼 데이터] 삭제
RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 16

[인터넷 패스워드] 삭제
RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 32

[인터넷 모두] 삭제
RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 255

[인터넷 애드온 파일 및 모두] 삭제
RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 4351


[날짜 및 시간] 열기
RunDll32.exe shell32.dll,Control_RunDLL timedate.cpl

Display Settings
RunDll32.exe shell32.dll,Control_RunDLL access.cpl,,3


[장치 관리자] 열기
RunDll32.exe devmgr.dll DeviceManager_Execute


[폴더 옵션 - 일반 탭] 열기
RunDll32.exe shell32.dll,Options_RunDLL 0


[폴더 옵션 - 보기 탭] 열기
RunDll32.exe shell32.dll,Options_RunDLL 7


[폴더 옵션 - 검색 탭] 열기
RunDll32.exe shell32.dll,Options_RunDLL 2

Folder Options - File Types
RunDll32.exe shell32.dll,Control_Options 2


[암호 기억 마법사] 열기
RunDll32.exe keymgr.dll,PRShowSaveWizardExW

[최대 절전 모드] 전환
RunDll32.exe powrprof.dll,SetSuspendState

Internet Explorer’s Internet Properties dialog box.
Rundll32 Shell32.dll,ConBring up trol_RunDLL Inetcpl.cpl,,6


[키보드 속성] 열기
RunDll32.exe shell32.dll,Control_RunDLL main.cpl @1

[화면 보호] 전환
RunDll32.exe user32.dll,LockWorkStation

[마우스 속성 - 단추 구성] 변경 <--- 다시 재부팅해야만 원복됨 ㅠㅠ
Rundll32 User32.dll,SwapMouseButton


[마우스 속성] 열기
Rundll32 Shell32.dll,Control_RunDLL main.cpl @0,0


[네트워크 드라이브 연결] 열기
Rundll32 Shell32.dll,SHHelpShortcuts_RunDLL Connect


[네트워크 연결] 열기
RunDll32.exe shell32.dll,Control_RunDLL ncpa.cpl


[즐겨찾기 관리] 열기
Rundll32.exe shdocvw.dll,DoOrganizeFavDlg

Open With Dialog Box
Rundll32 Shell32.dll,OpenAs_RunDLL Any_File-name.ext


[프린터 사용자 인터페이스] 열기
Rundll32 Printui.dll,PrintUIEntry /?


[프린터] 열기
Rundll32 Shell32.dll,SHHelpShortcuts_RunDLL PrintersFolder


[전원 옵션] 열기
RunDll32.exe Shell32.dll,Control_RunDLL powercfg.cpl

Process Idle Tasks
rundll32.exe advapi32.dll,ProcessIdleTasks


[국가 및 언어] 열기
Rundll32 Shell32.dll,Control_RunDLL Intl.cpl,,0


[저장된 사용자 이름 및 암호] 열기
RunDll32.exe keymgr.dll,KRShowKeyMgr


[하드웨어 안전하게 제거] 열기
Rundll32 Shell32.dll,Control_RunDLL HotPlug.dll


[소리] 열기
Rundll32 Shell32.dll,Control_RunDLL Mmsys.cpl,,0


[시스템 속성 - 고급 탭] 열기
Rundll32 Shell32.dll,Control_RunDLL Sysdm.cpl,,3


[시스템 속성 - 시스템 보호 탭] 열기
RunDll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,4


[시스템 속성 - 원격 탭] 열기
RunDll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,5


[작업 표시줄 및 시작 메뉴 속성 - 작업 표시줄 탭] 열기
RunDll32.exe shell32.dll,Options_RunDLL 1


[사용자 계정] 열기
RunDll32.exe shell32.dll,Control_RunDLL nusrmgr.cpl


[하드웨어 안전하게 제거] 열기
RunDll32.exe shell32.dll,Control_RunDLL hotplug.dll


[관리 센터] 열기
RunDll32.exe shell32.dll,Control_RunDLL wscui.cpl


[윈도우 정보] 열기
RunDll32.exe SHELL32.DLL,ShellAboutW


[Fonts] 열기
Rundll32 Shell32.dll,SHHelpShortcuts_RunDLL FontsFolder


[Windows 방화벽] 열기
RunDll32.exe shell32.dll,Control_RunDLL firewall.cpl

Wireless Network Setup
RunDll32.exe shell32.dll,Control_RunDLL NetSetup.cpl,@0,WNSW 



참고 사이트 : 
http://support.microsoft.com/kb/600820/ko
http://www.thewindowsclub.com/rundll32-shortcut-commands-windows

2019년 11월 23일 토요일

카카오헤어샵 장단점





카카오헤어샵 장단점

1. 시술 사진을 보고 매장과 디자이너를 선택 할 수 있다.

2. 직원 경력등을 확인 할 수 있다.

3. 내가 원하는 시술을 선택하고 이 스타일로 해달라고 요청이 가능하다.

4. 미리 결제를 해서 추가시술 안해도 상관이 없다. 머리하고 그냥 가면 된다.
(최근 이슈가 되었던 '시술금액 바가지' 이런거 걱정 안해도 된다.)

5. 이벤트를 매장/카카오 둘 다 하는 경우가 있어서 쿠폰으로 할인이 가능하다.

6. 예약을 했는데도 대기 하는 경우가 있는데 그런거 안해도 된다.

7. 시술 완료 후 리뷰가 작성 가능하기 때문에 댓글 알바 작업이 적어 솔직후기가 많다 .

2016년 12월 19일 월요일

[MSSQL] TRY...CATCH(Transact-SQL)








[MSSQL] TRY...CATCH(Transact-SQL)


Transact-SQL Visual C# 및 Microsoft Visual C++ 언어의 예외 처리와 유사한 방식으로 Microsoft에서 오류 처리를 구현합니다. Transact-SQL 문의 그룹을 TRY 블록으로 묶을 수 있으며 TRY 블록 내에서 오류가 발생하는 경우 CATCH 블록으로 묶은 또 다른 문의 그룹으로 제어가 전달됩니다.



-- Syntax for SQL Server, Azure SQL Database, Azure SQL Data Warehouse, Parallel Data Warehouse 
 
BEGIN TRY 
     { sql_statement | statement_block } 
END TRY 
BEGIN CATCH 
     [ { sql_statement | statement_block } ] 
END CATCH 
[ ; ] 


TRY...CATCH 구문은 심각도가 10을 넘으며 데이터베이스 연결을 닫지 않는 모든 실행 오류를 catch합니다.
TRY 블록 다음에는 곧바로 연결된 CATCH 블록이 이어져야 합니다. END TRY와 BEGIN CATCH 문 사이에 다른 문을 포함시키면 구문 오류가 발생합니다.
TRY...CATCH 구문은 여러 일괄 처리에 걸칠 수 없으며 또한 여러 Transact-SQL 문 블록에 걸칠 수 없습니다. 예를 들어 하나의 TRY...CATCH 구문이 두 개의 Transact-SQL BEGIN…END 블록에 걸치거나 IF...ELSE 구문에 걸칠 수 없습니다.
TRY 블록의 마지막 문 실행을 완료할 때 TRY 블록으로 묶은 코드에 오류가 없는 경우 연결된 END CATCH 문 바로 다음 문으로 제어가 전달됩니다. TRY 블록으로 묶은 코드에 오류가 있는 경우 연결된 CATCH 블록의 첫 번째 문으로 제어가 전달됩니다. END CATCH 문이 저장 프로시저 또는 트리거의 마지막 문인 경우 해당 저장 프로시저를 호출하거나 트리거를 발생시킨 문으로 제어가 전달됩니다.
CATCH 블록의 코드를 완료하면 END CATCH 문 바로 다음 문으로 제어가 전달됩니다. CATCH 블록이 포착한 오류는 호출 응용 프로그램으로 반환되지 않습니다. 오류 정보를 응용 프로그램으로 반환해야 하는 경우 CATCH 블록의 코드에서 SELECT 결과 집합 또는 RAISERROR 및 PRINT 문과 같은 메커니즘을 사용하세요.
TRY...CATCH 구문은 중첩할 수 있습니다. TRY 블록 또는 CATCH 블록은 중첩된 TRY...CATCH 구문을 포함할 수 있습니다. 예를 들어 CATCH 블록에 TRY...CATCH 구문을 포함하여 CATCH 코드가 발견하는 오류를 처리할 수 있습니다.
CATCH 블록에서 발견되는 오류는 다른 곳에서 발생한 오류와 같이 취급됩니다. CATCH 블록이 중첩된 TRY...CATCH 구문을 포함하는 경우 중첩된 TRY 블록에서 오류가 발생하면 중첩된 CATCH 블록으로 제어가 전달됩니다. 중첩된 TRY...CATCH 구문이 없는 경우 호출자로 오류가 다시 전달됩니다.
TRY...CATCH 구문은 TRY 블록의 코드가 실행한 저장 프로시저 또는 트리거에서 처리되지 않은 오류를 포착합니다. 또는 저장 프로시저나 트리거 자체에 코드에서 발생한 오류를 처리할 수 있도록 TRY...CATCH 구문을 포함할 수 있습니다. 예를 들어 TRY 블록이 저장 프로시저를 실행하고 해당 저장 프로시저에서 오류가 발생하는 경우 다음과 같은 방법으로 오류를 처리할 수 있습니다.
  • 저장 프로시저가 자체적인 TRY...CATCH 구문을 포함하지 않는 경우 오류가 발생하면 EXECUTE 문을 포함하는 TRY 블록과 연결된 CATCH 블록으로 제어가 반환됩니다.
  • 저장 프로시저가 TRY...CATCH 구문을 포함하는 경우 오류가 발생하면 저장 프로시저의 CATCH 블록으로 제어가 전달됩니다. CATCH 블록 코드를 완료하면 해당 저장 프로시저를 호출한 EXECUTE 문 바로 다음 문으로 제어가 전달됩니다.
GOTO 문을 사용하여 TRY 또는 CATCH 블록에 진입할 수 없지만 동일한 TRY 또는 CATCH 블록 내의 레이블로 이동하거나 TRY 또는 CATCH 블록에서 나가는 것은 가능합니다.
사용자 정의 함수에는 TRY...CATCH 구문을 사용할 수 없습니다.





CATCH 블록의 범위에서 다음 시스템 함수를 사용하여 CATCH 블록을 실행하도록 만든 오류에 대한 정보를 얻을 수 있습니다.
  • ERROR_NUMBER()는 오류 번호를 반환합니다.
  • ERROR_SEVERITY()는 심각도를 반환합니다.
  • ERROR_STATE()는 오류 상태 번호를 반환합니다.
  • ERROR_PROCEDURE()는 오류가 발생한 저장 프로시저 또는 트리거의 이름을 반환합니다.
  • ERROR_LINE()은 오류를 발생시킨 루틴 내의 줄 번호를 반환합니다.
  • ERROR_MESSAGE()는 오류 메시지의 전체 텍스트를 반환합니다. 이 텍스트는 길이, 개체 이름 또는 시간과 같은 대체 가능한 매개 변수에 제공된 값을 포함합니다.
CATCH 블록의 범위를 벗어나서 이러한 함수를 호출하면 NULL이 반환됩니다. CATCH 블록의 범위 내 어디에서나 이들 함수를 사용하여 오류 정보를 검색할 수 있습니다. 예를 들어 다음 스크립트는 오류 처리 함수를 포함하는 저장 프로시저를 보여 줍니다. CATCH 구문의 TRY…CATCH 블록에서 이 저장 프로시저를 호출하면 오류에 대한 정보가 반환됩니다.



-- Verify that the stored procedure does not already exist
IF OBJECT_ID ( 'usp_GetErrorInfo', 'P' ) IS NOT NULL  
    DROP PROCEDURE usp_GetErrorInfo;
 
GO 
 
-- Create procedure to retrieve error information
CREATE PROCEDURE usp_GetErrorInfo 
AS 
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;
 
GO 
 
BEGIN TRY 
    -- Generate divide-by-zero error. 
    SELECT 1/0
END TRY 
BEGIN CATCH 
    -- Execute error retrieval routine. 
    EXECUTE usp_GetErrorInfo; 
END CATCH;




TRY...CATCH 구문은 다음과 같은 조건에서 오류를 포착하지 않습니다.
  • 심각도가 10 이하인 경고 또는 정보 메시지
  • 해당 세션에 대한 SQL Server 데이터베이스 엔진 태스크 처리를 중지하게 만드는 심각도 20 이상의 오류. 심각도가 20 이상인 오류가 발생하고 데이터베이스 연결이 끊기지 않은 경우 TRY...CATCH가 오류를 처리합니다.
  • 클라이언트 인터럽트 요청 또는 클라이언트 연결 끊김과 같은 주의
  • 시스템 관리자가 KILL 문을 사용하여 세션을 종료할 때
다음 유형의 오류는 TRY...CATCH 구문과 같은 실행 수준에서 발생하는 경우 CATCH 블록에서 처리되지 않습니다.
  • 구문 오류와 같이 일괄 처리의 실행을 막는 컴파일 오류
  • 문 수준 다시 컴파일 단계에서 발생한 오류(예: 컴파일 이후에 지연된 이름 확인으로 발생한 개체 이름 확인 오류)
이런 오류는 해당 일괄 처리, 저장 프로시저 또는 트리거를 실행한 수준으로 반환됩니다.
TRY 블록 내의 더 낮은 실행 수준(예: sp_executesql 또는 사용자 정의 저장 프로시저 실행 시)에서 컴파일하는 동안 또는 문 수준으로 다시 컴파일하는 동안 오류가 발생하는 경우 이 오류는 TRY...CATCH 구문보다 낮은 수준에서 발생하며 연관된 CATCH 블록에서 처리됩니다.
다음 예에서는 SELECT 문에서 발생한 개체 이름 확인 오류가 TRY…CATCH 구문으로는 포착되지 않지만 저장 프로시저 내에서 동일한 CATCH 문을 실행할 때 SELECT 블록에서 포착되는 상황을 보여 줍니다.


BEGIN TRY 
    -- Table does not exist; object name resolution 
    -- error not caught. 
    SELECT * FROM NonexistentTable; 
END TRY 
BEGIN CATCH 
    SELECT
ERROR_NUMBER() AS ErrorNumber 
       ,ERROR_MESSAGE() AS ErrorMessage; 
END CATCH

오류가 포착되지 않고 TRY…CATCH 구문 밖으로 제어가 전달되어 다음으로 높은 수준으로 이동됩니다.
저장 프로시저 내에서 SELECT 문을 실행하면 TRY 블록보다 낮은 수준에서 오류가 발생하여 TRY…CATCH 구문에서 오류를 처리할 수 있습니다.


-- Verify that the stored procedure does not exist
IF OBJECT_ID ( N'usp_ExampleProc', N'P' ) IS NOT NULL  
    DROP PROCEDURE usp_ExampleProc;
 
GO 
 
-- Create a stored procedure that will cause an  
-- object resolution error
CREATE PROCEDURE usp_ExampleProc 
AS 
    SELECT * FROM NonexistentTable;
 
GO 
 
BEGIN TRY 
    EXECUTE usp_ExampleProc; 
END TRY 
BEGIN CATCH 
    SELECT  
        ERROR_NUMBER() AS ErrorNumber 
        ,ERROR_MESSAGE() AS ErrorMessage; 
END CATCH; 






TRY 블록에서 생성된 오류로 인해 현재 트랜잭션의 상태가 무효화되는 경우 그 트랜잭션은 커밋 불가능 트랜잭션으로 분류됩니다. 일반적으로 TRY 블록 바깥에서 트랜잭션을 종료하게 만드는 오류가 TRY 블록 내부에서 발생하면 트랜잭션이 커밋 불가능 상태가 됩니다. 커밋 불가능 트랜잭션은 읽기 작업 또는 ROLLBACK TRANSACTION만 수행할 수 있습니다. 커밋할 수 없는 트랜잭션은 쓰기 작업 또는 COMMIT TRANSACTION을 생성하는 어떤 Transact-SQL 문도 실행할 수 없습니다. 어떤 트랜잭션이 커밋 불가능 트랜잭션으로 분류된 경우 XACT_STATE 함수는 -1 값을 반환합니다. 일괄 처리가 완료되면 데이터베이스 엔진은 커밋 불가능 활성 트랜잭션을 모두 롤백합니다. 트랜잭션이 커밋할 수 없는 상태가 되었을 때 오류 메시지가 전송되지 않은 경우 일괄 처리가 완료되면 오류 메시지가 클라이언트 응용 프로그램으로 전송됩니다. 이 메시지는 커밋 불가능 트랜잭션이 검색되어 롤백되었음을 보여 줍니다.



예제


1. TRY…CATCH 사용

다음 예에서는 0으로 나누기 오류를 일으키는 SELECT 문을 보여 줍니다. 이 오류로 인해 연결된 CATCH 블록으로 실행이 이동합니다.
BEGIN TRY  
    -- Generate a divide-by-zero error.  
    SELECT 1/0;  
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;  
END CATCH;  
GO  

2. 트랜잭션에서 TRY...CATCH 사용

다음 예에서는 트랜잭션 내에서 TRY…CATCH 블록이 작동하는 방법을 보여 줍니다. TRY 블록 내의 문은 제약 조건 위반 오류를 일으킵니다.
BEGIN TRANSACTION;  
  
BEGIN TRY  
    -- Generate a constraint violation error.  
    DELETE FROM Production.Product  
    WHERE ProductID = 980;  
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  

3. TRY...CATCH에 XACT_STATE 사용

다음 예에서는 트랜잭션 내부에서 발생하는 오류를 TRY…CATCH 구문을 사용하여 처리하는 방법을 보여 줍니다. 트랜잭션을 커밋해야 하는지 또는 롤백해야 하는지는 XACT_STATE 함수가 결정합니다. 이 예에서 SET XACT_ABORTON입니다. 이렇게 하면 제약 조건 위반 오류가 발생할 경우 트랜잭션을 커밋할 수 없습니다.
-- Check to see whether this stored procedure exists.  
IF OBJECT_ID (N'usp_GetErrorInfo', N'P') IS NOT NULL  
    DROP PROCEDURE usp_GetErrorInfo;  
GO  
  
-- Create procedure to retrieve error information.  
CREATE PROCEDURE usp_GetErrorInfo  
AS  
    SELECT   
         ERROR_NUMBER() AS ErrorNumber  
        ,ERROR_SEVERITY() AS ErrorSeverity  
        ,ERROR_STATE() AS ErrorState  
        ,ERROR_LINE () AS ErrorLine  
        ,ERROR_PROCEDURE() AS ErrorProcedure  
        ,ERROR_MESSAGE() AS ErrorMessage;  
GO  
  
-- SET XACT_ABORT ON will cause the transaction to be uncommittable  
-- when the constraint violation occurs.   
SET XACT_ABORT ON;  
  
BEGIN TRY  
    BEGIN TRANSACTION;  
        -- A FOREIGN KEY constraint exists on this table. This   
        -- statement will generate a constraint violation error.  
        DELETE FROM Production.Product  
            WHERE ProductID = 980;  
  
    -- If the DELETE statement succeeds, commit the transaction.  
    COMMIT TRANSACTION;  
END TRY  
BEGIN CATCH  
    -- Execute error retrieval routine.  
    EXECUTE usp_GetErrorInfo;  
  
    -- Test XACT_STATE:  
        -- If 1, the transaction is committable.  
        -- If -1, the transaction is uncommittable and should   
        --     be rolled back.  
        -- XACT_STATE = 0 means that there is no transaction and  
        --     a commit or rollback operation would generate an error.  
  
    -- Test whether the transaction is uncommittable.  
    IF (XACT_STATE()) = -1  
    BEGIN  
        PRINT  
            N'The transaction is in an uncommittable state.' +  
            'Rolling back transaction.'  
        ROLLBACK TRANSACTION;  
    END;  
  
    -- Test whether the transaction is committable.  
    IF (XACT_STATE()) = 1  
    BEGIN  
        PRINT  
            N'The transaction is committable.' +  
            'Committing transaction.'  
        COMMIT TRANSACTION;     
    END;  
END CATCH;  
GO  

4. TRY…CATCH 사용

다음 예에서는 0으로 나누기 오류를 일으키는 SELECT 문을 보여 줍니다. 이 오류로 인해 연결된 CATCH 블록으로 실행이 이동합니다.

BEGIN TRY  
    -- Generate a divide-by-zero error.  
    SELECT 1/0;  
END TRY  
BEGIN CATCH  
    SELECT  
        ERROR_NUMBER() AS ErrorNumber  
        ,ERROR_SEVERITY() AS ErrorSeverity  
        ,ERROR_STATE() AS ErrorState  
        ,ERROR_PROCEDURE() AS ErrorProcedure  
        ,ERROR_MESSAGE() AS ErrorMessage;  
END CATCH;  
GO  

[MSSQL] IIF (SQL Server 2012 이상)








[MSSQL] IIF (SQL Server 2012 이상)


SQL Server에서 부울 식이 True인지 False인지에 따라 두 값 중 하나를 반환합니다.


DECLARE @a int = 45, @b int = 40; 
SELECT IIF ( @a > @b, 'TRUE', 'FALSE' ) AS Result; 

SELECT IIF( 'a' <> 'b'  , @a, @b )

[MSSQL] FORMAT (Sql Server 2012 이상)







[MSSQL] FORMAT (Sql Server 2012 이상)


FORMAT(Transact-SQL)



SQL Server (2012 부터 사용 가능) 에서 지정된 형식 및 선택적 culture로 서식이 지정된 값을 반환합니다. 날짜/시간 및 숫자 값을 문자열로 지정하는 로캘 인식 서식 지정에 FORMAT 함수를 사용합니다. 일반 데이터 형식 변환의 경우 CAST나 CONVERT를 사용합니다.


FORMAT ( value, format [, culture ] )  


인수


서식을 지정할 지원되는 데이터 형식의 식입니다. 유효한 형식 목록은 다음 설명 섹션의 표를 참조하세요.
형식
nvarchar 형식 패턴입니다.
형식 인수 포함 해야 유효한.NET Framework 형식 문자열을 표준 형식 문자열 (예를 들어, "C" 또는 "D") 또는 사용자 지정 문자 패턴으로 날짜 및 숫자 값 (예를 들어 "MMMM DD, yyyy (dddd)"). 복합 서식 지정은 지원되지 않습니다. 이러한 형식 지정 패턴에 대한 자세한 설명은 .NET Framework 설명서에서 일반적인 문자열 서식 지정, 사용자 지정 날짜 및 시간 형식 및 사용자 지정 숫자 형식을 참조하세요. 
문화권
선택적 nvarchar culture를 지정 하는 인수입니다.
하는 경우는 문화권 인수 제공 하지 않으면, 현재 세션의 언어가 사용 됩니다. 이 언어는 SET LANGUAGE 문을 사용하여 명시적으로 또는 암시적으로 설정됩니다. 문화권 인수로;.NET Framework에서 지 원하는 모든 culture를 허용 하 여 명시적으로 지원 되는 언어에 제한 되지 않습니다 SQL Server 합니다. 하는 경우는 문화권 인수가 유효 하지 않을, 형식에서 오류가 발생 합니다.

nvarchar 또는 null
반환 값의 길이에 의해 결정 됩니다는 형식합니다.
형식 오류에 대 한 이외의 NULL을 반환는 문화권 없는 유효한합니다. 에 지정 된 값이 NULL이 반환 하는 예를 들어 형식 올바르지 않습니다.
FORMAT는 .NET Framework CLR(공용 언어 런타임)이 설치되어 있어야 사용할 수 있습니다.
이 함수는 CLR이 있어야 실행되므로 원격에서 실행할 수 없습니다. CLR이 설치되어 있어야만 실행되는 함수를 원격에서 호출할 경우 원격 서버에서 오류가 발생합니다.
형식 서식 설정 규칙에 따라 콜론과 마침표를 이스케이프 해야 하는 CLR에 의존 합니다. 따라서, 형식 (두 번째 매개 변수) 문자열에 콜론 또는 마침표, 콜론 또는 기간 때 입력된 값 백슬래시로 이스케이프 되어야 합니다 (첫 번째 매개 변수)는는 시간 데이터 형식입니다.
다음 표에서 사용할 수 있는 데이터 형식에 대 한는  함께.NET Framework 매핑 해당 인수입니다.
범주 형식 .NET 형식
숫자 bigint Int64
숫자 int Int32
숫자 smallint Int16
숫자 tinyint Byte
숫자 decimal SqlDecimal
숫자 numeric SqlDecimal
숫자 float Double
숫자 real Single
숫자 smallmoney Decimal
숫자 money Decimal
날짜 및 시간 date 과 같이 지원되는
날짜 및 시간 time TimeSpan
날짜 및 시간 datetime 과 같이 지원되는
날짜 및 시간 smalldatetime 과 같이 지원되는
날짜 및 시간 datetime2 DateTime
날짜 및 시간 datetimeoffset DateTimeOffset

1. 간단한 FORMAT 예

다음 예에서는 다양한 culture에 따라 형식이 지정된 간단한 날짜를 반환합니다.
DECLARE @d DATETIME = '10/01/2011';  
SELECT FORMAT ( @d, 'd', 'en-US' ) AS 'US English Result'  
      ,FORMAT ( @d, 'd', 'en-gb' ) AS 'Great Britain English Result'  
      ,FORMAT ( @d, 'd', 'de-de' ) AS 'German Result'  
      ,FORMAT ( @d, 'd', 'zh-cn' ) AS 'Simplified Chinese (PRC) Result';   
  
SELECT FORMAT ( @d, 'D', 'en-US' ) AS 'US English Result'  
      ,FORMAT ( @d, 'D', 'en-gb' ) AS 'Great Britain English Result'  
      ,FORMAT ( @d, 'D', 'de-de' ) AS 'German Result'  
      ,FORMAT ( @d, 'D', 'zh-cn' ) AS 'Chinese (Simplified PRC) Result'      ,FORMAT ( @d, 'D', 'ko-kr' ) AS 'korea Result'      ,FORMAT ( @d, 'yyyy년 MM월 dd일', 'ko-kr' ) AS 'korea (custom) Result';   

결과 집합은 다음과 같습니다.
  
US English Result Great Britain English Result  German Result Simplified Chinese (PRC) Result  
----------------  ----------------------------- ------------- -------------------------------------  
10/1/2011         01/10/2011                    01.10.2011    2011/10/1  
  
(1 row(s) affected)  
  
US English Result            Great Britain English Result  German Result                    Chinese (Simplified PRC) Result  
---------------------------- ----------------------------- -----------------------------  ---------------------------------------  
Saturday, October 01, 2011   01 October 2011               Samstag, 1. Oktober 2011        2011年10月1日  
  
(1 row(s) affected)  
  

 

 

2. 사용자 지정 서식 문자열이 포함된 FORMAT

다음 예에서는 사용자 지정 서식을 지정하여 숫자 값의 서식을 지정하는 방법을 보여 줍니다. 

-- Current date is September 27 2012.  
DECLARE @d DATETIME = GETDATE();  
SELECT FORMAT( @d, 'dd/MM/yyyy', 'en-US' ) AS 'DateTime Result'  
       ,FORMAT(123456789,'###-##-####') AS 'Custom Number Result';  

결과 집합은 다음과 같습니다.

  
DateTime Result  Custom Number Result  
--------------   --------------------  
27/09/2012       123-45-6789  
  
(1 row(s) affected)  
  


3. 숫자 유형이 있는 FORMAT

5 개의 행을 반환 하는 다음 예제는 Sales.CurrencyRate 테이블에 AdventureWorks2012 데이터베이스입니다. 열 EndOfDateRate 형식으로 저장 되어 money 테이블에 있습니다. 이 예에서는 서식이 지정되지 않은 상태로 열이 반환된 다음 .NET 숫자 형식, 일반 형식 및 통화 형식 유형 중 하나로 서식이 지정됩니다. 
  
SELECT TOP(5)CurrencyRateID, EndOfDayRate  
            ,FORMAT(EndOfDayRate, 'N', 'en-us') AS 'Number Format'  
            ,FORMAT(EndOfDayRate, 'G', 'en-us') AS 'General Format'  
            ,FORMAT(EndOfDayRate, 'C', 'en-us') AS 'Currency Format'  
FROM Sales.CurrencyRate  
ORDER BY CurrencyRateID;  
  

결과 집합은 다음과 같습니다.
  
CurrencyRateID EndOfDayRate  Numeric Format  General Format  Currency Format  
-------------- ------------  --------------  --------------  ---------------  
1              1.0002        1.00            1.0002          $1.00  
2              1.55          1.55            1.5500          $1.55  
3              1.9419        1.94            1.9419          $1.94  
4              1.4683        1.47            1.4683          $1.47  
5              8.2784        8.28            8.2784          $8.28  
  
(5 row(s) affected)  
  

이 예에서는 독일어 culture(de-de)를 지정합니다.
  
SELECT TOP(5)CurrencyRateID, EndOfDayRate  
      ,FORMAT(EndOfDayRate, 'N', 'de-de') AS 'Numeric Format'  
      ,FORMAT(EndOfDayRate, 'G', 'de-de') AS 'General Format'  
      ,FORMAT(EndOfDayRate, 'C', 'de-de') AS 'Currency Format'  
FROM Sales.CurrencyRate  
ORDER BY CurrencyRateID; 


  
CurrencyRateID EndOfDayRate  Numeric Format  General Format  Currency Format  
-------------- ------------  --------------  --------------  ---------------  
1              1.0002        1,00            1,0002          1,00 €  
2              1.55          1,55            1,5500          1,55 €  
3              1.9419        1,94            1,9419          1,94 €  
4              1.4683        1,47            1,4683          1,47 €  
5              8.2784        8,28            8,2784          8,28 €  
  
 (5 row(s) affected) 

 

4. 시간 데이터 유형이 있는 FORMAT

형식 때문에 이러한 경우 NULL을 반환 합니다. 및: 이스케이프 되지 않습니다.
SELECT FORMAT(cast('07:35' as time), N'hh.mm');   --> returns NULL  
SELECT FORMAT(cast('07:35' as time), N'hh:mm');   --> returns NULL  
지정 된 형식 때문에 서식이 지정 된 문자열을 반환 된 합니다. 및: 이스케이프 됩니다.

SELECT FORMAT(cast('07:35' as time), N'hh\.mm');  --> returns 07.35  
SELECT FORMAT(cast('07:35' as time), N'hh\:mm');  --> returns 07:35