SQL2010. 3. 22. 11:13

SQL Server에서 쿼리문 작성시 IF문을 종종 사용한다.
하지만 SELECT문 안에서는 IF문을 사용할 수가 없어 답답한 경우가 많다.
SQL Server에서는 SELECT문에서 IF문을 사용할 수 없는 대신 CASE문을 제공하고 있다. CASE문을 사용하면 SELECT문안에서도 IF문의 효과를 누릴 수 있다.

CASE 함수는 다중 IF문과 같은 구조를 가진다. 더불어 SELECT 구문 같은 DML과 연동을 해서 행 단위의 조건 처리가 가능하다는 특징을 가지고 있기 때문에 복잡한 쿼리 작성 시에 필수적으로 사용된다.

기본적인 구문>
1. CASE 함수는 지정된 조건식을 평가하고, 조건에 만족하는 결과 중 하나를 리턴한다.
2. CASE 함수는 다음과 같은 항목들로 구성된다.

CASE 키워드
변환할 열 이름
검색할 식을 지정하는 WHEN절 및 이를 바꿀 식을 지정하는 THEN 절
END 키워드
CASE 함수의 별칭을 정의하는 선택적 AS 절

형식별 CASE 함수>
1. 단순 CASE 함수
  - 조건식이 한 번만 지정되고 WHEN절에는 조건식과 비교할 상수값만 선언한다. 각각의 WHEN절을 비교해 조건에 만족하면 THEN절 다음의 구문이 실행된다.

syntax 1.

CASE input_expression!
WHEN when_expressionŋ THEN result_expressionŋ
WHEN when_expressionŌ THEN result_expressionŌ
[ ...n ]
[ ELSE else_result_expression! ]
END

2. 검색된 CASE 함수 (CASE 절에는 아무런 조건식도 오지 않는다)
  - 각 WHEN절에 필요한 조건식을 별도로 지정할 수 있다.조건이 만족하면 THEN절 다음에 명령이 실행된다.

syntax 2.

CASE
WHEN Boolean_expressionŋ THEN result_expressionŋ
WHEN Boolean_expressionŌ THEN result_expressionŌ
[ ...n ]
[ ELSE else_result_expression! ]
END

NOTE: THEN절 다음에는 일반 상수값 뿐만 아니라 함수나 심지어 또 다른 쿼리문이 올 수도 있다. 반드시 잊지 말 것은 result_expression!은 반드시 하나의 값을 리턴해야 한다는 것이다. 하지만 행 단위로 각각의 검색 조건이 반복 실행되므로, 성능에 관한한 최상의 결과를 얻기는 힘들다.

예제>

  - 여기서 CASE문은 컬럼에 표시할  때 조건에 따라 다르게 표시하도록 조건을 줄 때 사용하였다.

SELECT [Name], SocID, PayFlag, PayDate, SUM(PayAmount) AS PayAmount
FROM (
 SELECT P.[Name] AS [Name], P.SocID AS SocID, AP.PayFlag, CONVERT(VARCHAR(10), AP.UserPayDate, 121) AS PayDate,
  (CASE
   WHEN (AP.Cash+AP.Card) < AP.Cost03 THEN (AP.Cash+AP.Card)-AP.Cost01
   WHEN (AP.Cash+AP.Card) >= AP.Cost03 THEN AP.Cost03
  END) AS PayAmount

  FROM xdo_AccountPay AP
   INNER JOIN xdo_Account A ON A.AccountID = AP.AccountID
   INNER JOIN xdo_Patient P ON P.PatientID = A.PatientID
   WHERE AP.Cost03 > 0
    AND (CONVERT(VARCHAR(10), AP.UserPayDate, 121) BETWEEN  @csBeginPayDate AND @csEndPayDate)
    AND AP.PayFlag = 9
 ) AS SUBMAIN
GROUP BY [Name], SocID, PayFlag, PayDate
ORDER BY PayDate

CASE를 사용한 조건 데이터 처리>
  - 실제로 CASE문을 필요로 하는 것은 바로 DML 명령들이다. select 구문을 처리되는 집합 중 특정 컬럼값에 기초한 조건을 기준으로 테이블에는 없지만 새로운 집합에 포함돼야 할 컬럼을 새로 생성하고, 그 컬럼값을 추출, 가공, 연산하는 용도로 곧잘 사용된다. 즉 select되는 각각의 행(row, record)에 대해 조건을 부여하고 조건에 만족하는 결과를 새로운 컬럼값에 할당하는 것이다. CASE문을 조건 데이터 처리와 함께 사용한 경우에 두 가지 특징을 볼 수 있다.

CASE의 특징
1. 행 단위의 조건 처리가 가능
2. 새로운 컬럼 생성

CASE 함수는 다양한 상황의 문제 해결에 활용될 수 있다. 참고로 T-SQL에는 CASE와 유사한 COALESCE()함수가 있다.

Posted by 쿵캉켕
SQL2010. 3. 22. 11:11

응용프로그램과 연동된 저장프로시저를 디버깅하고 싶어 자료를 찾던 중 데브피아에서 발견한 문서입니다. 쿼리분석기에 저장프로시저의 디버그가 있지만 그것보단 프로필러를 사용한 방법이 더 쉽고 보기 편한 것 같아 올립니다.



출처: 데브피아.

Posted by 쿵캉켕
SQL2009. 6. 9. 11:16

서버 PC와 ODBC 연결을 할 때 모든 설정 다 맞는데 클라이언트에서 ODBC를 연결하려고 하면 이런 메시지가 뜨면서 연결할수 없다고 나올때가 있다.


이럴 때는 연결하고자 하는 SQL서버 PC의 방화벽에서 포트를 열어주어야 한다.

[제어판] -> [Windows 방화벽] -> [고급] -> [네트워크 연결설정]에서 "로컬 영역 연결"을 선택한 후 [설정]을 클릭한다.

[추가]버튼을 클릭한다.

각 정보를 입력한 뒤 [확인]을 클릭한다.
  - IP주소는 서버 PC의 주소를 넣는다.

"SQL 서버"항목이 추가되고 체크된 것을 볼 수 있다.

[확인]을 눌러 저장하고 Client에서 연결을 시도하면 성공되는 것을 확인할 수 있다.

Posted by 쿵캉켕