<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:admin="http://webns.net/mvcb/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><channel><title>WDEV RSS</title><link>http://www.wdev.co.kr/</link><description>WDEV</description><laguage>ko</laguage><item><title>Camel to snake</title><link>http://www.wdev.co.kr/atl/view.asp?a_id=15</link><description><![CDATA[<br />camel case로 된 분자열을 snake case로 변환하는 경우 사용할 수 있는 함수이다.<br /><br />대문자 전환은 옵션으로 사용<br />underscore대신 hyphen을 사용하는 경우는 함수 내의 문자열을 수정하여 사용하던지 대응되는 함수를 만들어 사용<br /><br /> <br /> <br />
<pre><code class="JavaScript">
/**
*
* Camel case convert to Snake case
*
* parameter: s(convert string), u(optional: uppercase)
*
*/
function camel2Snake( s, u ) {
    let r = '';

    if(s!==undefined &amp;&amp; s!==null) {
        let sp = s.split(/(?=[A-Z])/);
        if(u!==undefined &amp;&amp; u!==null &amp;&amp; u) {
            r = sp.join('_').toUpperCase();
        } else {
            r = sp.join('_').toLowerCase();
        }
    }

    return r;
}


camel2Snake('asdjaskSsdjsSsada');
&gt;&gt; "asdjask_ssdjs_ssada"

camel2Snake('asdjaskSsdjsSsada', true );
&gt;&gt; "ASDJASK_SSDJS_SSADA"

</code></pre>]]></description><dc:date>Sun, 19 Jan 2020 00:00:00 +0900</dc:date></item><item><title>[Classic ASP] UTF-8</title><link>http://www.wdev.co.kr/atl/view.asp?a_id=14</link><description><![CDATA[ASP에서 UTF-8로 작성하는 경우<br /><br /><br />
<pre><code class="VBScript">&lt;%@Language="VBScript" CODEPAGE="65001" %&gt;
&lt;% Option Explicit %&gt;
&lt;%
Response.CharSet="utf-8"
Session.codepage="65001"
Response.codepage="65001"
Response.ContentType="text/html;charset=utf-8"
Response.expires = 0
Server.ScriptTimeout = 180
%&gt;
</code>
</pre>]]></description><dc:date>Tue, 14 Jan 2020 00:00:00 +0900</dc:date></item><item><title>wiwdows 10 God mode</title><link>http://www.wdev.co.kr/atl/view.asp?a_id=13</link><description><![CDATA[<br /><span>바탕화면에 새폴더를 만들고 이름을<br /><strong>God Mode.{ED7BA470-8E54-465E-825C-99712043E01C} 로 변경 한다.</strong></span><br /><br /><img title="0001()" src="http://www.wdev.co.kr/images_atl/000/000/000/000000000013/000000000013-0001.jpg" alt="0001()" width="332" height="600" />]]></description><dc:date>Sun, 28 Oct 2018 00:00:00 +0900</dc:date></item><item><title>windows 10 3D 개체 삭제</title><link>http://www.wdev.co.kr/atl/view.asp?a_id=12</link><description><![CDATA[<img title="0001()" src="http://www.wdev.co.kr/images_atl/000/000/000/000000000012/000000000012-0001.jpg" alt="0001()" width="256" height="193" /><br /><br /><br /><br />regedit 실행<br /><br />HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace&nbsp;키 경로로 이동해&nbsp;<strong>{0DB7E03F-FC29-4DC6-9020-FF41B59E513A}</strong>&nbsp;키값을 찾습니다.<br /><br /><br /><img title="0002()" src="http://www.wdev.co.kr/images_atl/000/000/000/000000000012/000000000012-0002.jpg" alt="0002()" width="550" height="334" /><br />
<div><br />삭제한다 ^^</div>]]></description><dc:date>Sun, 28 Oct 2018 00:00:00 +0900</dc:date></item><item><title>[MS-SQL] 문자열 추출 함수</title><link>http://www.wdev.co.kr/atl/view.asp?a_id=11</link><description><![CDATA[<div>
<div><img title="0001()" src="http://www.wdev.co.kr/images_atl/000/000/000/000000000011/000000000011-0001.jpg" alt="0001()" width="500" height="382" /><br />구분자로 여러내용을 모아 저장하는 문자열은 일반적으로 어프리케이션 단에서 처리를 하는데,<br />서버단에서 처리가 필요한 경우 사용 할 수 있는 함수 입니다.<br /><br />Syntax : <strong>fc_split_str</strong>( [문자열], [구분자], [순서] )</div>
<div>&nbsp;</div>
<div>
<div>&nbsp;</div>
<div>사용예제</div>
<div>&nbsp;</div>
<div>declare @c varchar(250)</div>
<div>select @c = '000,0005,2011,1,211,000,000'<br /><br /></div>
<div>SELECT * FROM fc_split_str(@c,',', 4)</div>
<div><br /><br /></div>
</div>
<span style="font-size: 10pt; letter-spacing: 0px; line-height: 18.6666660308838px;" data-mce-mark="1">&nbsp;</span></div>
<div>
<pre><code class="SQL">----------------------------------------------------
/*
prog by inkyung kim
*/

create function fc_split_str
(
    @cText varchar(2000),   -- 문자열
    @cDelimiter varchar(1), -- 구분자
    @iPosString int
) 
returns @split_temp table  ( value varchar(2000) )
 
as 
begin   
 
    declare @iStartPos int, @iDelimiterPos int, @iCount int
    declare @tmpvar varchar(1000) -- 분리된 문자열 임시 저장변수
 
    set @iCount        = 0 -- 순서
    set @iStartPos     = 1 -- 구분문자 검색을 시작할 위치
    set @iDelimiterPos = 1 -- 구분문자 위치
 
    while (@iDelimiterPos &gt; 0)
    begin
 
    set @iCount = @iCount + 1
   
        set @iDelimiterPos = charindex( @cDelimiter, @cText, @iStartPos )
 
        if @iDelimiterPos = 0 
            set @tmpvar = right( @cText, len(@cText)-@iStartPos+1 )
        else
            set @tmpvar = substring( @cText, @iStartPos, @iDelimiterPos-@iStartPos )
 
 
        if ( (len(@tmpvar)&gt;0) and (@iPosString=@iCount) )
            insert into @split_temp values( @tmpvar )
 
        set @iStartPos = @iDelimiterPos +1 
    end
 
   return 
end
----------------------------------------------
</code></pre>
</div>
<div>&nbsp;</div>]]></description><dc:date>Mon, 27 Apr 2015 00:00:00 +0900</dc:date></item><item><title>[Classic ASP] 메일보내기</title><link>http://www.wdev.co.kr/atl/view.asp?a_id=9</link><description><![CDATA[<img title="0001()" src="http://www.wdev.co.kr/images_atl/000/000/000/000000000009/000000000009-0001.jpg" alt="0001()" width="533" height="343" /><br /><br />ASP에서 메일을 보내는 경우 CDO.Message를 이용하여 보내야 한다.<br /><br />사이트내에서 메일보내기는 대게 보내는 메일주소가 일정하므로 보내는 메일주소정보가 함수내 포함하도록 했다.<br />sendmail 함수내의 Const 부분을 환경에 맞게 수정하여 사용하면 된다.<br /><br />사용시 중간부분의 "on error resume next" 부분을 주석으로 막고 테스트후 정상작동하는 경우 사용한다.<br /><br />메일 발송시 보내지는 주소(SEND_USER_NAME)과 실제 메일주소(MAIL_FROM)가 동리하지 않아도 대부분 발송이 되지만<span style="text-decoration: underline; color: #ff0000;"> daum의 경우에는 이부분이 동일한지 확인하도록 되어있습니다.</span>&nbsp;사이트 이용자가 메일수신을 다음으로 하는 경우에 대비하여 되도록 일치하도록 하는 것이 좋습니다.<br /><br /><br />
<pre><code class="VBScript">&lt;%
'===============================
'   use relay SMTP
'===============================
function SendMail( cSubject, cMailTo, cBody )

	Const MAIL_FROM        = "메일러(발송전용)&lt;user@mailserver.com&gt;" 
	Const SMTP_SERVER      = "mail.mailserver.com"
	Const SMTP_SERVER_PORT = 25
	Const SEND_USER_NAME   = "user@mailserver.com" 
	Const SEND_PASSWORD    = "password" 

	Const cdoSendUsingMethod       = "http://schemas.microsoft.com/cdo/configuration/sendusing" 
	Const cdoSendUsingPort         = 2 '== 1일 경우 로컬(SMTP), 2일 경우 외부(SMTP)로 메일전송
	Const cdoSMTPServer            = "http://schemas.microsoft.com/cdo/configuration/smtpserver" 
	Const cdoSMTPServerPort        = "http://schemas.microsoft.com/cdo/configuration/smtpserverport" 
	Const cdoSMTPConnectionTimeout = "http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout" 
	Const cdoSMTPAccountName       = "http://schemas.microsoft.com/cdo/configuration/smtpaccountname" 
	Const cdoSMTPAuthenticate      = "http://schemas.microsoft.com/cdo/configuration/smtpauthenticate" 
	Const cdoBasic                 = 1 
	Const cdoSendUserName          = "http://schemas.microsoft.com/cdo/configuration/sendusername" 
	Const cdoSendPassword          = "http://schemas.microsoft.com/cdo/configuration/sendpassword" 

	on error resume next
	
	dim oConfig  ' As CDO.Configuration 
	dim oMessage ' As CDO.Message 
	dim oFields  ' As ADODB.oFields 
	
	'== Get a handle on the config object and it's oFields 
	set oConfig = Server.CreateObject("CDO.Configuration") 
	set oFields = oConfig.Fields 
	
	'== set config oFields we care about 
	with oFields 
		.Item(cdoSendUsingMethod)  = cdoSendUsingPort 
		.Item(cdoSMTPServer)       = SMTP_SERVER	
		.Item(cdoSMTPServerPort)   = SMTP_SERVER_PORT
		.Item(cdoSMTPAuthenticate) = cdoBasic 
		.Item(cdoSendUserName)     = SEND_USER_NAME
		.Item(cdoSendPassword)     = SEND_PASSWORD
		.Update 
	end with 
		
	set oMessage = Server.CreateObject("CDO.Message") 
	set oMessage.Configuration = oConfig 
	
	with oMessage 
 		.To = cMailTo
		.From = MAIL_FROM
		.Subject = cSubject
		.HTMLBody = cBody 
		.Send 
	end With 
	
	set oMessage = nothing 
	set oFields = nothing 
	set oConfig = nothing 
	
	SendMail = null
end function

'=============================
'  use local SMTP service
'=============================
function SendMailLocal( cSubject, cMailFrom, cMailTo, cBody )
	dim oMessage, oConfig, oFields
	
	set oConfig = Server.CreateObject("CDO.configuration")
	set oFields = oConfig.Fields
	
	oFields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 1
	oFields.item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
	oFields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "localhost"
	oFields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverpickupdirectory") = "c:\Inetpub\mailroot\Pickup"
	oFields.Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 30
	oFields.update
	
	set oMessage = Server.CreateObject("CDO.Message")
	set oMessage.Configuration = oConfig
	
	oMessage.from = cMailFrom
	oMessage.to = cMailTo
	oMessage.Subject = cSubject
	oMessage.HtmlBody = cBody
	oMessage.Send

	set oMessage = nothing 
	set oFields = nothing 
	set oConfig = nothing 
		
	SendMailLocal = null
end function
%&gt;
</code>
</pre>]]></description><dc:date>Mon, 17 Nov 2014 00:00:00 +0900</dc:date></item><item><title>[Classic ASP] 파일다운로드</title><link>http://www.wdev.co.kr/atl/view.asp?a_id=8</link><description><![CDATA[<img title="0001()" src="http://www.wdev.co.kr/images_atl/000/000/000/000000000008/000000000008-0001.jpg" alt="0001()" width="400" height="293" /><br /><br />ASP에서 파일을 다운로드 하는 경우에는 ContentType을 "application/unknown"으로 설정해주어야 MINE 연결이 해제되고 저장하는 방식으로 처리된다.<br />그리고 헤더를 보낸후에 파일 내용을 바이너리형식으로 보내 주어야 하는데 이를 위하여 파일을 Strem형식으로 읽어 보내주면 된다.<br /><br />한가지 주의점은 저장파일의 이름변수의 값이 PC에서 파일이름으로 사용할 수 없는 문자가 포함되지 않도록 되어있어여하는데 함수&nbsp;RefineFileName는 이값들을 정제해주는 기능의 함수로 잘못된 파일이름으로 인한 에러를 방지해 줄 수 있다,&nbsp;<br /><br /><br />
<pre><code class="VBScript">&lt;%

function FileDownload( cPathFile, cSaveFileName )
	Response.ContentType = "application/unknown"
	Response.AddHeader "Content-Disposition","attachment; filename=" &amp; cSaveFileName&amp;" "
	Response.BinaryWrite GetFileStream( cPathFile )
	FileDownload = null
end function

function GetFileStream( cPathFile )
	dim oStream, sFile

	set oStream = Server.CreateObject("ADODB.Stream")
	oStream.Open
	oStream.Type = 1
	oStream.LoadFromFile cPathFile
	sFile = oStream.Read
	set oStream = nothing

	GetFileStream = sFile
end function

function RefineFileName( c )
	c = Replace( c, "/", "" )
	c = Replace( c, "?", "" )
	c = Replace( c, "*", "" )
	c = Replace( c, "&gt;", "]" )
	c = Replace( c, "&lt;", "[" )
	c = Replace( c, "|", "-" )
	c = Replace( c, ":", "-" )
	
	RefineFileName = c
end function
%&gt;
</code></pre>]]></description><dc:date>Sat, 15 Nov 2014 00:00:00 +0900</dc:date></item><item><title>[Classic ASP] 난수만들기 (36진수 이용)</title><link>http://www.wdev.co.kr/atl/view.asp?a_id=7</link><description><![CDATA[랜덤키를 만들어야 하는 경우에 이용가능하다.<br /><br />랜덤으로 만들어진 값을 숫자(0~9)와 알파벳으로 표현하는 36진수로 변환 하여 랜덤키를 만듭니다.<br /><br /><br /><br />
<pre><code class="VBScript">&lt;%
response.write KeyGen32()&amp;".txt"

function KeyGen32()
	dim iRnd, Response
	dim cRnd, i
	Randomize

	cRnd = ""
	for i = 1 to 8
		iRnd = Int(( 999999 - 1 + 1) * Rnd + 1)  '=== 6 digits
		cRnd = cRnd &amp; Dec6to36( FillZero(iRnd,6) )
	next
	KeyGen32 = cRnd
end function
<br />
function Dec6to36(num)
	dim d1,d2,d3,d4,r1,r2

	d1 = Int( num / 46656 )
		r1 = ( num mod 46656 )
	d2 = Int( r1 / 1296 )
		r2 = ( r1 mod 1296 )
	d3 = Int( r2 / 36 )
	d4 = ( r2 mod 36 )

	Dec6to36 = Convert10to36(d1) &amp; Convert10to36(d2) &amp; Convert10to36(d3) &amp; Convert10to36(d4)
end function<br /><br />'== 10진수를 36진수로 변환
function Convert10to36( i )
	if ( i &lt; 10 ) then
		Convert10to36 = i
	else
		Convert10to36 = chr(55+i)
	end if
end function

function FillZero( cString, iLength )
	FillZero = FillString( cString, iLength, "0" )
end function

function FillString( cString, iLength, cFillString )
	if( iLength &gt;Len(cString) ) then
		FillString = ( String( iLength -Len( cString ), cFillString ) &amp; cString )
	else
		FillString = cString
	end if
end function
%&gt;

</code></pre>]]></description><dc:date>Thu, 8 May 2014 00:00:00 +0900</dc:date></item><item><title>MS-SQL  다이어그램 생성과 저장하기</title><link>http://www.wdev.co.kr/atl/view.asp?a_id=6</link><description><![CDATA[MSSQL의 다이어그램은 복잡한 디자인을 한 곳에서 통합 관리 할 수 있어 별도의 ERD가 사실 필요가 없다<br />각 컬럼에 대한 설명도 추가할 수 있고 필자가 소개한 sp_GetTableDescription 을 이용하면 다큐멘트 작성시도 상당한 시간 절약을 할 수 있다.<br /><br /><strong>다이어그램 생성하기</strong><br /><br />SSMS에서 작업할 데이타베이스를 선택하고 첫번쨰 항목인 데이타베이스 다이어그램에서 팝업메뉴(마우스우측 버튼 클릭시 나오는)에서 "새 데이타베이스 다이어그램"을 선택한다.<br /><br /><img title="0001()" src="http://www.wdev.co.kr/images_atl/000/000/000/000000000006/000000000006-0001.jpg" alt="0001()" width="455" height="183" /><br /><br />처음 생성하게되면 해당 데이타베이스에 테이블이 존재하는 경우 테이블 정보를 포함 할 것인지를 물어보는 다이얼러그가 나오는데 원하는 테이블이 있으면 선택한다.<br /><br /><strong>컬럼설명 추가</strong><br /><br />기본 보기에서는 테이블 설명이 나오지 않아 편집을 할 수 없다, &nbsp;테이블의 팝업 메뉴에서 "테이블뷰"를 선택하고 "사용자 지정 수정"을 선택한다.<br /><img title="0002()" src="http://www.wdev.co.kr/images_atl/000/000/000/000000000006/000000000006-0002.jpg" alt="0002()" width="584" height="402" /><br /><br />선택화면에서 "설명"을 선택하고 "&gt;" 버튼을 눌러 오른쪽 목록에 추가 한 후 "확인"을 누른다.<br /><img title="0003()" src="http://www.wdev.co.kr/images_atl/000/000/000/000000000006/000000000006-0003.jpg" alt="0003()" width="473" height="269" /><br /><br />다시 테이블의 팝업메뉴에서 "테이불뷰"를 "사용자 지정"으로 선택한다.<br /><img title="0004()" src="http://www.wdev.co.kr/images_atl/000/000/000/000000000006/000000000006-0004.jpg" alt="0004()" width="495" height="411" /><br />이제 설명부분이 추가 되었다.<br /><img title="0005()" src="http://www.wdev.co.kr/images_atl/000/000/000/000000000006/000000000006-0005.jpg" alt="0005()" width="278" height="98" /><br /><br /><br /><strong>다이어그램 저장</strong><br /><br />SSMS에선 기본설정이 테이블 수정(alter table)에 대한 것이 적용되지 않토록 막혀있다. 해당 옵션을 해제해주어야만 수정 내용의 저장이 가능 하다.<br /><br />메뉴 "도구"에서 "옵션"을 선택한다.<br /><img title="0006()" src="http://www.wdev.co.kr/images_atl/000/000/000/000000000006/000000000006-0006.jpg" alt="0006()" width="197" height="108" /><br /><br />옵션 창에서 "디자이너"의 "테이블을 다시 만들어야 하는 변경 내용 저장 안함"을 해제 한다.<br /><img title="0007()" src="http://www.wdev.co.kr/images_atl/000/000/000/000000000006/000000000006-0007.jpg" alt="0007()" width="600" height="301" /><br /><br /><br />]]></description><dc:date>Tue, 6 May 2014 00:00:00 +0900</dc:date></item><item><title>[MS-SQL] MS-SQL 2008 Express 설치</title><link>http://www.wdev.co.kr/atl/view.asp?a_id=5</link><description><![CDATA[마이크로소프트의 DBMS인 MS-SQL은 현재 2014버전이 나왔지만 8플랫폼에 설치해야하기 때문에 7이나 server 2008이하에서 2008을 설치 해야 한다.<br /><br />Express는 Oracle의 mysql처럼 사용자에게 무료로 제공되는 버전이다. 다만 파일 사이즈가 최대 4G를 넘지 못하는 점이 있어 대형DB나 웨어하우징에는 사용하기 어렵다. 하지만 개발 시 사용하거나 웹서버에서 사용하기에는 부족함이 없다, (개발단계에서 4G가 넘는 파일은 사용하는 경우는 웨어하우징 정도일듯 한데, 이런 경우는 개발 자원 자체가 데스크탑 수준 이상으로 필요하기 떄문에 컨텐트를 DB로 처리하는 경우를 제외하고 거의 처리 된다고 볼 수 있다)<br /><br />소규모 개발 혹은 단일노드 개발에서도&nbsp;Office의 Access를 사용하기보다는 Express를 사용하는 것을 추천한다.<br /><br /><strong>마이크로소프사의 다운로드 사이트</strong><br /><a href="http://www.microsoft.com/ko-kr/download/details.aspx?id=22973">http://www.microsoft.com/ko-kr/download/details.aspx?id=22973<br /></a><a href="http://www.microsoft.com/ko-kr/download/details.aspx?id=22973"><img title="0001()" src="http://www.wdev.co.kr/images_atl/000/000/000/000000000005/000000000005-0001.jpg" alt="0001()" width="600" height="509" /><br /><br /></a><br /><img title="0002(32비트와 64비트에 따른 다운로드 선택)" src="http://www.wdev.co.kr/images_atl/000/000/000/000000000005/000000000005-0002.jpg" alt="0002(32비트와 64비트에 따른 다운로드 선택)" width="600" height="236" /><br />x86, x64버전 중 OS에 맞는것을 다운로드하여 설치하면 된다.&nbsp;(IA64 시스템에서 지원되지 않는다.)<br /><br /><br />1. 설치 전 OS의 모든 업데이트는 필수 이다.<br />2. .Net Framework을 필요로 하는데 3.5 SP1 이상이 필요하다.<br />&nbsp; &nbsp;(<a href="http://www.microsoft.com/ko-kr/download/details.aspx?id=22">http://www.microsoft.com/ko-kr/download/details.aspx?id=22</a>)<br />3. Windows Installer 4.5 설치<br />&nbsp; &nbsp;(<a href="http://support.microsoft.com/kb/942288">http://support.microsoft.com/kb/942288</a>)<br />4. Power Shell 설치<br />&nbsp; (<a href="http://technet.microsoft.com/ko-kr/windowsserver/bb512919.aspx">http://technet.microsoft.com/ko-kr/windowsserver/bb512919.aspx</a>)<br /><br />OS 업데이트만 완료하고 설치를 진행하여도 필요한 소프웨어를 추가 자동설치 하거나, 메세지가 나올 떄 처리하여도 무방하다. (OS에 따라 미리설치하여야 하는 경우도 있기 때문에 위의 2,3,4, 소프트웨어를 미리 설치)<br /><a href="http://www.microsoft.com/ko-kr/download/details.aspx?id=22973"><br /></a>]]></description><dc:date>Sat, 3 May 2014 00:00:00 +0900</dc:date></item><item><title>[MS-SQL] 테이블 컬럼 설명과 함께 보기 - GetTableDescription()</title><link>http://www.wdev.co.kr/atl/view.asp?a_id=4</link><description><![CDATA[MS-SQL을 즐겨쓰는 가장 큰 이유 중 하나가 바로 다이어그램이다.<br />별도의 적용 없이 DB에 바로 적용이 가능하다는 점이 여러모로 시간을 허비하지 않아서인것 같다.<br />다이어그램의 테이블에 커스텀모드로 하면 각 컬럼의 설명을 추가 할 수 있다.<br /><br /><img title="0002(MS-SQL 다이아그램 화면)" src="http://www.wdev.co.kr/images_atl/000/000/000/000000000004/000000000004-0002.jpg" alt="0002(MS-SQL 다이아그램 화면)" width="447" height="238" /><br />프로젝트의 결과물을 만들때 문서 두께의 상당부분을 차지하는게 DB(Table)명세서 인데, 이것의 작성 시 DB에 존재하는 다이어그램에서 결과물을 만들 수 있으면 시간 절약이 많이 될듯하여 만들었던 SP 이다.<br /><br />sp_help의 "컬럼설명" 추가 버전이라고 봐도 무방 할것 같다.<br /><br />처음 작성시는 2000을 기준으로 만들어 졌으나 2008에서는 시스템 테이블 부분이 바뀌어서 2008에 맞게 프로그램을 수정 했다.<br /><br /><br />
<p><strong>syntax: sp_GetTableDescription [테이블명]</strong><br /> <br /> * 테이블명 : 설명을 보고자 하는 테이블명, 생략하는 경우 db내의 모든 테이블의 내용이 테이블, 컬럼순서 순으로 나오게 된다<br />* 테이블명이 생략되면 현재 사용 DB의 전체 테이블 컬럼이 나온다.(문서 작성시 유용)<br /><br /><br /></p>
<br /><img title="0001(실행화면)" src="http://www.wdev.co.kr/images_atl/000/000/000/000000000004/000000000004-0001.jpg" alt="0001(실행화면)" width="397" height="247" /><br /><br /><br />
<pre><code class="SQL">/*
Prog. by:  IKK, Dec-2008
http://www.wdev.co.kr

 update: Jun-2009
   = debug null description
   = except 'sysname' type

 update: Apr-2012
   = for SQL2008 (change system tables)
 
*/
 
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[sp_GetTableDescription]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[sp_GetTableDescription]
GO
 
SET QUOTED_IDENTIFIER ON 
GO

SET ANSI_NULLS ON 
GO

CREATE PROCEDURE sp_GetTableDescription
 @TableName varchar(255) = null
AS
set nocount on
if @TableName is NULL
begin
 select c.id, c.colid as No,
  o.name as TableName,
  c.name as ColumeName,
  t.name as type,
  c.length,
  c.colstat as Identy,
  c.isnullable,
  description = Convert(sql_variant,'')
  into #GTD
  from sys.syscolumns c, sys.sysobjects o, sys.systypes t
  where c.id=o.id and c.xtype=t.xtype and o.Type='U'  and not t.name='sysname'
 
 update #GTD set description=p.value  from #GTD a, sys.extended_properties p where a.id=p.major_id and a.no=p.minor_id and p.name = 'MS_Description'  

 select TableName, no, ColumeName, type, length, Identy, 
 [null] = case isnullable when 1 then 'not NULL' else 'NULL' end,  description
 from #GTD order by id, no

end

else

begin
 select c.id, c.colid as No,
  o.name as TableName,
  c.name as ColumeName,
  t.name as type,
  c.length,
  c.colstat as Identy,
  c.isnullable,
  description = Convert(sql_variant,'')
  into #GTD2
  from sys.syscolumns c, sys.sysobjects o, sys.systypes t
  where c.id=o.id and c.xtype=t.xtype and not t.name='sysname' and o.Name = @TableName

update #GTD2 set description=p.value  from #GTD2 a, sys.extended_properties p where a.id=p.major_id and a.no=p.minor_id and p.name = 'MS_Description'  

select no, ColumeName, type, length, Identy,
 [null] = case isnullable when 0 then 'not NULL' else 'NULL' end,  description
  from #GTD2 order by no
end
 
return(0)
 
SET QUOTED_IDENTIFIER OFF 
go
 
SET ANSI_NULLS ON 
go
</code></pre>
<br /><span style="color: #ff0000;">****</span><br /><span style="color: #ff0000;">&nbsp;실 서버에선 SQL-injection에서 테이블 정보가 상세하게 노출될 위험이 있으니, 되도록 개발 서버쪽에서만 사용하는 것을 추천 함</span>]]></description><dc:date>Fri, 2 May 2014 00:00:00 +0900</dc:date></item><item><title>[Classic ASP] 날짜,시간 처리 함수들</title><link>http://www.wdev.co.kr/atl/view.asp?a_id=3</link><description><![CDATA[<img title="0001()" src="http://www.wdev.co.kr/images_atl/000/000/000/000000000003/000000000003-0001.jpg" alt="0001()" width="452" height="388" /><br /><br />그 동안 만들어 사용하던 날짜,시간 관련 함수들을 모아 봤다.<br /><br />ASP에선 날짜/시간을 출력하는 경우 시스템의 날짜형식으로 출력이 된다.<br />적합한 모양으로 바꾸어 출력 되도록 하는것들이 대부분 함수들이다.<br /><br />모아보니 함수들이 많은것 같은데 필요할 때마다 추가한것이라 한번씩은 용도가 있었던것이라 참고 하시거나 사용안할듯 한것들은 제거 하여 재구성하여 사용 하길 추천 한다.<br /><br /><strong>GetFullDateTimeH(),&nbsp;GetFullDateH()</strong> : 구분자를 "-"로 출력 한다.<br />&nbsp;** in-line query 로 DB에 저장하는 경우 이 형식으로 날짜를 표현해야 한다.<br /><br /><strong><strong>GetFullDateTimeON()</strong>&nbsp;: 날짜/시간의 숫자 값만 출력한다.<br />&nbsp;** 임시파일의 파일명 생성시 4~6자리의 랜덤 값과 사용하면 중복을 쉽게 피할 수 있다.<br /><br />GetMonthLastDate()</strong> : 해당월의 마지막일자를 구한다.<br />&nbsp;** 기간 설정 시 유용 하다.<br /><br /><strong>CDateWithCheck()</strong>&nbsp;: 변수가 유효한 날짜로 변경이 가능한 경우에만 변경된다.<br />&nbsp;** 날짜 형식은 javascript에서 유효성을 확인 하지만 실제 데이타 처리시에도 반드시 확인 하길 추천 한다.<br /><br /><strong>Date연산 함수들</strong> : 자주 사용되는 연산 규칙들을 함수로 구성 했다.<br /><br /><strong>UNIX Time :&nbsp;</strong>초단위로 출력되는 숫자로 경과시간을 초단위로 나타낼 때 유효하다<br />&nbsp;** 경과 시간 구하기<br />&nbsp; &nbsp;iPastSecond =&nbsp;DateTime2UnixTime( dEnd ) -&nbsp;DateTime2UnixTime( dStart )<br /><br /><br />
<pre><code class="VBScript">'============================================
'  DateTime functions
'============================================
function GetFullDateTime( dNow )
	GetFullDateTime = Year(dNow)&amp;"."&amp;FillZero(Month(dNow),2)&amp;"."&amp;FillZero(Day(dNow),2) &amp;" "&amp; FillZero(Hour(dNow),2)&amp;":"&amp;FillZero(Minute(dNow),2)&amp;":"&amp;FillZero(Second(dNow),2)
	end Function
function GetFullDateTimeT( dNow )
	GetFullDateTimeT = Year(dNow)&amp;"-"&amp;FillZero(Month(dNow),2)&amp;"-"&amp;FillZero(Day(dNow),2) &amp;"T"&amp; FillZero(Hour(dNow),2)&amp;":"&amp;FillZero(Minute(dNow),2)&amp;":"&amp;FillZero(Second(dNow),2)
	end Function
function GetFullDateTimeH( dNow )
	GetFullDateTimeH = Year(dNow)&amp;"-"&amp;FillZero(Month(dNow),2)&amp;"-"&amp;FillZero(Day(dNow),2) &amp;" "&amp; FillZero(Hour(dNow),2)&amp;":"&amp;FillZero(Minute(dNow),2)&amp;":"&amp;FillZero(Second(dNow),2)
	end Function
function GetFullDateTimeKor( dNow )
	GetFullDateTimeKor = Year(dNow)&amp;"년 "&amp;Month(dNow)&amp;"월 "&amp;Day(dNow)&amp;"일 ("&amp; WeekDayName(Weekday(dNow), True)&amp;") "&amp; FillZero(Hour(dNow),2)&amp;":"&amp;FillZero(Minute(dNow),2)&amp;":"&amp;FillZero(Second(dNow),2)
	end Function
	
function GetFullDate( dNow )
	GetFullDate = Year(dNow)&amp;"."&amp;FillZero(Month(dNow),2)&amp;"."&amp;FillZero(Day(dNow),2)
	end Function
function GetFullDateH( dNow )
	GetFullDateH = Year(dNow)&amp;"-"&amp;FillZero(Month(dNow),2)&amp;"-"&amp;FillZero(Day(dNow),2)
	end Function
function GetFullDateKor( dNow )
	GetFullDateKor = Year(dNow)&amp;"년 "&amp;Month(dNow)&amp;"월 "&amp;Day(dNow)&amp;"일"
	end Function

'===== only numeric
function GetFullDateTimeON( dNow )
	GetFullDateTimeON = Year(dNow) &amp; FillZero(Month(dNow),2) &amp; FillZero(Day(dNow),2) &amp; FillZero(Hour(dNow),2) &amp; FillZero(Minute(dNow),2) &amp; FillZero(Second(dNow),2)
	end Function
function GetFullDateTimeONHM( dNow )
	GetFullDateTimeONHM = Year(dNow) &amp; FillZero(Month(dNow),2) &amp; FillZero(Day(dNow),2) &amp; FillZero(Hour(dNow),2) &amp; FillZero(Minute(dNow),2)
	end Function
function GetTime( dNow )
	GetTime = FillZero(Hour(dNow),2) &amp;":"&amp; FillZero(Minute(dNow),2) &amp;":"&amp; FillZero(Second(dNow),2)
	end function
function GetTimeON( dNow )
	GetTimeON = FillZero(Hour(dNow),2) &amp; FillZero(Minute(dNow),2) &amp; FillZero(Second(dNow),2)
	end function
	
function GetFullDateON( dNow )
	GetFullDateON = Year(dNow) &amp; FillZero(Month(dNow),2) &amp; FillZero(Day(dNow),2)
	end Function
function GetFullDateON6( dNow )
	GetFullDateON6 = Right(Year(dNow),2) &amp; FillZero(Month(dNow),2) &amp; FillZero(Day(dNow),2)
	end Function

function ONDateTime2DateTime( cDateTime14 )
	ONDateTime2DateTime = ONDate2DateTime(Mid(cDateTime14,1,8))&amp;" "&amp;ONTime2DateTime(Mid(cDateTime14,9,6))
	end function

function ONDate2DateTime( cDate8 )
	dim cReturn
	if (cDate8="") or ISNull(cDate8) then
		cReturn = ""
	else
		cReturn = Mid(cDate8,1,4) &amp;"-"&amp; Mid(cDate8,5,2) &amp;"-"&amp; Mid(cDate8,7,2)
	end if
	ONDate2DateTime = cReturn
end function

function ONTime2DateTime( cTime6 )
	dim cReturn
	if (cTime6="") or ISNull(cTime6) then
		cReturn = ""
	else
		cReturn = Mid(cTime6,1,2) &amp;":"&amp; Mid(cTime6,3,2) &amp;":"&amp; Mid(cTime6,5,2)
	end if
	ONTime2DateTime = cReturn
end function

function GetYearMonth( dNow )
	GetYearMonth = FillZero(Year(dNow),4)&amp;"/"&amp; FillZero(Month(dNow),2)
end Function

function GetMonthDay( dNow )
	GetMonthDay = FillZero(Month(dNow),2)&amp;"/"&amp; FillZero(Day(dNow),2)
end Function

function GetHourMinute( dNow )
	if IsNull(dNow) then
		GetHourMinute = ""
	else
		GetHourMinute = FillZero(Hour(dNow),2)&amp;":"&amp; FillZero(Minute(dNow),2)
	end if
end Function

function GetHourMinuteSecond( dNow )
	if IsNull(dNow) then
		GetHourMinuteSecond = ""
	else
		GetHourMinuteSecond = FillZero(Hour(dNow),2)&amp;":"&amp; FillZero(Minute(dNow),2)&amp;":"&amp; FillZero(Second(dNow),2)
	end if
end function


function CDateWithCheck( cDate8 )
	dim cDate10
	cDate10 = ONDate2DateTime(cDate8)
	if IsDate( cDate10 ) then
		CDateWithCheck = CDate( cDate10 )
	else
		CDateWithCheck = null
	end if
end function

function CDateWithCheck10( cDate10 )
	if IsDate( cDate10 ) then
		CDateWithCheck10 = CDate( cDate10 )
	else
		CDateWithCheck10 = null
	end if
end function

function CheckDateTime( cDate8 )
	CheckDateTime = IsDate( ONDate2DateTime(cDate8) )
end function

function CheckDateTimeNull( cDate8 )
	CheckDateTimeNull = (IsDate( ONDate2DateTime(cDate8) ) or IsNull(cDate8))
end function

function GetMonthLastDate( iYear, iMonth )
	dim cNextMonthFistDate
	
	if (iMonth=12) then
		cNextMonthFistDate=FillZero((iYear+1),4)&amp;"0101"
	else
		cNextMonthFistDate=FillZero(iYear,4)&amp;FillZero((iMonth+1),2)&amp;"01"
	end if
	GetMonthLastDate = GetFullDateON(CDateWithCheck(cNextMonthFistDate)-1)&amp;" 23:59:59"
end function

function GetMonthLastDay( iYear, iMonth )
	dim cNextMonthFistDate
	
	if (iMonth=12) then
		cNextMonthFistDate=FillZero((iYear+1),4)&amp;"-01-01"
	else
		cNextMonthFistDate=FillZero(iYear,4)&amp;"-"&amp;FillZero((iMonth+1),2)&amp;"-01"
	end if
	
	GetMonthLastDay = Day(CDate(cNextMonthFistDate)-1)
end function

function CmpStartEndMonth( iStartYear, iStartMonth, iEndYear, iEndMonth )
	dim iCmpStartDate, iCmpEndDate
	iCmpStartDate = CintZero(FillZero(iStartYear,4)&amp;FillZero(iStartMonth,2))
	iCmpEndDate   = CIntZero(FillZero(iEndYear,4)&amp;FillZero(iEndMonth,2))
	
	CmpStartEndMonth = CBool(iCmpStartDate &gt; iCmpEndDate)
end function

'== Date add functions
function YearMonthAddMonthGetYear( iYear, iMonth, iAddMonth )
	YearMonthAddMonthGetYear = Year(YearMonthAddMonth( iYear, iMonth, iAddMonth ))
	end function
function YearMonthAddMonthGetMonth( iYear, iMonth, iAddMonth )
	YearMonthAddMonthGetMonth = Month(YearMonthAddMonth( iYear, iMonth, iAddMonth ))
	end function
function YearMonthAddMonth( iYear, iMonth, iAddMonth )
	YearMonthAddMonth = DateAdd( "m", iAddMonth, CDate(FillZero(iYear,4)&amp;"-"&amp;FillZero(iMonth,2)&amp;"-01") )
	end function
function AddMonthGetMonth( dDate, iMonth )
	AddMonthGetMonth = Month(AddMonth( dDate, iMonth ))
	end function
function AddMonthGetYear( dDate, iMonth )
	AddMonthGetYear = Year(AddMonth( dDate, iMonth ))
	end function
function AddMonth( dDate, iMonth )
	AddMonth = DateAdd( "m", iMonth, dDate )
	end function
	
'== UNIX Time
function DateTime2UnixTime( dDateTime )
	DateTime2UnixTime = DateDiff( "s", "01/01/1970 00:00:00", dDateTime )
end function

function UnixTime2DateTime( iUnixTime )
	UnixTime2DateTime = DateAdd( "s", iUnixTime, "01/01/1970 00:00:00" )
end function

function MonthNameEng( iMonth )
	dim cReturn
	
	select case iMonth
	case  1 cReturn = "January"
	case  2 cReturn = "February"
	case  3 cReturn = "March"
	case  4 cReturn = "April"
	case  5 cReturn = "May"
	case  6 cReturn = "June"
	case  7 cReturn = "July"
	case  8 cReturn = "August"
	case  9 cReturn = "September"
	case 10 cReturn = "October"
	case 11 cReturn = "November"
	case 12 cReturn = "December"
	end select
	
	MonthNameEng = cReturn
end function

</code></pre>]]></description><dc:date>Thu, 1 May 2014 00:00:00 +0900</dc:date></item><item><title>[Classic ASP] 문자 채우기, 자르기(한글) 함수</title><link>http://www.wdev.co.kr/atl/view.asp?a_id=2</link><description><![CDATA[<p><strong><img title="0001()" src="http://www.wdev.co.kr/images_atl/000/000/000/000000000002/000000000002-0001.jpg" alt="0001()" width="498" height="374" /><br /><br />문자 채우기</strong><br /><br />문자(숫자)를 출력하면서 특정문자를 결합하는 경우에 사용한다<br />&nbsp;- 숫자 "1"을 네자리의 Numneric(빈자리가 "0"로 채워진) 4자리로 변환 하는 경우<br />&nbsp; &nbsp;1 =&gt; "0001"<br />&nbsp;- 좌우측으로 여백문자처리의 경우<br /><br /><strong>&nbsp;&bull;&nbsp;FillString()</strong> : 특정문자 채우기<br /><strong><strong>&nbsp;&bull;&nbsp;</strong>FillZero()</strong> : "0" 문자 채우기<br /><strong><strong>&nbsp;&bull;&nbsp;</strong>FillSpace()</strong> : 스페이스 채우기<br /><br /><strong>문자 자르기</strong><br /><br />mid() 함수를 이용하여 문자를 자르는 경우 2byte 문자도 자릿수에 상관 없이 1문자로 처리되기 떄문에 의도한 것보다 길게 나오는 경우가 많은데 2byte 문자를 감안하여 해당 자릿수에서 문자를 잘라 반환 한다<br />&nbsp;- 게시판의 제목 등 길어질 수 있는 내용을 좁은 구역에 출력시 유효<br />&nbsp;- 지정길이보다 긴 경우 +More 사용<br /><br /><strong><strong>&nbsp;&bull;&nbsp;</strong>HLeftB()</strong> : 2byte 문자 자르기<br /><strong><strong>&nbsp;&bull;&nbsp;</strong>HLeftBMore()</strong> :&nbsp;2byte 문자 자른 후 길이가 넘는 경우 "&hellip;" 문자 추가<br /><br /></p>
<pre><code class="VBScript">&lt;%
'===============================================
' &gt;&gt; Fill Stuff functions
'
'  FillZero( cString, iLength )
'  FillSpace( cString, iLength )
'  FillString( cString, iLength, cFillString )
'
'===============================================

function FillZero( cString, iLength )
	FillZero = FillString( cString, iLength, "0" )
end function

function FillSpace( cString, iLength )
	FillSpace = FillString( cString, iLength, " " )
end function

function FillSpaceRight( cString, iLength )
	FillSpaceRight = FillStringRight( cString, iLength, " " )
end function

function FillString( cString, iLength, cFillString )
	if( iLength &gt;Len(cString) ) then
		FillString = ( String( iLength -Len( cString ), cFillString ) &amp; cString )
	else
		FillString = cString
	end if
end function

function FillStringRight( cString, iLength, cFillString )
	if( iLength &gt;Len(cString) ) then
		FillStringRight = ( cString &amp; String( iLength -Len( cString ), cFillString ) )
	else
		FillStringRight = cString
	end if
end function

function HLeftB( cString, iLen ) 
	dim i, c, a, b
	dim cReturn
	
	b = 0
	cReturn = ""
	
	if not IsNull(cString) then
		for i = 1 to Len(cString)
			c = mid(cString,i,1)
			a = asc(c)
			cReturn = cReturn&amp;c
			
			if (a&gt;255 or a&lt;0) then
				b = b+2
			else
				b = b+1
			end if
			
			if (iLen=&lt;b) then
				exit for
			end if
		next
	end if
		
	HLeftB = cReturn
end function

function HLeftBMore( cString, iLen ) 
	dim c
	
	c = HLeftB( cString, iLen ) 
	if (cString&gt;c) then
		c = c &amp;"&hellip;"
	end if
	
	HLeftBMore = c
end function
%&gt;
</code></pre>]]></description><dc:date>Wed, 30 Apr 2014 00:00:00 +0900</dc:date></item><item><title>ASP (Active Server Pages)</title><link>http://www.wdev.co.kr/atl/view.asp?a_id=1</link><description><![CDATA[<img title="0001()" src="http://www.wdev.co.kr/images_atl/000/000/000/000000000001/000000000001-0001.jpg" alt="0001()" width="300" height="225" /><br /><br />ASP는 Microsoft에서 만든 대화형 웹사이트를 만들기 위한 플랫폼입니다. 현재는 ASP.NET을 주로 사용 하다보니 예전의 ASP를 "Classic ASP"로 부르기도 한다.<br /><span data-mce-mark="1"><br />스크립트로는 VBScript와 JScript를 지원합니다. 주로 VBScript를 사용 한다.<br /></span>(예전 Adobe사의 DRM서버는&nbsp;JScript로 만들어진 경우는 보았지만, 대게는 VB를 주로 사용)<br /><br />
<div>본인이 처음 사용한것은 1997년 HTS시스템의 웹부분을 맏으면서 처음 사용했었는데, 이전에 CGI 방식에 비해 여 개발 난이도가 쉬운 편으로 이후 많이 사용 될것이 예상 됬다.<br /><br />1.0(1996년), 2.0버전(1997년)과 3.0버전(2000년)이 있는데 크게 &nbsp;차이는 없고, 3.0에선 주로 성능향상을 위한 최적화가 이루어 졌다<br /><br />현재 IIS7,8에서도 지원이 되고 있다. 다만 ,NET이 기본 설치되고 사용 설정이 필요하다.<br /><br />java/JSP의 인기와 .NET으로 대체등으로 사용하는 곳이 많이 줄었고 계속 줄어 들고 있는 상황이지만 아직 유지하고 있거나 다른 플랫폼과 혼합하여 사용하는 경우도 있다<br /><br />##<br /><br />아직 사용하는 분들을 위해 몇가지 팁 정도를 글로 &nbsp;게시할 계획 입니다.<br /><br /><br /></div>]]></description><dc:date>Wed, 30 Apr 2014 00:00:00 +0900</dc:date></item></channel></rss>
