반응형



 

김종열

MS SQL Server MVP

엔트리브 소프트


이번에도 TABLE RETURN함수 입니다.

이번 함수의 역할은 특별한 구분자-저는 여기서 “,”를 사용했습니다.-의 데이터로 구분되어진 파일이 있습니다.

텍스트 파일의 내용은 대강 이렇습니다. (첨부하였습니다.)

1, www.sqllearder.com

2, www.naver.co.kr

3, www.empas.kr



이 파일의 결과를 쿼리하게 되면 아래와 같은 식이 되게 하는 함수입니다.

NUM

TXT

1

www.sqllearder.com

2

www.naver.co.kr

3

www.empas.kr

 

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

2.     사용자 정의 함수를 추가시킵니다. (PROJECT에서 오른 마우스를 클릭 > ADD > NEW ITEM)

3.     NEW ITEM에서 사용자 정의 함수를 선택하고 이름을 “UDF_READ_FILE_2_ARRAY.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 = "fillTable2", TableDefinition = "Num nvarchar(20), Txt nVarchar(1000)")]

    public static IEnumerable UDF_READ_FILE_2_ARRAY(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 fillTable2(Object obj, out SqlString Num, out SqlString Txt)

    {

        string sTemp = Convert.ToString(obj);

        string[] arr_temp = sTemp.Split(',');

        try

        {

            Num = (SqlString)arr_temp[0];

            Txt = (SqlString)arr_temp[1];

        }

        catch

        {

            Num = null;

            Txt = null;

        }

 

    }

}

 


TABLE DEFINITION부분과 FILLTABLE에서 인자를 갑자기 둘로 주는 부분이 보이시죠?

그 부분이 이번 강의 요입니다. 그리고 저 SPLIT이라는 함수를 눈여겨 봐주십시오. 간단히 설명하면 구분자로 분리하여 문자열(STRING) 배열로 잡는 함수입니다.


5.    
Visual Studio의 컴파일 및 배포를 해줍니다.

 

이전 강의를 하셨다면 permition level을 외부 라고 지정이 되어 있을 겁니다.
그렇지 않다면 이전 강의를 참고하시기 바랍니다.

 

USE YOULYDB

GO

 

 

SELECT * FROM DBO.UDF_READ_FILE_2_ARRAY('C:\TEMP\SAMPLE2.TXT')

/*

Num                  Txt

1                     www.sqllearder.com

2                     www.naver.co.kr

3                     www.empas.kr

NULL                 NULL

(4 row(s) affected)

*/

 

 

FILLTABLE이나 TABLE DEFINITION은 실무에 맞게 변경하셔서 사용하시기 바랍니다.



도움파일 : UDF_READ_FILE_2_ARRAY.CS

          SAMPLE.TXT


반응형

+ Recent posts