728x90

OSQL 이란 도스나 콘솔상에서 SQL 문을 실행할수 있게 하는 프로그램이다. 주로 쿼리문 실행할라면 쿼리분석기, EM 을 이용하는데 어떤 경우에는 도스로 쿼리문을 실행해야 할 경우가 생긴다. 이때 이 OSQL 이란 프로그램을 사용한다.

참고로 나의 테스트 환경은 MS-SQL 7.0이다. SQL 2000도 물론 가능한데 6.5 버젼은 어떤지 모르겠다.그리고 OSQL은 MS-SQL 설치하면 자동으로 설치되는 프로그램이다. 환경변수로 잡혀있으므로 그냥 도스상 어느 디렉토리에서도 OSQL 실행 가능하다.(Copy가 명령어 어디서든지 가능한것 처럼)

간단한 OSQL 사용

자 그럼 사용해 보자. 사용법은 간단하다. 일단 도스창을 연 후 아래의 구문을 실행해 보자. 그럼 다음과 같은 결과가 보일것이다.

osql -Usa -P -Q "select * from Northwind..Region"

구문을 살펴보자 아래를 보면 색으로 구분을 줘서 더 살펴보기 쉬울꺼다.그래도 굳이 설명하자면 -U는 사용자, -P는 암호, -Q는 쿼리문이다. 따라서 아래 구문을 해석하면 'sa란 사용자로(암호는 없음) select * from Northwind..Region 쿼리문을 실행해라' 라고 볼 수 있다.

주의 : -U, -P 등 플래그들은 대소문자를 구분한다.!!

osql -Usa -P -Q "select * from Northwind..Region"

방금전 구문은 로컬 DB에 엑서스 했을 경우이다. 다른 네트워크 상의 DB 내용을 보려면 다음과 같이 하면 된다.

osql -Smungchung -Usa -P1234 -Q "select * from Northwind..Region"

위의 구문을 보면 -Smungchung 이 추가됨을 알 수 있다. -S는 서버 플래그를 나타내고 mungchung는 서버명을 나타낸다. 해석해 보자면 'mungchung란 서버에 아이디 sa 암호 1234로 로그인 한 후 select * from Northwind..Region 쿼리문을 실행시켜라' 이다.

파일을 이용한 OSQL

지금까지는 아주 단순한 쿼리문을 실행했는데 쿼리문이 길어진다고 하면 어떻게 할까? 도스창에서 그 길고긴 쿼리들 다 적기는 무리일 것이다. -_-; (오타라도 하나 나면 -_-;; 수정하기 쉽지 않다.)여기 osql에 i라는 플래그가 있다. 입력 파일 플래그를 뜻하는데 이 플래그를 사용하면 파일의 내용을 실행한다.

메모장으로 다음 내용을 입력한 후 test.sql 이라는 파일명으로 저장한다. (확장자는 사실 아무거나 해도 상관없다.test.txt로 해도 아무 상관 없다. 하지만 sql 확장자가 쿼리분석기에서 사용되므로 확장자를 sql로 하였다.)

USE NorthWind
SELECT a.ProductID, b.SupplierID, a.ProductName, b.CompanyName
FROM Products a
JOIN Suppliers b
	ON a.SupplierID = b.SupplierID
WHERE a.ProductID < 4

도스나, 콘솔창을 연 후 다음 구문을 실행한다.

osql -Usa -P -i d:\test.sql

OSQL 응용 범위

osql은 단순히 도스상에서 sql명령어 이용하라고 만들어진것은 아니다. 요새 도스 이용하는 사람도 없는데 왜 이 osql이 MS-SQL 버젼이 높아져도 없어지지 않을까? 솔직히 나도 100%로 왜 그런지는 모르지만 어디서 유용하게 쓰이는지는 안다.얄팍한 경험으로 비춰보면 osql은 다른 시스템간에 인터페이스 할때 이용되거나 백업할때 이용된다. 이 osql을 이용할경우 도스로 배치스크립트 작성해서 매일 매일 해야하는 작업이나 주단위 작업등을 간편하고 빠르게 해결 할수 있다. 나중에 기회가 된다면 이 osql을 좀더 멋지게 이용하는 방법을 적어보겠다.

OSQL 구문

다음은 osql 에서 사용되는 구문이다. 몇가지 빠진 플래그들이 있지만 다음에 나온는 플래그들만 해도 충분할것이다. ( [] 로 묶여진 플래그들은 생략 가능한 플래그다.) 좀더 자세하게 osql 에 대해서 알고자 한다면 도움말을 참고하기 바란다.

osql 
	-U<로그인ID>
	[-d]
	[-Q"쿼리문"]
	[-q"쿼리문"]
	[-c<명령종료자"]
	[-h<헤더들>]
	[-w<열너비>]
	[-s<열구분기호>]
	[-t<제한시간>]
	[-m<오류수준>]
	[-H<워크스테이션이름>]
	[-P<암호>]
	[-S<서버이름>]
	[-i<입력파일>]
	[-o<출력파일>]
	[-a<패킷크기>]
	[-l<제한시간>]

*) 참고도서 : Professional SQL Server 2000 Programming (Wrox.) 437p

 

출처 : http://www.mungchung.com/xe/lecture/4100

728x90

1. BCP 유틸리티 이용

DECLARE @Query VARCHAR(1000)
DECLARE @FileName VARCHAR(1000)
DECLARE @Command VARCHAR(2000)

SET @Query = 'SELECT au_fname, au_lname FROM pubs..authors ORDER BY au_lname'
SET @FileName = 'C:\Authors.txt'
SET @Command = 'BCP "' + @Query + '" queryout ' + @FileName + ' -c '
EXEC master..xp_cmdshell @Command


아무 에러가 안생겼다면 C:\에 Authors.txt 이 생겼을것이다.. 물론 DB 서버에~~~

문제점 : 데이터중 케리지리턴 값이 들어가 있으면 파일 생성 실패가 떨어진다... ㅠ.ㅠ
[MSDN에서 bcp 유틸리티 / xp_cmdshell  로 검색하면 자세한 정보를 얻을 수 있다.]


2. OSQL 유틸리티 이용

DECLARE @Query VARCHAR(1000)
DECLARE @FileName VARCHAR(1000)
DECLARE @Command VARCHAR(2000)

SET @Query = 'SELECT au_fname, au_lname FROM pubs..authors ORDER BY au_lname'
SET @FileName = 'C:\Authors.txt'
SET @Command = 'OSQL -E /Q "' + @Query + '" /o ' + @FileName+ ''
EXEC master..xp_cmdshell @Command


-- 3. OACreate 이용 (이놈 신기하네~~~)
DECLARE @FS INT
DECLARE @RC INT
DECLARE @FileID INT

DECLARE @Query VARCHAR(1000)
DECLARE @FileName VARCHAR(1000)

SET @FileName = 'C:\Authors.txt'

-- A. OLE개체 인스턴스 생성
EXEC @RC = sp_OACreate 'Scripting.FileSystemObject', @FS OUT
IF @RC <> 0
BEGIN
 PRINT 'Error:  Creating the file system object'
END
-- B. File Open
EXEC @RC = sp_OAMethod @FS, 'OpenTextFile' , @FileID OUT, @FileName, 8, 1
IF @RC <> 0
BEGIN
 PRINT 'Error:  Opening the specified text file'
END

-- C. Write
EXEC @RC = sp_OAMethod @FileID, 'WriteLine', Null, '테스트'
IF @RC <> 0
BEGIN
 PRINT 'Error:  Writing string data to file'
END

-- D.OLE 개체를 삭제
EXECUTE @RC = sp_OADestroy @FileID
EXECUTE @RC = sp_OADestroy @FS

1, 2번처럼 DB의 내용을 그대로 파일로 쓰는것은 아니고 지정한 텍스트를 파일로 만든다..

OACreate 를 이용하여 'Scripting.FileSystemObject'를 생성한다는게 너무 신기하지 않은가?? ㅋㅋㅋ

============================================================================================

특정 테이블의 데이타를 Row단위로 파일로 만들어야 했다..
BCP 유틸을 봤을때.. 너무 기뻤지만 (싸게 갈수 있겠구나 ㅋㅋ 라는 생각에.. )  기쁨도 잠시 ㅠ.ㅠ
케리지 리턴이 존재할 경우 파일로 만들수가 없었다...
"아니 대용량 데이타 Copy 해주는 명령어가.. 케리지 리턴이 있다고 Copy를 못해?? "
라고 생각 하시겠지만.. 프롬프트 상태에서는 BCP명령어만 주기 때문에 가능 하지만 현재는 Q/A에서 돌리기 때문에.. 한 라인으로 인식하지 못하고.. 에러가 나는게 아닐까?? 라는 생각을 해본다 ㅋㅋ(아님 말고 -_-;; 암턴 안된다.. )
2번 마찬가지 -_-;; 같은 이유로 할수 없었다...
3번을 봤을때.. 너무 기뻤다..
아니 sql에서 fso를써??? 이.럴.수.가 @.@ ~~~
MSDN에서 SP_OACreate로 검색하면... 많은 정보를 얻을수 있다..

[출처] [MSSQL] DB의 특정 자료를 파일로 만들기 |작성자 필립박

+ Recent posts