반응형


김종열

MS SQL Server MVP

엔트리브 소프트


함수 만드는 거 하나 더 해볼까요?

 

앞서 이야기 했던 함수 종류인 Table을 리턴 하는 함수를 하나 만들어볼까 합니다.

함수의 기능은 아주 단순합니다. ASCII 파일을 읽어서 QUERY의 결과에 TABLE 형식으로 리턴해주는
 Table Return 함수입니다.
또한 앞강에서 인자의 사용법을 알았으니 파일의 경로를 인자로 처리하여 경로에 있는 파일을 읽는 것으로 하겠습니다.

 

주의하실 점은 지금까지는 대부분의 C# 코드는 하나의 CLASS 되었었는데
이번엔 하나의 METHOD가 더 있어야 합니다.
TABLE
을 리턴하므로 TABLE을 만들어주는 METHOD-
FillRowMethodName”- 있어야 합니다.


1.     기존 프로젝트인 PRJ_CLR OPEN합니다.

2.     사용자 정의 함수를 추가시킵니다. (PROJECT에서 오른 마우스를 클릭 > ADD > NEW ITEM)
    (이미지는 전 강의를 참고하십시오.)

3.     NEW ITEM에서 사용자 정의 함수를 선택하고 이름을 “UDF_READ_FILE.CS”라고 입력

4.     여기까지 하고 아래와 같은 소스를 입력한다. (소스는 첨부하였습니다.)

using System;

using System.Data;

using System.Data.SqlClient;

using System.Data.SqlTypes;

using Microsoft.SqlServer.Server;

using System.IO;

using System.Collections;

 

 

public partial class UserDefinedFunctions

{

    [Microsoft.SqlServer.Server.SqlFunction(FillRowMethodName = "fillTable", TableDefinition="txt nvarchar(4000)")]

    public static IEnumerable UDF_READ_FILE(SqlString fname)

    {

        string[] sItems;

        StreamReader oSr;

        char cDelimeter = Convert.ToChar("\n");

        string c_fname = Convert.ToString(fname);

 

        try

        {

            if (File.Exists(c_fname))

            {

                oSr = new StreamReader(c_fname, System.Text.Encoding.Default);

                sItems = oSr.ReadToEnd().Split(cDelimeter);

                oSr.Close();

 

                return (sItems);

            }

            else

            {

                throw new System.Exception("File Not found");

            }

        }

        catch

        {

            return null;

        }

    }

 

    private static void fillTable(object obj, out SqlString sItem)

    {

        string sTemp = Convert.ToString(obj);

        sItem = (SqlString)sTemp;

    }

};

 


갑자기 기존의 코드보다 복잡하다고 혹시 당황해하시고 있는 것은 아닌지 모르겠습니다.
관심이 있으신 분은 C#에 대한 공부를 다른 루틴으로 하시기 바랍니다. 공부를 하시게 되면 위의 코드는 그렇게 어려운 소싱이 아니게 될 것이라 믿고 싶습니다. (개인적으로는..)

5.     Visual Studio의 컴파일 및 배포를 이용하자.

6. 여기까지 이상없었다면 바로 Query에서 샘플텍스트를 읽고자 할 것입니다.

 

SELECT * FROM DBO.UDF_READ_FILE('C:\TEMP\SAMPLE.TXT');

 


그런데 예전처럼 한번에 결과가 나오지 않네요.


이유는 조금 있다가 설명을 드리기로 하고 제대로 나오게 다음과 같은 설정을 더해줍시다.
  Solution  Exploer에서 prject에 오른 마우스를 누르고 property를 선택하십시오.



데이터베이스를 선택한 다음 Database 그리고 permition level을 외부 라고 지정합니다.




pub한 뒤 배포를 하면 텍스트에 직접 쿼리를 하신 결과를 만나게 됩니다. (5, 6과정)

 

USE YOULYDB

GO

 

 

SELECT * FROM DBO.UDF_READ_FILE('C:\TEMP\SAMPLE.TXT');

 

/*

txt

--------------------

www.sqllearder.com

www.naver.co.kr

www.empas.kr

 

 

(4 row(s) affected)

*/

 

 

 

 

Permission level이란? (Query에서는 Permission_set {safe|Extrnal_access | Unsafe}

CLR은 결국 외부에서 만든 dll의 모듈을 사용하게 되는데요. 이 코드에 액세스할 때는 부여된 코드에 액세스 권한을  지정합니다. 지정하지 않으면 기본적으로 safe가 됩니다. 

 

Safe는 가장 제한적인 권한으로 파일, 네트워크, 환경변수, 레지스트리, 외부 시스템 리소스에 액세스 할 수 없습니다. 즉 자신의 시스템에서 가벼운(강의로 따지면 이 이전까지?) 레벨의 처리라고 할 수 있으며, 시스템에 영향을 줄 수 있는 것을 못 쓰게 하는 것입니다. 즉 시스템에게는 safe라고 할 수 있겠네요.

External access safe와 반대로 외부의 리소스 및 파일, 네트워크 등등을 호출할 수 있슴을 나타냅니다.

Unsafe를 사용하게 되면 sql server 인스턴스의 내부 리소스와 외부 리소스 모두 제한 없이 액세스하게 되며, unsafe mode에서 실행되는 코드는 비관리 코드를 호출할 수 있습니다

 

 

도움파일 : UDF_READ_FILE.CS

          SAMPLE.TXT

반응형

'연구개발 > CLR' 카테고리의 다른 글

CLR 강좌 - TEXT파일 읽기2  (0) 2009.06.22
등록된 DLL 정보 확인하기  (0) 2009.06.22
CLR 강좌_ 함수 인자 주고 받기  (0) 2009.06.22
CLR 권한 처리 문제  (0) 2009.06.22
CLR 강좌 - CLR_수동배포  (0) 2009.06.22

+ Recent posts