달력

5

« 2024/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

'Elick의 낙서'에 해당되는 글 116

  1. 2009.02.17 MSSQL backup policy 실제 구현
  2. 2009.02.17 Windows cmd script 2
  3. 2009.02.11 MSSQL File 정보
  4. 2009.02.09 Windows cmd script 1
  5. 2009.01.29 MSSQL 계정 password 유실
  6. 2009.01.29 MSSQL Database 분리
  7. 2009.01.29 MSSSQL TechNet
  8. 2009.01.29 CTE ( Common Table Expression ) 설명
2009. 2. 17. 11:06

MSSQL backup policy 실제 구현 Work/SQL Server2009. 2. 17. 11:06

<개념>
First backup  : local의 storage 혹은 disk
Second backup : remote server의 storage 혹은 disk
Third backup : tape

활용성 및 실제 환경상 third backup은 생략하는 수가 많다. 아래의 내용도 third backup은 생략하는 것을 전제로 한다.

<전제 환경>
Backup 해야 할 MSSQL server가 2개 이상이다.
Second backup 이 실행될 곳과 통신이 가능해야 한다.

<고려사항>
각 MSSQL server들의 first backup 시간을 가능한 같게 만든다.
각 MSSQL server들의 first backup 경로를 가능한 같게 만든다.
    ex )
    [Disk drive]:\DB_Backup\Full\<database name>
    [Disk drive]:\DB_Backup\Inc\<database name>
    [Disk drive]:\DB_Backup\Log\<database name>
First backup의 보관 주기는 기본 2주. 공간이 허락치 않는다면 적절히 보관한다. 최소 1주치는 보관한다.
    ex )
    Full : 1주일에 한번 (일)
    Inc : 1일에 한번 (월, 화, 수, 목, 금, 토)
    Log : 1시간에 한번 (매일)
Second backup의 보관 주기는 기본 한달. 공간이 허락치 않는다면 적절히 보관.(최소 1주치는 보관)
Backup의 구성은 MSSQL에서 기본으로 제공하는 유지 관리 계획의 일부로 구성한다.
유지 관리 정리 작업(old backup remove) 은 각 backup(Full, Inc, Log)이 완료된 직후에 한다.
기록정리 작업은 log backup 후 유지관리 정리 작업이 완료된 직후에 한다. 보관 주기 동안의 기록만 유지하도록 한다.

<구성 방법>
MSSQL Server들 중 마지막 first backup이 끝나는 시점 이후 second backup 이 될 server에서 일괄적으로 backup file을 복사하는 동기식 구성 방법, 각각의 MSSQL Server들이 first backup이 끝나면 second backup으로 바로 넘어가는 비동기식 구성 방법이 있을 수 있다. (동기식, 비동기식은 그냥 편의상 붙인 말이니까... 용어에 너무 민감하게 반응하지 말자.)

장단점은 각각 있을 수 있다고 생각되지만, 개인적으로는 후자가 더 나을 거 같다.
:
Posted by Elick
2009. 2. 17. 10:00

Windows cmd script 2 Work/Etc2009. 2. 17. 10:00

사실.. 나는
스크린에 빈줄을 디스플레이하려면 ECHO 명령어 다음에 마침표(.)를 입력한다. 만약 ECHO와 마침표 사이에 스페이스가 있는 경우에는 화면에 마침표(.)를 디스플레이하므로, 빈줄을 디스플레이하려면 둘 사이에 스페이스를 두지 않아야 한다.
이부분 만 필요했다.

하지만, 친절한 설명에 감동했으므로 퍼왔다. ^^

-----------------------------------------------------------------------
출처 : http://blog.naver.com/saber/140001927893


배치 파일 명령어

배치 프로그램이란 MS-DOS에서 실행 가능한 명령어를 순차적으로 처리하기 위하여 MS-DOS 명령어를 모아놓은 아스키 파일로, 일반적으로 BAT 확장명을 갖는다. 배치 프로그램은 흔히 배치 파일이라고도 한다.

배치 파일에서 사용할 수 있는 명령어는 MS-DOS에서 사용할 수 있는 모든 내부 외부 명령어, 배치 파일 전용 명령어로 구분된다. 배치 파일 전용 명령어란 프롬프트 상에서는 사용할 수 없고 배치 파일에서만 사용할 수 있는 명령어를 의미한다. 배치 파일에서는 BREAK, REM, SET 등 프롬프트 혹은 CONFIG.SYS 파일에서도 사용할 수 있는 공용 명령어와 2개의 특수 문자(@, ;)를 사용할 수 있다.

다음은 MS-DOS에서 사용되는 배치 프로그램 전용 명령어이다.

Call Choice Echo

For Goto If

Pause Rem Shift

SET 명령어는 프롬프트 상에서도 사용할 수 있는 명령어지만 주로 배치 프로그램에서 많이 사용되기 때문에 "프롬프트 명령어"에 포함하지 않고, 배치 파일 명령어에서 설명하기로 한다. 또한, REM 명령어도 CONFIG.SYS에서도 사용할 수 있는 명령어이지만 배치 파일 명령어에서 설명하기로 한다.

CALL

배치 프로그램에서는 COM이나 EXE 확장자를 가진 실행 파일은 해당 파일 이름을 입력함으로써 실행시킬 수 있다. 그러나 배치 프로그램은 이러한 방법을 사용하여 실행할 수 없다. 따라서 MS-DOS에서는 배치 프로그램을 실행하는 도중에 다른 배치 프로그램을 실행하기 위한 특별한 명령어를 준비하고 있다. 배치 프로그램에서 다른 배치 프로그램을 호출하기 위하여 사용되는 명령어는 CALL로써, 해당 배치 프로그램을 종료하지 않고 다른 배치 프로그램을 실행하기 위하여 사용한다.

배치 프로그램 안에서 다른 배치 프로그램을 호출할 경우에는 반드시 BAT 확장자를 생략하여야 한다. 즉, 배치 프로그램 안에서 실행 파일을 실행하기 위해서는 실행 프로그램의 이름만 입력하거나 확장자를 포함할 수 있었지만 배치 프로그램에서는 반드시 호출할 배치 프로그램의 파일 이름만 지정하여야 하는 것이다.

■ 사용법

CALL [[drive :][path]] filename[batch-para]

■ 옵션 및 매개변수

[drive:][path] filename 실행할 배치 파일의 경로와 이름을 지정한다. CALL 명령어를 사용하여 실행할 배치 파일은 반드시 BAT 확장자를 갖는 파일이어야 한다.

batch-para 배치 파일을 실행하기 위한 모든 변수를 지정한다. 지정할 수 있는 변수는 매개변수와 옵션을 포함한다.

■ 사용상 주의

☞ batch-para 사용하기

batch-para는 배치 파일에 전달할 수 있는 모든 정보를 포함할 수 있는데, 여기에는 옵션과 파일명, 그리고 %1∼%9까지의 변경할 수 있는 매개변수와 %band%와 같은 변수가 포함된다.

☞ 파이프(|)와 방향 전환 기호(>)의 사용

CALL 명령어에서는 파이프(pipes: |)와 방향 전환을 위한 방향 전환 기호(redirection symbols:>, <, >>, <<)를 사용할 수 없다.

☞ 반복적인 CALL 만들기

CALL 명령어를 사용하여 자신의 배치 파일을 호출함으로써 반복적인 배치 파일을 만들 수 있다. 이 경우처럼 반복적인 배치 파일을 만드는 경우에는 반드시 해당 배치 파일을 끝낼 수 있도록 설계되어야만 한다. 그렇지 않으면 무한 루프로 되어 해당 배치 파일을 영원히 끝나지 않게 된다.

■ 사용 예

HWPCHECK.BAT 파일을 다른 배치 파일에서 실행시키고자 한다면, 해당 배치 파일에 다음을 포함시킨다.

call hwpcheck

위의 예에서 현재 실행 중인 배치 프로그램에서 2개의 매개변수를 받은 다음 이를 실행할 배치 프로그램에 전달하고자 한다면 다음과 같이 뒤에 매개변수를 할당한다.

call hwpcheck %1 %2

CHOICE

이 명령어는 GOTO 명령어를 사용하여 다중 분기문을 작성하기 위하여 사용하는 것으로, 일반적으로 다중 배치 프로그램을 작성하기 위하여 사용되는 배치 프로그램 명령어이다.

이 명령어는 배치 프로그램에서 사용자가 지정한 프롬프트 상태를 유지하고 있다가 지정된 시간이 경과되거나 지정된 문자를 지정하면 다음 명령어를 실행한다. 이 경우 CHOICE 명령어는 에러 수준 종료코드를 운영 체제에 돌려주는데, 종료 코드와 GOTO 명령어를 이용하여 작업을 세분할 수 있다.

■ 사용법

CHOICE [/C [: ]choices][ /N] [/S ][ /T[ :]c,nn] [text]

■ 옵션 및 매개변수

text 사용자가 선택하도록 기다리는 프롬프트 앞에 출력하고자 하는 문자열을 지정한다. 만약, 프롬프트 앞에 디스플레이될 문자열의 일부로 옵션 부호(/)를 사용하려면 따옴표를 사용해야 한다. 문자열을 지정하지 않는 경우에는 선택할 프롬프트만 디스플레이한다.

/c[:]choices 프 롬프트로 선택할 수 있는 문자를 지정한다. 다수의 문자를 지정하는 경우에는 콤마(.)를 분리 문자로 사용하며, 지정한 문자는 괄호안에 나타나고 물음표 다음에 디스플레이된다. /c 옵션을 지정하지 않는 경우 YN을 디폴트 값으로 사용한다. 콜론(:)은 선택적으로 생략할 수 있다.

/n 사용자가 항목을 선택하도록 대기하는 프롬프트가 디스플레이되지 않도록 지정하기 위하여 사용한다. 그러나 프롬프트 앞의 문자열은 디스플레이된다. 만약, /n 옵션을 지정하지 않으면 CHOICE 명령어 라인에 지정한 선택 문자는 유효하다.

/s 대 소문자를 구분하여 받아들이도록 지정하기 위하여 사용하는 옵션이다. 만약, /s 옵션을 지정하지 않으면 사용자가 지정한 선택 문자의 대 소문자를 구분하지 않고 모두 받아 들인다.

/t[:]c,nn 사용자가 선택 문자를 지정하지 않을 때 디폴트로 선택될 문자와 기다리는 시간을 지정한다.

c 사용자가 선택 문자를 지정하지 않을 때 디폴트로 선택될 문자를 지정하고, 이 문자는 /c 옵션에서 지정한 선택 문자 안에 있는 것이어야 한다.

nn c 값을 디폴트로 선택하기 전에 대기할 프롬프트 시간을 지정한다. 지정할 수 있는 값의 유효 범위는 0∼99 값의 범위에서 초 단위로 지정한다. 만약, 0초를 지정하면 항상 디폴트 값이 사용된다.

■ 사용상의 주의

☞ 작업을 분할하기

CHOICE 명령어는 작업을 분할하기 위하여 사용한다. 즉, CONFIG.SYS 에서는 다중 부트 분할을 만들어 사용자가 원하는 시스템 구성으로 컴퓨터를 시작할 수 있다. AUTOEXEC.BAT에서는 이 명령어를 사용하여 다중 환경으로 구성할 수 있다.

CHOICE 명령어를 사용한 다중 부트 분할에 대해서는 다음에 설명할 "사용 예"를 참조하기 바란다.

☞ CHOICE의 메시지

다음은 배치 프로그램에서 CHOICE 명령어를 사용하는 방법과 그에 따른 메시지를 나타낸다.

CHOICE 명령어에 선택 문자만을 지정한 경우

명령어 줄 choice /c:ync

메시지 [Y,N,C ]?

CHOICE 명령어에 선택 문자와 문자열을 지정한 경우

명령어 줄 choice /c:ync Yes, No, or Continue

메시지 Yes, No, or Continue [Y,N,C ]?

CHOICE 명령어에 프롬프트를 생략하는 /n 옵션을 사용한 경우

명령어 줄 choice /n Yes, No, or Continue?

메시지 Yes, No, or Continue?

CHOICE 명령어에 /t 옵션을 사용한 경우

명령어 줄 choice /c:ync /t:y,5

메시지 [Y,N,C ]?

위 의 예에서 만약 5초 이내에 선택 문자 중에서 아무키라도 누르지 않으면 CHOICE는 자동으로 Y를 선택하고 종료 코드 값으로 1을 운영 체제에 넘겨준다. 5초 이내에 선택 문자를 누르면 CHOICE는 선택한 값에 대응되는 종료 코드를 넘겨준다.

☞ 종료 코드

CHOICE 명령어는 실행을 종료한 뒤 에러 수준 종료 코드를 운영 체제에 돌려주는데, 사용자는 종료 코드를 이용하여 다중 분기문을 작성할 수 있다.

다음은 CHOICE가 운영 체제에 돌려주는 종료 코드에 관한 설명이다.

0 배치 프로그램을 중단하기 위하여 키보드 상에서 <Ctrl>+<BREAK> 혹은 <Ctrl>+<C>를 눌렀다.

1 사용자가 첫번째 선택 문자를 선택하였다.

2 사용자가 두번째 선택 문자를 선택하였다.

3 사용자가 세번째 선택 문자를 선택하였다.

. .

. .

255 에러가 발생하였다.

종료 코드를 이용하는 방법에 관한 자세한 사항은 IF 명령어를 참조하거나, 다음에 설명할 "사용 예"를 참조하기 바란다.

■ 사용 예

컴퓨터를 켤 때 사용자가 원하는 경우에 C드라이브에 있는 파일들의 단편화를 제거하는 프로그램인 DEFRAG를 실행하도록 설정하려면 AUTOEXEC.BAT 파일에 다음과 같은 내용을 추가한다. 만약, 다른 명령어를 지정하여 사용하고자 한다면 DEFRAG 대신에 원하는 명령어를 지정한다.

choice Defrag drive /t:n,5

if errorlevel 255 goto error

if errorlevel 2 goto SkipDefrag

defrag c: /f/se/b

:error

echo Error Found!

pause

:SkipDefrag

만약 5초 이내에 Y를 누르면 단편화 제거 프로그램이 실행되고 CHOICE는 1의 값을 종료 코드 값으로 운영 체제에 돌려준다. 5초 이내에 Y키를 누르지 않거나 N키를 누르면 C 드라이브의 단편화 제거 프로그램은 실행되지 않는다. 만약, 단편화 제거 프로그램이 실행된다면 /b 옵션을 사용하였기 때문에 프로그램이 종료됨과 동시에 컴퓨터를 재시동하게 된다.

다음의 배치 프로그램의 예는 CHOICE 명령어를 이용하여 HWP, Windows, MS-DOS 에디터, MS-DOS의 백업 프로그램 중에서 하나를 선택하는 방법을 보여준다. 단, 위의 모든 실행 프로그램은 하드디스크에 설치되어 있고, PATH 명령어에 경로가 추가되어 있다고 가정한다.

@echo off

cls

echo 1 HWP

echo 2 Windows

echo 3 MS-DOS Editor

echo 4 Backup

choice /c:1234

if errorlevel 255 goto Exit

if errorlevel 4 goto Backup

if errorlevel 3 goto Edit

if errorlevel 2 goto Win

if errorlevel 1 goto Hwp

:Backup

c:\dos\msbackup

goto Exit

:Edit

edit

goto Exit

:Win

c:\windows\win

goto Exit

:Hwp

c:\hwp21\hwp

:Exit

ECHO

이 명령어는 배치 프로그램에서 필요한 메시지를 디스플레이하기 위하여 사용한다. 즉, 배치 프로그램에서 작업 중 텍스트로 이루어진 메시지를 스크린에 디스플레이하는데 사용된다. 이 외에도 배치 프로그램에 지정되어 있는 명령어의 반향을 켜거나 끄도록 설정하기 위하여 사용한다. 예를 들어, 다수의 명령어 행을 포함하고 있는 경우에는 명령어 반향을 끄기 위하여 배치 프로그램의 첫 행에 "echo off"를 추가한다.

■ 사용법

ECHO [ON|OFF ]

ECHO [message]

■ 옵션 및 매개변수

on|off 명령어 반향의 특징을 켤 것인지 아니면 끌 것인지를 결정한다. 현재의 ECHO 설정을 디스플레이하기 위해서는, 매개변수 없이 사용한다.

message 배치 프로그램을 실행할 때 화면에 디스플레이될 문자열을 타이프한다.

■ 사용상의 주의

☞ ECHO 명령어에 메시지 사용하기

ECHO 명령어는 ECHO가 OFF로 설정되어 있는 경우에 매우 유용하다. 즉, 다른 명령어를 디스플레이하지 않고 몇 줄의 메시지를 디스플레이하기 위하여 배치 프로그램에서 ECHO OFF 명령어를 사용한 다음, 필요한 메시지를 연속적으로 ECHO 명령어 뒤에 기록한다.

☞ 명령어 감추기

다수의 명령어를 포함하는 배치 프로그램인 경우 ECHO OFF 명령어를 사용하여 배치 프로그램에 포함되어 있는 명령어가 화면에 나타나지 않는다. 만약, 배치 파일에 포함된 프롬프트를 디스플레이하려면 ECHO ON 명령어를 사용한다.

☞ 한 줄의 명령어 라인만 감추기

ECHO OFF 명령어를 사용할 경우에는 다음에 ECHO ON 명령어가 나타날 때 까지 배치 프로그램 안에서는 계속 유효하다. 그러나, ECHO OFF 명령어는 프롬프트 상에 반향되어 나타난다. 만약, ECHO OFF 명령어 자체를 반향하지 않도록 하려면 at 기호(@)를 사용하여야 한다. 즉, 배치 프로그램의 맨 위에 "@ECHO OFF"라고 입력하면 프롬프트 상에 ECHO OFF라는 명령어도 디스플레이되지 않는다.

☞ @와 콜론(:), 세미콜론(;), REM 명령어와의 비교

한 줄의 명령어 라인을 실행하지 않기 위해서는 콜론(:)과 세미콜론(;), REM 명령어를 사용한다. 이 명령어나 기호는 CONFIG.SYS와 배치 프로그램에서만 사용하는 명령어로써 콜론(:)은 해당 명령어 라인을 GOTO 명령어에 의해 찾아갈 레이블로 인식하기 때문에 명령어를 실행하지 않고, 세미콜론(;)과 REM 명령어는 MS-DOS에서 주석문을 달기 위하여 사용되는 명령어이기 때문에 세미콜론이나 REM이 명령어 라인의 맨 앞에 오면 해당 명령어 라인은 MS-DOS가 실행하지 않는다.

따라서, @는 명령어를 실행하되 명령어를 프롬프트 상으로 반향하지 않는다는 것이고, 콜론, 세미콜론, REM 명령어는 명령어의 반향과는 무관하고 단지 명령어행으로 인식하지 않는다는 차이가 있을 뿐이다.

☞ 빈 줄을 디스플레이하도록 하기

스크린에 빈줄을 디스플레이하려면 ECHO 명령어 다음에 마침표(.)를 입력한다. 만약 ECHO와 마침표 사이에 스페이스가 있는 경우에는 화면에 마침표(.)를 디스플레이하므로, 빈줄을 디스플레이하려면 둘 사이에 스페이스를 두지 않아야 한다.

☞ 파이프와 방향 전환 기호의 디스플레이

사용자는 ECHO 명령어를 사용하여 파이프(|)나 입출력 방향 전환 기호(< 혹은 >)를 디스플레이할 수 없다.

■ 사용 예

다음의 예는 선행하는 세 줄의 메시지를 포함하고, 빈줄이 뒤따르는 배치 프로그램의 일부이다.

echo off

echo.

echo This is batch program

echo formats and checks

echo new disks

echo.

.

.

위의 예에서 ECHO를 끄고, ECHO 명령어를 반향하지 않도록 하려면 다음과 같이 명령어 앞에 at 기호(@)를 포함한다.

@echo off

사용자는 배치 프로그램을 작성할 때 IF 명령어를 ECHO 명령어와 함께 사용할 수 있다. 다음의 예는 명령어 라인 상에 IF와 ECHO 명령어를 사용한 예이다.

if exist *.rpt echo the report has arrived.

FOR

사용자가 지정한 일련의 파일에 지정된 명령어를 실행하기 위하여 사용하는 명령어이다. 사용자는 FOR 명령어를 배치 프로그램에 사용할 수 있고, 직접 프롬프트 상에서 사용할 수 있는데, 일반적으로 배치 프로그램에서 많이 사용되므로 FOR 명령어를 배치 프로그램 명령어로 분류하기도 한다.

■ 사용법

배치 프로그램에서의 FOR 명령어 사용 방법

FOR %%variable IN (set ) DO command [command-para]

명령어 프롬프트에서의 FOR 명령어 사용 방법

FOR %variable IN (set ) DO command [command-para]

■ 옵션 및 매개변수

%%variable

혹은%variable

FOR 명령어에서 교체할 수 있는 변수를 지정한다. FOR 명령어에서는 지정된 명령어가 모든 파일을 처리할 때까지 %%variable(또는 %variable)을 모든 매개변수와 차례로 교체하여 사용한다. FOR 명령어를 수행하기 위하여 배치 프로그램에서는 %%variable을 사용하고, 명령어 프롬프트에서는 %variable을 사용한다.

(set) 사용자가 지정한 명령어로 처리하고자 하는 하나 이상의 파일이나 텍스트 문자열을 지정한다.

command 지정된 (set)에 포함된 각 파일에서 수행하고자 하는 명령어를 지정한다.

command-para 지정된 명령어가 매개변수나 옵션을 사용할 경우, 해당 옵션이나 매개변수를 지정한다.

■ 참고 사항

☞ IN과 DO 키워드 사용하기

IN과 DO는 매개변수나 옵션이 아니다. 그러나 이것은 FOR 명령어를 사용하기 위하여 반드시 사용해야 할 키워드이다. 만약, FOR 명령어를 사용할 때 IN과 DO의 키워드 중 어느 하나를 생략하면 MS-DOS는 사용자가 지정한 명령어 형식이 적절하지 않다는 오류 메시지를 디스플레이한다.

☞ 교체할 수 있는 변수 사용하기

%에서 %까지의 배치 매개변수와 혼란을 피하기 위하여 %1부터 %9까지의 숫자들을 제외한 모든 문자를 변수로 사용할 수 있다. 간단한 배치 프로그램에는 %%f나 %f와 같은 단일 문자가 필요한 전부가 될 수 있다.

사용자는 다른 교체 가능한 변수를 구별하기 위하여 복잡한 배치 프로그램에서 variable에 다수의 값을 사용할 수 있다. 그러나 같은 명령어 라인에 다수의 FOR 명령어를 인접하여 추가할 수 없다.

☞ 다수의 파일군을 지정하기

(set) 매개변수는 파일의 단일 그룹 혹은 다수의 파일 그룹을 지정할 수 있다. 또한 사용자는 파일 세트를 지정하기 위하여 와일드 카드를 사용할 수 있다. 다음은 모두 사용할 수 있는 파일 세트의 예이다.

(*.doc)

(*.doc *.txt *.me)

(jan*.doc jan*.rpt feb*.doc feb*.rpt)

(arp??1991.* ap??1991.*)

사용자가 FOR 명령어를 사용할 때 (set)에 있는 첫번째 값은 %%variable(또는 %variable)을 대체한다. 그리고 MS-DOS는 이 값을 처리하기 위해 지정한 명령어를 수행한다. 이것은 (set)에 있는 값에 해당하는 모든 파일을 모두 처리할 때까지 기다린다.

■ 사용 예

TXT나 DOC 확장자를 가진 현행 디렉토리 내의 모든 파일의 내용을 디스플레이하는데 TYPE 명령어를 사용하고, 이를 위하여 FOR 명령의 교체 가능한 변수로 %f를 사용하려면 다음과 같은 FOR 명령어를 사용한다.

for %f in (*.txt *.doc) do type %f

위의 예에서 현행 디렉토리 내의 TXT나 DOC 확장자를 갖는 각각의 파일은 모든 파일을 디스플레이할 때까지 %f 변수를 대신한다. 위의 예를 배치 프로그램에서 사용하려면 %f의 모든 발생을 %%f로 교체한다. 그렇지 않은 경우 MS-DOS는 변수를 무시하고 에러 메시지를 디스플레이한다.

MS-DOS는 지정된 명령어와 함께 사용하고자 하는 명령어 옵션과 파이프(|), 방향 전환 기호(>)를 모두 지원한다. 예를 들어, 위의 예에서 출력을 스크린으로 하는 대신에 PRN(디폴트 프린터)으로 방향을 전환하려면 다음과 같은 명령어를 사용한다.

for %f in (*.txt *.doc) do type %f > prn:

위의 예에서 PRN은 디폴트 프린터를 의미한다. 즉, PRN은 하나의 프린터를 가지고 있는 경우에 사용될 수 있는 명령어이다. 만약 둘 이상의 프린터와 연결되어 있는 경우에는 LPT1, LPT2 혹은 LPT3 등으로 연결된 프린터 포트를 정확히 지정하여야만 한다

GOTO

이 명령어는 배치 프로그램에서 사용자가 지정한 레이블에 의해 표시된 명령어 라인으로 직접 이동하기 위하여 사용한다. 일단 지정된 레이블로 이동한 후에는 다음 라인에 있는 명령어를 처리한다. GOTO 명령어가 단독으로 사용되면 무조건 지정된 레이블로 이동한다. 그러나, 일반적으로 GOTO 명령어는 IF 명령어와 함께 조건 분기를 위하여 사용된다. 즉, IF 명령어의 조건문을 만족하는 경우에는 지정된 레이블로 이동하고 조건문을 만족하지 않으면 다음 명령어 라인을 실행한다.

■ 사용법

GOTO label

■ 옵션 및 매개변수

label MS-DOS가 처리해야 할 다음 명령어 라인을 지정한다.

■ 사용상의 주의

☞ label에 적절한 값 사용하기

GOTO 명령어에서 사용하는 레이블로 스페이스를 포함한 모든 문자를 사용할 수 있다. 그러나 세미콜론(;)이나 등호(=)와 같은 기호는 사용할 수 없다. 세미콜론의 경우에는 배치 프로그램이나 CONFIG.SYS에서 해당 명령어 라인을 디스플레이하지 않기 위하여 사용된다.

☞ GOTO 명령어가 이용하는 레이블의 이름

GOTO 명령어는 명령어 라인의 맨 앞에 콜론(:)이 있으면 이를 레이블로 인식하는데, 각 레이블의 8글자만 인식한다. 따라서 각 레이블 이름이 처음 8자가 같은 경우에는 동일한 레이블로 인식한다. 즉, 찾아갈 레이블에서 콜론을 포함한 처음 8자가 같은 ":HITHER01"과 ":HITHER02"는 ":HITHER0"로 모두 같은 것으로 인식한다.

☞ 배치 프로그램 내에서의 label과 맞추기

사용자가 GOTO 명령어 라인에서 지정한 레이블은 배치 프로그램의 레이블과 일치하여야 하고, 배치 프로그램 내의 각 레이블은 반드시 콜론으로 시작하여야 한다. 만약, 배치 프로그램에서 GOTO 명령어로 지정한 레이블을 포함하고 있지 않은 경우 MS-DOS는 배치 프로그램의 실행을 중단하고, 다음과 같은 메시지를 디스플레이한다.

Label not found

MS-DOS는 콜론으로 시작하는 배치 프로그램 명령어 라인을 레이블로 인식한다. 그리고 레이블은 명령어로 인식하지 않는다. 즉, 콜론으로 시작하는 레이블에 명령어가 포함되어 있을지라도 MS-DOS는 이 명령어를 실행하지 않는다.

☞ GOTO 명령어를 IF 명령어와 함께 사용하기

GOTO 명령어는 무조건적인 GOTO문과 조건적인 GOTO문으로 구분된다. 무조건적인 GOTO문은 단순히 다음 단계로 가기 위하여 사용하는 방법으로 다음과 같은 형식으로 사용된다.

goto small

ててててててててて

:small

ててててててててて

조건적인 GOTO문은 IF문과 함께 쓰이는데, 조건식을 만족하는 경우에 사용자가 지정한 레이블로 이동하고, 조건식을 만족하지 않는 경우에는 다음 명령어 라인을 실행한다. IF문에 대한 자세한 사항은 본 장의 "IF" 명령어를 참조하기 바란다.

■ 사용 예

다음의 배치 프로그램은 A:드라이브에 있는 디스크를 포맷하는 것이다. 만약 포맷이 성공적인 경우 MS-DOS는 END라는 레이블로 직접 이동한다.

echo off

format a:

if not errorlevel 1 goto end

echo An error occured during formatting.

:end

echo End of Format

IF

이 명령어는 배치 프로그램에서만 사용되는 명령어로 조건적 처리를 수행하기 위하여 사용한다. 만약, IF 명령어에 지정된 조건이 참이면 MS-DOS는 그 조건 뒤에 따르는 명령어를 수행하고, 조건이 거짓인 경우에는 IF 다음의 명령어를 무시하고 다음 명령어를 수행한다.

■ 사용법

IF [NOT ]ERRORLEVEL num command

IF [NOT ]string1==string2 command

IF [NOT ]EXIST filename command

■ 옵션 및 매개변수

not 조건문을 만족하지 않으면 뒤에 나오는 명령어를 실행하도록 하기 위하여 사용한다.

errorlevel num 직전에 실행된 프로그램이 운영 체제에 되돌려 준 종료 코드보다 크거나 같은 값인 경우에만 지정된 명령어를 실행하도록 하기 위하여 사용한다.

string1==string2 string1과 string2가 같은 경우에만 뒤에 오는 명령어를 실행한다. 이 값은 문자열이나 %1 혹은 %2와 같은 배치 프로그램의 매개변수가 올 수 있다. 문자열이 올 경우에도 따옴표를 사용하지 않는다.

existfilename 지정한 파일명을 가진 파일이 있는 경우에 다음에 오는 명령어를 실행하도록 지정한다.

command 조건문을 만족하는 경우에 실행할 명령어를 지정한다.

■ 참고 사항

프로그램이 중단될 때, 해당 프로그램은 운영 체제에 에러 수준 종료 코드를 되돌려주는데, errorlevel은 이러한 종료 코드를 조건문에 사용할 수 있도록 한다. 종료 코드를 사용하여 배치 프로그램을 분기하는 경우에는 항상 종료 코드가 큰 값이 먼저 지정되어야 한다는 것이다. 이것은 배치 프로그램이 명령어를 순차적으로 처리하고, IF문에서 사용되는 errorlevel은 지정한 숫자보다 크거나 같은 경우 조건문을 만족하는 것으로 인식하기 때문이다. 따라서, 종료 코드를 큰 수부터 지정하지 않고 낮은 수 예를 들어 0부터 지정한 경우에는 항상 동일한 명령어만 실행될 것이다.

■ 사용 예

만약, MS-DOS가 MARCH.RPT라는 파일을 찾지 못하는 경우 '해당 파일이 없습니다'라는 메시지를 디스플레이하도록 배치 프로그램을 작성하려면 다음과 같이 IF 명령문을 사용한다.

@echo off

if not exist march.rpt echo 해당 파일이 없습니다

다음의 예는 드라이브를 포맷하는 동안 에러가 발생하는 경우, 해당 에러에 대한 메시지를 디스플레이하도록 작성된 배치 프로그램이다.

@echo off

format %1 %2

if not errorlevel 1 goto end

echo 포맷하는 도중에 에러가 발생하였습니다

goto exit

:end

echo 정상적으로 포맷이 완료되었습니다

:exit

위의 예에서 'if not errorlevel 1'은 FORMAT이 실행된 뒤 운영 체제로 되돌려준 종료 코드가 '1보다 크거나 같지 않은 경우' 즉, '1보다 작은 경우'에만 end로 이동하여 '정상적으로 포맷이 완료되었습니다'라는 메시지를 디스플레이하고 배치 프로그램을 종료한다.

프로그램의 종료 코드를 이용하여 배치 프로그램을 작성하는 경우 주의할 것은 errorlevel 다음에 지정한 숫자는 그보다 크거나 같은 경우를 지정하는 것이기 때문에, 다수의 에러 수준에 따라 다른 명령어를 수행하도록 하는 경우에는 반드시 errorlevel의 숫자가 큰 것부터 차례로 IF 명령문을 작성하여야 한다.

다음의 예는 디렉토리의 존재를 검사하기 위한 IF 명령문이다. IF 명령어는 디렉토리를 직접 검사할 수 없다. 그러나 널(NUL) 장치는 모든 디렉토리에 존재하기 때문에 디렉토리가 있는지를 검사하기 위하여 널 문자를 찾음으로써 디렉토리를 확인할 수 있다.

if exist c:\hwp\data\nul goto process

위의 예에서는 C드라이브 상의 HWP\DATA 디렉토리가 있는지를 검사하여 있으면 process 레이블을 실행하고, 없으면 다음 명령어 라인을 실행하라는 것이다.

PAUSE

이 명령어는 배치 프로그램의 처리를 잠시 중단하고, 사용자에게 계속하려면 임의의 키를 누르라는 메시지를 디스플레이하도록 하기 위하여 사용한다. PAUSE 명령어는 작업 중단을 위한 <Ctrl>+<C> 와 함께 사용하여 배치 프로그램의 작업을 나눌 수 있다.

■ 사용법

PAUSE

■ 사용상의 주의

☞ 사용자에게 프로그램을 계속하도록 프롬프트하기

MS-DOS는 PAUSE 명령어에 대한 응답으로 다음과 같은 메시지를 디스플레이한다. 사용자는 이 메시지가 디스플레이되었을 때 작업을 계속하기 위하여 임의의 키를 누를 수 있다.

Press any key to continue...

☞ 배치 파일의 작업 나누기

사용자가 배치 프로그램을 중단하기 위하여 배치 프로그램이 실행되는 중간에 키보드 상에서 <Ctrl>+<C> 를 누른다. 그러면, MS-DOS는 다음과 같은 메시지를 디스플레이한다.

Terminate batch job (Y/N)?

이 메시지에 대한 응답으로 Y를 누르면 배치 프로그램의 실행을 중단하고, 운영 체제로 통제를 넘긴다. 따라서 사용자는 이러한 특성을 이용하여 때에 따라 계속하고 싶지 않은 작업이 있는 경우에는 바로 앞에 PAUSE 명령어를 삽입함으로써 배치 프로그램의 작업을 나눌 수 있다. 즉, PAUSE 명령어에 의하여 작업이 잠시 중단되어 있는 경우에 <Ctrl>+<C> 를 누름으로써 작업을 중단할 수 있는 것이다.

■ 사용 예

사용자가 플로피 드라이브에 있는 디스크를 바꾸라는 메시지를 디스플레이하고, 사용자가 디스크를 바꾸기를 기다려야 하는 경우에는 PAUSE 명령어를 적절히 사용할 수 있다. 다음의 예는 다수의 플로피디스크에 있는 파일을 현행 디렉토리로 모두 복사하는 배치 프로그램을 작성한 예이다.

@echo off

:begin

copy a:*.*

echo Insert a new disk into drive A

echo If terminate the copy job, press <Ctrl>+<C>

pause

goto begin

위의 예에서 A드라이브에 있는 디스크 상의 모든 파일을 현행 디렉토리로 복사한 다음, 다른 디스크의 내용을 복사하기 위하여 새로운 디스크를 넣으라는 메시지와 작업을 끝내기 위하여 <Ctrl>+<C> 키 를 누르라는 메시지를 디스플레이하고, 잠시 기다릴 것이다. 여기에서 사용자가 임의의 키를 누르면 작업은 다시 BEGIN으로 되돌아 갈 것이다. 이 배치 프로그램은 무한히 계속되는 특징을 갖는다. 이 배치 프로그램을 끝내기 위해서는 <Ctrl>+<C> 를 누른 다음, Y를 누른다.

REM

이 명령어는 사용자가 배치 프로그램의 파일이나 CONFIG.SYS 파일에 주석문을 추가하기 위하여 사용하는 명령어로, MS-DOS에서는 REM으로 시작되는 모든 명령어 라인은 명령어로 인식하지 않기 때문에 실행되지 않는다. 세미콜론(;)도 동일한 효과를 갖는다.

■ 사용법

REM [comments]

혹은,

; [comments]

■ 옵션 및 매개변수

comments 주석문으로 사용할 문자열을 지정한다. 주석문에 사용되는 문자는 특별히 아스키로 제한되지 않는다. 즉, 확장 문자를 사용할 수 있다.

■ 사용상의 주의

☞ 주석문 디스플레이하기

REM 명령어는 주석문으로 지정된 문자열을 화면에 디스플레이하지 않는다. 주석문을 디스플레이하려면 배치 파일에서 ECHO 명령어를 사용하거나 CONFIG.SYS 파일에서 ECHO ON 명령어를 사용해야 한다.

☞ REM 사용시의 제한 사항

REM 명령어에서 사용되는 주석문의 문자는 특별히 제한되지 않는다. 즉, 확장 문자도 주석문의 문장에 사용할 수 있다. 그러나 배치 파일의 주석문에서는 입출력을 위한 반향 전환 기호(> 혹은 <)나 파이프(|)를 사용할 수 없다.

☞ 공백 추가하기

비록 사용자가 배치 파일에 세로 공백을 디스플레이하기 위하여 주석문 없이 REM 명령어만 사용할 수 있지만, 비어있는 라인도 사용할 수 있다. 이것은 MS-DOS가 배치 프로그램을 처리할 때 공백 라인을 무시하여 처리하지 않기 때문이다.

■ 사용 예

다음의 예는 설명과 공백을 사용하는 배치 프로그램이다.

@echo off

rem This is batch program formats and checks new disks.

rem It is named CHECKNEW.BAT

rem

echo Insert a new disk in drive A:

pause

format a:/v

chkdsk a:

사용자가 CONFIG.SYS 파일에서 PROMPT 명령어 앞에 프롬프트를 설명하는 주석문을 추가하려면 다음과 같이 REM 명령어를 사용한다.

rem Set prompt to indicate current directory

prompt $p$g

장치 제어기를 메모리에 탑재하기 위하여 사용하는 DEVICE 명령어를 실행되지 않도록 지정하려면 다음 예와 같이 명령어의 맨 앞에 REM이나 세미콜론(;)을 추가한다.

rem device=c:\dos\power.exe

;device=c:\dos\power.exe

SET

이 명령어는 MS-DOS의 환경 변수를 설정하거나 변경하고, 설정된 환경 변수를 디스플레이하기 위하여 사용하는 것으로 프롬프트 상에서 사용하거나 배치 프로그램에서 사용하는 내부 명령어이다. 사용자는 일부 배치 프로그램의 동작을 통제하거나, MS-DOS나 MS-DOS 서브시스템이 나타나고 작동하는 방법을 결정하기 위하여 환경 변수를 사용한다. 일반적으로 SET 명령어는 사용자가 컴퓨터를 시동할 때마다 환경 변수를 설정하기 위하여 AUTOEXEC.BAT 파일에 사용한다. 따라서, 이 명령어를 프롬프트 명령어에 분류하지 않고 배치 파일 명령어로 분류한 것이다.

■ 사용법

SET [variable =[string]]

■ 옵션 및 매개변수

none 매개변수 없이 사용되면 현재의 환경 설정을 디스플레이한다.

variable 사용자가 설정하거나 변경하고자 하는 변수를 지정한다.

string 환경 변수에 지정될 변수값이나 문자열을 지정한다.

■ 사용상의 주의

☞ 현행 환경 설정을 디스플레이하기

사용자가 명령어 프롬프트 상에서 매개변수나 옵션이 없이 SET 명령어를 단독으로 사용하는 경우, MS-DOS는 현재 설정된 환경 변수 값을 디스플레이한다. MS-DOS에서 지정할 수 있는 환경 변수는 명령어 해석기의 위치를 지정하는 COMSPEC, 실행 파일의 검색 경로를 지정하기 위한 PATH, 프롬프트의 디스플레이 방법을 지정하기 위하여 사용하는 PROMPT, 그리고 DIR 명령어를 이용하여 파일 목록을 열람할 때의 옵션을 지정하기 위한 DIRCMD, 데이터를 임시 저장하기 위한 디스크 상의 공간을 지정하기 위한 TEMP 환경 변수 등이 있다.

이 외에도 응용 프로그램에 따라 필요한 환경 변수를 지정할 수 있다. 예를 들어, 사운드 카드의 경우에는 주소, 인터럽트 요청선을 지정하기 위하여 환경 변수를 사용한다.

☞ 매개변수 사용하기

사용자가 SET 명령어를 사용하고 variable과 string에 대한 변수를 지정할 때, MS-DOS는 지정된 변수를 환경에 추가하고, string을 그 변수 값으로 사용한다. 만약, 이미 지정된 환경 변수가 있는 경우에는 새로 지정된 값이 기존의 환경 변수 값을 대체한다.

만약, SET 명령어를 사용할 때 string없이 variable=만 단독으로 사용하면 MS-DOS는 해당 variable에 지정되어 있던 모든 환경 변수를 삭제한다.

☞ 배치 파일에 SET 사용하기

사용자는 배치 프로그램을 작성할 때 SET 명령을 사용하여 변수값을 설정할 수 있고, %0∼%9까지의 대체 변수와 같은 방식으로 사용할 수도 있다. 또, %0∼%9까지의 대체 변수값을 SET 명령어의 입력값으로 사용할 수도 있다.

☞ 배치 파일에서의 환경 변수의 호출

사용자가 배치 파일에서 변수 값을 호출할 때, 사용자는 반드시 그 값을 퍼센트 기호(%)로 묶어야 한다. 예를 들어, 기존의 검색 경로를 지정한 PATH 환경 변수를 호출하려면 %PATH%와 같은 방식으로 호출한다. 즉, %PATH%는 기존의 환경 변수를 string으로 사용한다.

MS-DOS에서는 이러한 환경 변수의 호출이 반드시 배치 프로그램만으로 한정되지 않고, 명령어 프롬프트 상에서도 이를 호출할 수 있다.

☞ 환경 공간에 대한 SET의 효과

SET 명령을 입력한 뒤 다음과 같은 메시지가 나올 경우가 있다.

Out of environment space.

이러한 메시지는 정상적으로 변수 값을 설정하지 못했을 경우 혹은 환경을 저장할 공간이 충분하지 않은 경우에 나타나는 것으로 환경 공간을 확장해 주어야 한다. 환경 공간의 확장에 대한 자세한 사항은 본 장의 "프롬프트 명령어"에 있는 COMMAND 명령어를 참조하기 바란다.

■ 사용 예

C:\INC 디렉토리를 INCLUDE 환경 변수로 설정하려면 다음과 같이 SET 명령어를 사용한다.

set include=c:\inc

위의 예처럼 INCLUDE 환경 변수를 설정한 다음부터는 환경 변수 INCLUDE를 %로 묶어서 배치 파일에서 문자열 대신 사용할 수 있다.

예를 들어, 사용자가 INCLUDE 환경 변수와 관련된 디렉토리의 내용을 보기 위하여 배치 파일에 다음과 같은 명령어를 사용할 수 있다.

dir %include%

MS-DOS는 위의 예와 같은 명령어를 처리할 때, %includ% 대신에 C:\INC를 대체한다.

SET 명령어는 다음의 예에서 나타난 것처럼, 기존의 환경 변수에 새로운 환경 변수를 첨가하기 위하여 사용할 수 있다. 다음의 예는 기존의 검색 경로를 지정한 환경 변수에 사용자가 지정한 디렉토리를 추가하는 내용을 담고 있는 배치 프로그램이다.

@echo off

rem ADDPATH.BAT adds a new directory

rem to the path environment variable

set path=%1;%path%

SHIFT

MS-DOS에서 배치 프로그램을 실행할 때 %0∼%9의 10개의 매개변수를 사용한다. 그러나 교체할 매개변수가 10개를 초과하는 경우에는 이를 한번에 지정할 수 없다. 이를 위하여 MS-DOS에서는 배치 프로그램에서 10개 이상의 매개변수를 사용할 수 있도록 SHIFT 명령어를 제공한다. 이 명령어는 배치 파일 내에 있는 교체할 수 있는 매개변수의 위치를 앞으로 이동하기 위하여 사용한다.

■ 사용법

SHIFT

■ 사용상의 주의

☞ SHIFT 명령어의 작동 방법

SHIFT 명령어는 각 매개변수를 선행자에 복사함으로써 %0에서 %9까지 교체 가능한 매개변수의 값을 변경한다. 즉, %1의 값은 %0에 복사되고, %2의 값은 %1에 복사되는 식으로 계속된다. 이것은 매개변수의 모든 번호에서 같은 구동을 수행하는 배치 프로그램을 작성하는데 유용하다.

☞ 10개 이상의 매개변수 사용하기

사용자가 10개 이상의 매개변수를 받아들이는 배치 프로그램을 작성하는데 SHIFT 명령어는 매우 유용하게 사용된다. 만약, 사용자가 10개 이상의 매개변수를 명령어 라인에 지정한 경우 11번째에 지정한 매개변수는 SHIFT 명령어를 한번 실행할 때마다 %9로 전환될 것이다.

☞ SHIFT 매개변수의 되돌리기

직전에 사용한 매개변수를 다시 사용할 수는 없다. 즉, 매개변수 중에서 한번 SHIFT된 경우 첫번째 매개변수를 메모리에서 삭제하기 때문에 이를 다시 사용할 수 없다.

■ 사용 예

다음 예에서의 배치 프로그램은 SHIFT 명령어를 매개변수의 모든 번호에 사용하는 방법을 보여준다. 이것은 파일의 목록을 특정한 디렉토리에 복사한다. 매개변수는 그 디렉토리의 이름과 그 다음에 오는 파일명의 모든 번호이다.

@echo off

rem USERCOPY.BAT copies any number of files

rem to a directory

rem The command uses the following syntax:

rem usercopy dir file1 file2 . . . . .

set todir=%1

:getfile

shift

if "%1"=="" goto end

copy %1 %todir%

goto getfile

:end

set todir=

echo All done.

:
Posted by Elick
2009. 2. 11. 17:37

MSSQL File 정보 Work/SQL Server2009. 2. 11. 17:37

별거 아니지만...
일단 기록해 두자..

-- MSSQL 2000

SELECT @@ServerName, RTRIM(D.name), RTRIM(MF.name), RTRIM(MF.filename)
FROM master.sysaltfiles MF
    INNER JOIN master.sysdatabases D ON MF.dbid = D.dbid
ORDER BY D.dbid, MF.fileid

-- MSSQL 2005
SELECT @@ServerName, D.name, MF.name, MF.physical_name
FROM master.sys.master_files MF
    INNER JOIN master.sys.databases D ON MF.database_id = D.database_id
ORDER BY D.database_id, MF.file_id



:
Posted by Elick
2009. 2. 9. 14:45

Windows cmd script 1 Work/Etc2009. 2. 9. 14:45

가끔... 정말 가끔 windows 서버에서 cmd script를 작성해야 할 일이 있다.
참고할 만한 사이트가 딱히 없어서 개인 블로그를 열심히 뒤지거나 잡다한 검색을 했지만, 역시나 체계적으로 설명된 곳이 드믈었다.
내가 하고 싶은 작업을 해낼 만한 참고가 없다는 것이 슬프다...

그동안 찾아낸 것을 대강 정리해 놓았다.

FORFILES
Windows 2003에서 사용가능. XP는 안됨.
사용예)
forfiles /P C:\filepath /S /M *.txt /D -10 /C "cmd /c del @file"

NET
NET VIEW
    컴퓨터에서 공유되고 있는 리소스를 확인하는 명령어입니다.
    net view 명령어 뒤에 목적 컴퓨터의 IP나 NetBIOS이름을 넣어서 사용하면 목적 컴퓨터가 공유하고 있는 리스트를 알아 낼 수 있습니다.

NET SHARE도 비슷하지만 좀더 자세하게 설정 가능합니다.

NET SEND
    네트워크상의 컴퓨터에 메시지를 보낼 때 사용합니다.
    이 명령어는 win9x 에서는 사용할 수 없으며 2000 이상에서 사용할 수 있습니다.

NET USE
    윈도우에서 지원하는 ‘네트워크 드라이브 연결’과 같은 명령어입니다.
    목적 컴퓨터에 공유되어 있는 폴더를 사용하고 있는 시스템과 연결시켜 줍니다.
ex) 연결시 : net use z: \\xxx.xxx.xxx.xxx\DB_Backup
연결 해제시 : net use z: /delete

NET SESSION
    현재 사용하고 있는 컴퓨터에 누가 접근했는지 확인할 때 사용합니다
    만약 누군가가 컴퓨터에 접속해서 자료를 빼어 가거나 내 컴퓨터의 정보를 보고 있을 때 이 명령어로 확인한 후  “net send /user 메시지”를 이용해서 접속해 있는 사람에게 경고를 할 수 있겠죠?? ^^;

NET USER
    net user 명령어는 계정을 만들거나 삭제하는 명령어이지만, 현재 시스템에 있는 사용자의 정보도 알 수 있습니다.

NET LOCALGROUP
    로컬 그룹에 대한 정보와 그룹의 추가와 삭제를 할 수 있는 명령어로 단독으로 사용할 때는 현재 시스템에 등록되어 있는 그룹에 대한 정보를 보여줍니다. 비슷한 명령어로는 net group 가 있으나 컴퓨터가 DC(Domain Controller)로 되어 있을 때만 작동합니다(Active Directory를 사용해야 합니다.
    cmd에서 dcpromo) net localgroup 명령어 다음에 그룹이름을 넣으면 그 그룹이 포함하고 있는 계정을 보여줍니다.

 NET STATISTICS
    서버와 로컬 워크스테이션 서비스에 대한 통계의 정보를 확인할 수 있습니다. 워크스테이션 서비스에서 확인할 수 있는 것은 전송에 대한 통계치, 그리고 서버 서비스에서 확인 할 수 있는 것은 현재 사용하는 컴퓨터에 접속하는 정보에 대한 통계치를 나타냅니다.


날짜 시간 표현
@echo off

set ds=%date%_%time%

FOR /F "tokens=1-4 delims=-" %%A in ('echo %ds%') Do SET ds=%%A%%B%%C
FOR /F "tokens=1-4 delims=:" %%A in ('echo %ds%') Do SET ds=%%A%%B%%C
FOR /F "tokens=1-4 delims=." %%A in ('echo %ds%') Do SET ds=%%A%%B%%C

set ds=%ds:~2,13%

echo %ds%


p.s.
날짜 관련해서 어제 날짜 및 n일 전 날짜 구하는 windows cmd script가 있기는 한데... 너무 길고, 응용하기 까다로왔다.
누가 좋은 방법 아는 사람 없나..


reference
:
Posted by Elick
2009. 1. 29. 15:29

MSSQL 계정 password 유실 Work/SQL Server2009. 1. 29. 15:29

가끔 password를 유실하는 경우가 있다.
이때는 SSMS (SQL Server Management Studio)에 SYSTEM 혹은 Windows 계정으로 연결 후 보안 / 로그인 / 해당 계정 의 [속성] 에서 password를 다시 설정 할 수 있다.

Stored procedure로도 할 수 있는데, sp_password 를 사용하면 된다.
:
Posted by Elick
2009. 1. 29. 14:52

MSSQL Database 분리 Work/SQL Server2009. 1. 29. 14:52

간단하게 database를 복사하거나 backup, 이동하고 싶은 경우 아래의 system stored procedure를 사용하여 작업을 하게된다.
exec sp_detach_db [database name] -- database 분리
-- file 이동
exec sp_attach_db [database name], [mdf file name (full path)], [ldf file name (full path)] -- database 연결

간혹 사고로 ldf를 유실했을 경우...혹은 뜻하지 않게 mdf만 존재하는 경우는 아래처럼 작업하면 된다.
exec sp_attach_single_file_db [database name], [mdf file name (full path)]

하지만, 위의 stored procedure를 사용할 수 있는 조건이 까다롭다.
 1. Data file과 log file이 한 개만 있는 database일 것.
 2. 복제된 database는 안된다.
 3. 다음 version의 MSSQL에서 사라질지도 모른다.

위의 stored procedure로 해결이 안될 경우 아래 처럼 CREATE DATABASE 의 FOR ATTACH_REBUILD_LOG 를 사용하여 작업한다.
CREATE DATABASE [database name] 
ON (NAME='[database name]', FILENAME='[[mdf file name (full path)]]') FOR ATTACH_REBUILD_LOG

그래도 복구가 안되는 경우는 다음의 절차로 작업한다.

 1. 동일한 database name으로 DB를 생성.

 2. MSSQL Server 중지 후 mdf file을 덮어 쓰기.

 3. MSSQL SQL 시작.

 4. system catalog변경을 위해서 allow update 수정.
use master
GO
sp_configure 'allow update', 1
reconfigure with override
GO

 5. 해당 database를 Emergency Mode(응급복구모드)로 변경.
ALTER DATABASE [database name] SET EMERGENCY

 6. SQL 서비스 다시 시작.
     
 7. log 다시 생성.
ALTER DATABASE dbname REBUILD LOG ON (NAME='[log name]', FILENAME='[ldf file name (full path)]')

 8. 일반모드 변경 후 system catalog 원상복귀.
ALTER DATABASE [database name] SET ONLINE
GO
use master
GO
sp_configure 'allow update', 0
reconfigure with override
GO

그래도 복구를 할 수 없다면... 미안하다고 하고 자리를 피한다.

:
Posted by Elick
2009. 1. 29. 13:48

MSSSQL TechNet Work/SQL Server2009. 1. 29. 13:48

:
Posted by Elick
2009. 1. 29. 13:18

CTE ( Common Table Expression ) 설명 Work/SQL Server2009. 1. 29. 13:18

CTE 개념 설명...
역시나 링크 사라질까바.. 복사...


-------------------------------------------------------------------
공용 테이블 식
John Papa

코드 다운로드 위치: DataPoints2007_10.exe (150 KB) 
Browse the Code Online
 목차
뷰, 파생 테이블 및 CTE 
CTE의 구조 
CTE의 이해 
재귀의 규칙 
간단한 재귀 연습 
요약 

개발자가 작업 중인 프로젝트 중에는 기본적인 SELECT/FROM/WHERE 문의 유형을 벗어난 복잡한 SQL 문 작성을 포함하는 것이 많습니다. 이러한 시나리오 중 하나로 FROM 절 내에서 인라인 뷰라고도 하는 파생 테이블을 사용하는 Transact-SQL(T-SQL) 쿼리를 작성하는 예가 있습니다. 개발자는 이러한 일반적인 방법으로 하나의 SELECT 문에서 행 집합을 얻은 다음, 즉시 이 행 집합을 다른 테이블, 뷰 및 사용자 정의 함수에 조인할 수 있습니다. 다른 옵션은 파생 테이블 대신 뷰를 사용하는 것입니다. 이러한 옵션은 각기 장단점이 있습니다.
SQL Server™ 2005를 사용하는 경우 필자는 CTE(공용 테이블 식)이라는 세 번째 옵션을 선호합니다. CTE를 사용하면 성능을 저해하지 않고도 코드 가독성과 관리 용이성을 개선할 수 있습니다. 또한 SQL Server 이전 버전에 비해 T-SQL로 재귀 코드를 작성하기가 훨씬 쉬워졌습니다.
이번 달 칼럼에서는 CTE를 사용하여 일반적인 개발 시나리오를 해결하는 데 초점을 맞추겠습니다. 먼저 CTE의 작동 방식과 CTE를 사용하여 해결할 수 있는 시나리오를 설명하겠습니다. 그런 다음 파생 테이블, 뷰 및 사용자 지정 프로시저와 같은 기존 T-SQL 구문에 비해 CTE를 사용할 때의 장점을 알아볼 것입니다. 칼럼 전반에서 예를 제공하고 이러한 예를 어디에 어떻게 사용해야 하는지 설명할 것입니다. 또한 CTE가 재귀 논리를 처리하는 방법을 설명하고 재귀적 CTE가 작동하는 방법을 정의할 것입니다. 이 칼럼에서 설명하는 모든 코드는 MSDN® Magazine 웹 사이트에서 다운로드할 수 있으며, SQL Server 2005와 함께 제공되는 Northwind 및 AdventureWorks 데이터베이스를 사용합니다.

뷰, 파생 테이블 및 CTE
CTE는 쿼리가 데이터베이스 내에 테이블로 존재하지 않는 데이터 집합에서 선택해야 하는 경우에 유용합니다. 예를 들어 고객 및 고객 주문을 바탕으로 값을 계산하는 집계된 데이터의 집합에 대해 쿼리를 작성하기를 원할 수 있습니다. 집계된 데이터를 Customers, Orders 및 Order Details 테이블을 함께 조인하고 합계를 계산한 다음 주문의 평균값을 계산할 수 있습니다. 그리고 집계된 행 집합에 대해 쿼리를 실행할 수 있습니다. 한 가지 솔루션은 먼저 집계된 데이터를 수집하는 뷰를 만든 다음 이 뷰를 대상으로 작업할 쿼리를 작성하는 것입니다. 다른 옵션은 파생 테이블을 사용하여 집계된 데이터에 대해 쿼리를 수행하는 것입니다. 이를 위해서 SQL 문을 FROM 절로 옮기고 이에 대해 쿼리를 수행할 수 있습니다.
일반적으로 뷰는 큰 쿼리를 나누어 알아보기 방법으로 쿼리를 수행하기 위해 사용됩니다. 예를 들어 테이블 10개를 조인하고, 수십 개의 열을 선택하며, 연관된 논리 집합을 바탕으로 열을 필터링하는 SELECT 문을 뷰로 나타낼 수 있습니다. 이러한 뷰는 데이터베이스 전체에 걸쳐 다른 SELECT 문에서 쿼리할 수 있습니다. 추상화를 통해 뷰가 나타내는 행 집합에 대한 손쉬운 액세스가 제공되며 데이터를 복제하거나 임시 테이블에 저장할 필요도 없습니다.
뷰는 사용 권한이 허락한다는 가정하에 데이터베이스 전체에 걸쳐 다시 사용할 수 있습니다. 예를 들어 그림 1에서는 뷰를 만든 다음 다른 T-SQL 문에서 다시 사용하고 있습니다. 그러나 데이터를 수집하고 한 번만 사용하려는 경우에는 뷰가 최적의 솔루션이 아닐 수 있습니다. 뷰는 데이터베이스에 존재하며 모든 일괄 처리에서 사용할 수 있는 데이터베이스 개체이므로 단일 T-SQL 일괄 처리에서만 사용할 뷰를 만드는 것은 과잉 처리입니다.
 Figure 1 쿼리되는 뷰
CREATE VIEW vwMyView AS
SELECT
    EmployeeID, COUNT(*) AS NumOrders,  MAX(OrderDate) AS MaxDate
FROM Orders
GROUP BY EmployeeID
GO

SELECT 
    e.EmployeeID, oe.NumOrders, oe.MaxDate, e.ReportsTo AS ManagerID, 
    om.NumOrders, om.MaxDate
FROM 
    Employees AS e
    INNER JOIN vwMyView AS oe ON e.EmployeeID = oe.EmployeeID
    INNER JOIN vwMyView AS om ON e.ReportsTo = om.EmployeeID

인라인 뷰라고 하는 파생 테이블을 만드는 다른 옵션이 있습니다. 파생 테이블을 만들려면 간단히 SELECT 문을 괄호로 감싸고 FROM 절 내부로 옮기면 됩니다. 이렇게 생성된 파생 테이블은 쿼리의 대상으로 사용하거나 테이블 또는 뷰와 마찬가지로 조인할 수 있습니다. 그림 2에서는 뷰가 아닌 파생 테이블을 사용하여 그림 1에서 해결한 것과 동일한 쿼리를 해결하고 있습니다. 파생 테이블은 이를 만드는 문 내에서만 액세스할 수 있으므로 일반적으로 쿼리를 읽고 유지 관리하기 어렵게 만듭니다. 이러한 문제는 동일한 일괄 처리 내에서 파생 테이블을 여러 번 사용하려는 경우에 가중됩니다. 다시 사용할 파생 테이블을 여러 번 복사하고 붙여 넣어야 하기 때문입니다.
 Figure 2 파생 테이블을 사용하는 쿼리
CTE는 뷰와 비슷하게 T-SQL을 훨씬 읽기 쉽게 만들어 주므로 이러한 시나리오에 잘 맞습니다. 또한 동일한 일괄 처리 내에서 곧 이은 후속 쿼리에서 다시 사용할 수도 있습니다. 물론 이 범위를 벗어나면 사용할 수 없게 됩니다. 또한 CTE는 언어 수준 구문이므로 SQL Server가 내부적으로 임시 또는 가상 테이블을 만들 필요가 없습니다. CTE의 기본 쿼리는 곧 이은 후속 쿼리에서 참조될 때마다 호출됩니다.
앞서 살펴본 것과 동일한 시나리오를 그림 3과 같이 CTE를 사용하여 작성할 수 있습니다. 집계된 데이터를 수집하는 EmpOrdersCTE는 CTE 바로 다음에 있는 쿼리에서 사용됩니다. CTE를 사용하는 그림 3의 코드는 쿼리를 매우 읽기 쉽게 만들어 주면서도 메타데이터를 저장하기 위한 시스템 개체를 만들지 않습니다.
 Figure 3 CTE를 사용한 쿼리
;WITH EmpOrdersCTE (EmployeeID, NumOrders, MaxDate) AS
(
  SELECT EmployeeID, COUNT(*), MAX(OrderDate)
  FROM Orders
  GROUP BY EmployeeID
)

SELECT 
    e.EmployeeID,  oe.NumOrders, oe.MaxDate,
    e.ReportsTo AS ManagerID,  om.NumOrders, om.MaxDate
FROM 
    Employees AS e
    INNER JOIN EmpOrdersCTE oe ON e.EmployeeID = oe.EmployeeID
    LEFT JOIN EmpOrdersCTE om ON e.ReportsTo = om.EmployeeID


CTE의 구조
다음은 간단한 CTE 예를 통해서 CTE를 작성하는 방법을 살펴보겠습니다. CTE는 WITH 키워드로 시작됩니다. 그러나 CTE가 일괄 처리의 첫 번째 문이 아닌 경우에는 WITH 키워드 앞에 세미콜론을 붙여야 합니다. 필자는 최선의 방법으로 모든 CTE 앞에 세미콜론을 붙이는 것을 선호합니다. 세미콜론이 필요한지 기억하는 것보다는 이렇게 하는 것이 훨씬 일관성이 있습니다.
WITH 키워드 다음에는 CTE의 이름을 지정하고 그 다음에는 선택적인 열 별칭 목록을 지정합니다. 열 별칭은 CTE 내의 SELECT 문에서 반환하는 열에 해당합니다. 선택적인 열 별칭 다음에는 필수 항목인 AS 키워드를 지정합니다. 그리고 AS 키워드 다음에는 CTE를 정의하는 쿼리 식을 괄호로 감싸고 지정합니다.
다음 예를 살펴보겠습니다.
;WITH myCTE (CustID, Co) AS
(
  SELECT CustomerID, CompanyName FROM Customers
)
SELECT CustID, Co FROM myCTE
CustomerID와 CompanyName열에는 CustID와 Co라는 별칭을 지정했으며, 곧이어 오는 CTE는 해당 열 별칭을 사용하여 CTE를 참조하는 SELECT 문입니다.

CTE의 이해
CTE 설계를 시작하기 전에 CTE가 작동하는 방식과 어떤 규칙을 따라야 하는지 이해해야 합니다. 이 섹션에서는 CTE를 사용할 수 있는 용도와 함께 CTE 내부에서 수행할 수 있는 작업과 그렇지 못한 작업에 대해 살펴보겠습니다. 우선 CTE는 T-SQL 일괄 처리, 사용자 정의 함수, 저장 프로시저, 트리고 및 뷰 내에서 만들고 사용할 수 있습니다.
CTE 바로 다음에 오는 문에서만 CTE를 참조할 수 있습니다. 이것은 CTE를 사용하려면 T-SQL 일괄 처리에서 CTE 다음에 즉시 CTE를 참조하는 쿼리를 작성해야 한다는 것을 의미합니다. 다름 들어 다음 일괄 처리는 오류가 발생합니다.
;WITH myCTE (CustID, Co) AS
(
  SELECT CustomerID, CompanyName FROM Customers
)
SELECT CompanyName FROM Customers WHERE CustomerID = 'ALFKI'
SELECT CustID, Co FROM myCTE
이 코드에서 myCTE는 바로 다음에 있는 첫 번째 쿼리에서만 사용할 수 있습니다. 두 번째 쿼리에서 myCTE를 참조하면 CTE는 범위를 벗어나며 "개체 이름 'myCTE'이(가) 잘못되었습니다."라는 예외가 발생합니다.
CTE는 어떤 방식으로든 데이터를 다시 처리하는 다른 쿼리에서 참조하기 위한 목적으로 사용되므로 CTE의 쿼리는 ORDER나 COMPUTE와 같은 문을 포함할 수 없습니다. 그러나 FOR XML과 같은 복잡한 문은 CTE를 정의하고 CTE에서 작동하도록 사용할 수 있습니다. 예를 들어 다음과 같이 FOR XML 절을 사용하여 CTE를 쿼리하고 해당 결과를 반환할 수 있습니다.
;WITH myCTE AS
(
  SELECT c.CustomerID, c.CompanyName, o.OrderID, o.OrderDate
  FROM Customers c 
  INNER JOIN Orders o ON c.CustomerID = o.CustomerID
)

SELECT CustomerID, CompanyName, OrderID, OrderDate 
FROM myCTE FOR XML AUTO
일단 CTE를 정의한 뒤에는 다음에 오는 첫 번째 쿼리에서 이를 여러 번 참조할 수 있습니다. 이러한 특성은 쿼리가 CTE를 두 번 이상 참조해야 하는 경우 특히 유용합니다. 그림 3의 코드 샘플에서는 쿼리에서 EmpOrdersCTE를 두 번 참조하여 직원과 해당 직원의 관리자를 얻는 방법을 보여 줍니다. 쿼리를 복제하는 것보다는 CTE를 두 번 참조하는 것이 더 간단하므로 이러한 방법은 동일한 행 집합을 두 번 이상 참조해야 하는 경우 매우 유용합니다.
CTE를 SELECT 문에서만 사용해야 하는 것은 아니며 CTE가 생성하는 행 집합을 참조하는 어떤 문에서나 CTE를 사용할 수 있습니다. 이것은 CTE 다음에 CTE를 사용하는 SELECT, INSERT, UPDATE 또는 DELETE 문이 올 수 있음을 의미합니다. CTE를 사용하는 쿼리에 전진 전용 및 스냅샷 커서를 사용할 수도 있습니다.
또는 CTE 다음에 다른 CTE가 오는 것도 가능합니다. 이 기술은 중간 결과를 행 집합에 수집하려는 경우 CTE로 다른 CTE를 만드는 데 사용할 수 있습니다. 다른 CTE로 구성된 CTE를 만들 때는 CTE 정의를 쉼표로 분리합니다.
그림 4에서는 직원의 목록과 각 직원별 전체 주문 횟수를 수집하는 EmpOrdersCTE를 정의합니다. MinMaxOrdersCTE라는 두 번째 CTE는 첫 번째 EmpOrdersCTE를 쿼리하고 행 집합에 집계 함수를 수행하여 직원의 평균, 최소 및 최대 주문 횟수를 확인합니다.
 Figure 4 다른 CTE를 참조하는 CTE
WITH 키워드 다음 쉼표로 분리하여 여러 개의 CTE를 정의할 수 있습니다. 이 경우 각 CTE는 다음 CTE에서 참조되어 새로운 CTE를 구성합니다. CTE 정의 다음에 오는 DML(데이터 조작 언어) 문에서는 WITH 절 내에 정의된 모든 CTE를 참조할 수 있습니다.

재귀의 규칙
재귀 알고리즘을 구현하는 데도 CTE를 사용할 수 있습니다. 재귀 논리는 스스로를 호출하는 알고리즘을 작성해야 할 때 유용하며, 데이터의 중첩된 집합을 탐색하는 데 자주 사용됩니다. T-SQL과 같은 언어에서 재귀 논리를 작성하기는 특히 까다롭지만 CTE를 설계한 목적 중 하나는 바로 이러한 재귀 논리를 해결하기 위한 것이었습니다. 재귀 CTE를 작성하는 기본 공식은 다음과 같습니다.
최상위 수준(앵커 멤버)을 반환하는 쿼리를 작성합니다.
재귀 쿼리(재귀 멤버)를 작성합니다.
첫 번째 쿼리에 재귀 번째 쿼리로 UNION을 수행합니다.
행이 반환되지 않는 경우에 대비합니다. 이것이 종료 검사입니다.
다음은 재귀 CTE의 예입니다.
;WITH myRecursiveCTE(col1, col2, ... coln) AS
  -- Anchor Member Query
  UNION ALL
  -- Recursive Member Query that references myRecursiveCTE
)
CTE를 포함하지 않는 사용자 지정 재귀 프로시저를 작성할 때는 반드시 명시적 종료 절을 추가해야 합니다. 종료 절은 최종적으로는 재귀 알고리즘을 종료하고 재귀 호출 스택을 원상 복귀하는 임무를 담당합니다. 이러한 절이 없으면 코드에 무한 루프가 발생합니다.
CTE에는 종료 절의 처리를 도울 수 있는 두 가지 측면이 있습니다. 첫 번째는 재귀 멤버가 레코드 0개를 반환하는 경우에 해당하는 암시적인 종료 절입니다. 이러한 경우 재귀 멤버 쿼리는 CTE를 재귀적으로 호출하지 않고 호출 스택을 원상 복귀합니다. 두 번째는 명시적으로 MAXRECURSION 수준을 설정할 수 있다는 것입니다.
MAXRECURSION 수준은 CTE를 포함하는 일괄 처리 내에서 명시적으로 설정하거나 서버 쪽 설정을 통해 설정할 수 있습니다. 서버 차원 설정의 기본값은 변경하지 않은 경우 100입니다. 이 설정은 CTE가 자신을 재귀적으로 호출할 수 있는 횟수를 제한합니다. 한계에 다다르면 예외가 발생합니다. MAXRECURSION 수준을 설정하는 구문은 다음과 같이 CTE 다음의 SELECT 문에서 OPTION 절을 사용하는 것입니다.
-- DEFINE YOUR CTE HERE
SELECT * FROM EmpCTE
OPTION (MAXRECURSION 7)
이 밖에도 재귀 CTE를 설계할 때 염두에 두어야 할 몇 가지 다른 규칙이 있습니다. 재귀 CTE는 앵커 멤버와 재귀 멤버를 모두 포함해야 합니다. 두 멤버에는 같은 수의 열이 있어야 하며 두 멤버에 속한 열은 데이터 형식이 일치해야 합니다. 재귀 멤버는 CTE를 한 번만 참조할 수 있으며 멤버에 다음 절이나 키워드를 사용할 수 없습니다.
SELECT DISTINCT
GROUP BY
HAVING
TOP
LEFT/RIGHT OUTER JOIN

간단한 재귀 연습
데이터와 행 집합의 관점에서 재귀는 동일한 데이터 집합에 대해 다른 조건을 적용하여 동일한 논리를 반복적으로 수행해야 하는 문제를 해결하는 데 사용됩니다. 예를 들어 모든 판매 사원을 검색하고 해당 사원의 관리자를 찾아 계층 순서대로 데이터를 반환해야 한다고 가정해 보겠습니다. 그림 5에서는 재귀를 사용하여 영업 부사장 밑에서 일하는 직원의 목록을 수집하는 CTE를 사용하는 솔루션을 보여 주고 있습니다.
 Figure 5 재귀적으로 판매 사원 정보 수집
몇 가지 추가적인 측면을 제외하고 그림 5에 있는 재귀 CTE는 표준 CTE와 매우 비슷합니다. 표준 CTE는 행 집합을 정의하는 쿼리 한 개를 포함하는데 반해, 재귀 CTE는 두 개의 쿼리 정의를 정의합니다. 첫 번째 쿼리 정의인 앵커 멤버는 CTE가 호출될 때 실행될 쿼리를 정의합니다. 두 번째 쿼리 정의인 재귀 멤버는 앵커 멤버와 동일한 열과 데이터 형식을 반환하는 쿼리를 정의합니다. 재귀 멤버는 또한 재귀적으로 CTE에 콜백을 수행하는 데 사용할 값을 검색합니다. 쿼리의 결과는 UNION 문을 사용하여 함께 가져오게 됩니다.
그림 5의 EmpCTE는 영업 부사장(EmployeeID = 2)에 대한 직원 레코드를 가져오는 앵커 멤버를 보여 줍니다. 앵커 멤버 쿼리의 마지막 열은 계층의 0번째 수준, 즉 최상위를 나타내는 0 값을 반환합니다. 재귀 멤버의 쿼리는 이전 직원 밑에서 근무하는 직원의 목록을 얻습니다. 이를 위해 Employees 테이블을 EmpCTE에 조인합니다.
재귀 멤버에서도 동일한 열이 검색되지만 SalesLevel 열은 현재 직원의 관리자를 얻고, 관리자의 SalesLevel을 얻은 다음, 이를 1만큼 증가시켜서 계산됩니다. m.SalesLevel+1 식은 우리의 앵커 멤버로부터 검색한 영업 부사장 바로 밑에서 근무하는 모든 직원에게 SalesLevel 1 값을 할당합니다. 이러한 직원 밑에서 일하는 모든 직원은 SalesLevel 2 값을 가집니다. SalesLevel 값은 영업 조직 계층의 이어지는 각 수준에서 이와 같이 점차적으로 증가합니다.

요약
쿼리 내에서 복잡한 파생 테이블을 사용하거나 T-SQL 일괄 처리 외부에 정의가 있는 뷰를 참조하는 것이 비하면 CTE는 T-SQL을 훨씬 읽기 쉽게 작성하는 방법을 제공합니다. CTE는 또한 재귀 알고리즘을 사용하는 데 따르는 어려움을 완화하는 데 도움을 주는 훨씬 개선된 도구를 제공합니다. 표준 CTE 또는 재귀 CTE 중 어떤 것을 사용하는지에 관계없이 CTE를 통해 여러 일반적인 개발 시나리오의 문제를 해결하고 성능을 저하시키지 않고도 가독성을 높일 수 있게 될 것입니다.

John에게 질문이나 의견이 있으면 다음 전자 메일 주소로 보내시기 바랍니다: mmdata@microsoft.com.


John Papa는 ASPSOFT(aspsoft.com)의 선임 .NET 컨설턴트로, 여름이면 밤마다 애견 Kadi를 데리고 가족과 함께 양키스 팀을 열광적으로 응원하는 야구광입니다. John은 C# MVP이며 ADO, XML 및 SQL Server에 대한 여러 권의 책을 저술했습니다. 그는 VSLive와 같은 업계 회의에서 자주 강연하며 codebetter.com/blogs/john.papa라는 블로그를 운영하고 있습니다.
:
Posted by Elick