제2의 비엔지니어 인생관을 꿈꾸며

Posted
Filed under C#

간혹 출력한 엑셀데이터를 서버에 다른 환경에서 사용해야 할 경우 아무래도 시트명으로 읽어 들여야
하기 때문에 서로 업무상, 시트명을 통일하거나 아니면 입맛에 맞게 바꿔야하는경우 가 있다.
(지정하지 않으면,일반적으로  파일명이 시트명이 된다.)

기본 서버객체를 이용하지 않는 이상, 시트명은 지정이안된다, 그럼 서버객체를 이용하면 되지 않느냐?
이용해도 되지만 , 서버에 설치 와 권한 설정 등..귀차니즘 발동, 물론 업무에따라 중요도에 따라 서버객체를
를 이용해도된다. 

(아래는 서버 객체를 이용하지 않고 http header를 이용해서 웹문서를 엑셀문서로 출력시킨다.)

아래는 Http Header 를 excel 로 지정하고 ,  xml로 문서의 포맷을 정하고 html로 출력하여 Excel 문서로 인식하게끔 fake? 하게한다.



<%   
     //  Classic ASP  , ASP.Net , PHP , JAVA 등  서버단 코드에 맞게 엑셀 헤더 설정 
     //  아래 파랑색 코드 그대로 복사 붙이기한후 맨 아래는 기존에 Table 그대로 출력해준다
     //  아래 빨강색 sheet1 부분만 필요한 이름으로 수정
%>
<html xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns="http://www.w3.org/TR/REC-html40">
<head>
<!--[if gte mso 9]><xml>
 <o:DocumentProperties>
  <o:LastAuthor>JUBOB</o:LastAuthor>
  <o:Created>2999-09-02T07:46:35Z</o:Created>
  <o:LastSaved>2999-09-02T07:46:35Z</o:LastSaved>
  <o:Version>10.2625</o:Version>
 </o:DocumentProperties>
 <o:OfficeDocumentSettings>
  <o:DownloadComponents/>
  <o:LocationOfComponents HRef="file:///I:\"/>
 </o:OfficeDocumentSettings>
</xml><![endif]-->
<!--[if gte mso 9]><xml>
 <x:ExcelWorkbook>
  <x:ExcelWorksheets>
   <x:ExcelWorksheet>
    <x:Name>sheet1</x:Name>
    <x:WorksheetOptions>
     <x:DefaultRowHeight>270</x:DefaultRowHeight>
     <x:Selected/>
     <x:DoNotDisplayGridlines/>
     <x:ProtectContents>False</x:ProtectContents>
     <x:ProtectObjects>False</x:ProtectObjects>
     <x:ProtectScenarios>False</x:ProtectScenarios>
    </x:WorksheetOptions>
   </x:ExcelWorksheet>
  </x:ExcelWorksheets>
  <x:WindowHeight>12720</x:WindowHeight>
  <x:WindowWidth>24960</x:WindowWidth>
  <x:WindowTopX>120</x:WindowTopX>
  <x:WindowTopY>30</x:WindowTopY>
  <x:ProtectStructure>False</x:ProtectStructure>
  <x:ProtectWindows>False</x:ProtectWindows>
 </x:ExcelWorkbook>
</xml><![endif]-->
</head>
<body>
      <Table> 
         <tr>
                <td> 테이블로 만든 데이터 그대로 출력</td>
         </tr>
      <Table>
</body>
</html>
2018/03/21 14:31 2018/03/21 14:31
Posted
Filed under MSSQL
WITH  [임의의명칭] AS ( 사용하고픈 쿼리 ) 
select * from [WITH 에 서 만들어진 임시테이블 활용]


여러 쿼리 WITH 로 쓸경우 ( 컴마로 구분하여 연속적으로 작성한다 마치 WITH 만 생략된 느낌)
WITH [임시테이블명칭] AS (  ~ 사용하고픈  쿼리 ~ )
, [임시테이블 별칭] AS ( ~ 사용 하고픈 쿼리 ~)  
, [임시테이블 별칭] AS ( ~ 사용 하고픈 쿼리 ~)
select * from [WITH 에 서 만들어진 임시테이블 활용]
select * from [WITH 에 서 만들어진 임시테이블 활용]
→ 여기 (다음) 쿼리에서 활용하면 오류남 (WITH 마지막 쿼리만 유효)


1개의 테이블에서 쿼리된 집합결과를 별칭으로 사용
WITH USER1 AS
(
      select * from t_user where regDate = '2018-01-01'
)
select * from USER1


2개의 쿼리를 연결해서 각각의 별칭의 테이블로 사용하기
WITH USER1 AS
(
          select top 10 * from t_user where RegDate > '2018-01-01' and RegDate < '2018-02-01'
) , USER2 AS
(
          select top 10 * from t_user where RegDate > '2018-02-01' and RegDate < '2018-03-01'
( select * from USER1 )
   union
( select * from USER2 )




2개의 쿼리를 연결해서 각각의 별칭의 테이블로 사용 후 조인
WITH USER1 AS
(
          Select top 10 userid from t_user where RegDate > '2018-01-01' and RegDate < '2018-02-01'
) , USER2 AS 
(
     Select top 10 userid from t_user where RegDate > '2018-02-01' and RegDate < '2018-03-01'
) , USERTOT AS 
(
     (select * from USER1)
         union all
     (select * from USER2)
)
 select  UserName  from t_user A  right outer join USERTOT B on A.UserId = B.UserId 

WITH 로 만들어진 별칭에 대해서는  집합의 개념으로 테이블과 같이 다루어 질수있다.
목적에 따라 다르겟지만, 임시 데이터 활용을 위해 임시테이블(세션,메모리,뷰) 을 더 이상 안만들어도 되겟다.
2018/03/20 17:10 2018/03/20 17:10
Posted
Filed under MSSQL
일반적으로 프로그래밍에서 데이터 validation 이나 값의 체크는 DB 단보다는 유저인터페이스인 
어플단에서 1차적으로 필터링을 한다 하지만 Db 프로그래밍에서의 If 문 또한 자주이용하곤하는데

if 문 대신 case 문을 활용하기도 한다. 뭔가 좀더 간렬함 때문인데 , 아래 코드를보면
아래코드는 @a 의 값에 따라 @b 에 값을 할당하는 예제이다.

declare @a tinyint
declare @b char(3) 

set @b = '000' -- 기본으로  
set @a = 4  -- 일부러 없는 값을 넣음


if @a = 1  
   set @b = 'aaa'

if @b = 2 
  set @b = 'bbb'

if @c = 3
  set @b = 'ccc'

select @b  --  @b는?? 당연히  '000' 출력 너무 당연하다

이제 case when ~ then ~ 문을 살펴보자 

declare @a tinyint
declare @b char(3) 

set @b = '000' -- 기본으로  
set @a = 4  -- 일부러 없는 값을 넣음


set @b= case  

                when @a = 1 then 'aaa' 
                when @a = 2 then 'bbb'
                when @a = 3 then 'ccc'
End

select @b  -- @b 는?? Null 을 출력한다.

안타깝게도 case 문에서는  조건에 만족하는 값이 없으면 null 을 리턴한다.
그럼 난 리턴이 아닌 기본값 '000' 을 받고싶다면 아래와 같이 else 문을 활용하여야한다

set @b= case  
                when @a = 1 then 'aaa' 
                when @a = 2 then 'bbb'
                when @a = 3 then 'ccc'
             else @b   -- else 만 추가, 또는 else '000' 초기값 
End

select @b  -- @b 는 정상적으로 '000' 출력한다.

이번 아티클은 if / case 문법이나 용도를 몰라서라기보다,
case 문을 case 처럼(?) 사용하면 잘쓰는데, if 문 처럼(?) 쓰다보면  행하는 실수를 끄적여봣다.
2018/03/15 13:51 2018/03/15 13:51