http://www.sqler.com/339770

쓸만한게 없네 윤선식입니다.

 

여러군데 나온 적 있는 .NET CLR을 사용한 음력/양력 달력 만들기를 간단하게 설명하고자 합니다.

 

1. 새 프로젝트로 데이터베이스의 SQL CLR 프로젝트로 만듭니다.

sqlprojects.jpg

 

2. 이 때 SQL 연결설정을 해 주셔야 합니다. SQL Server Project는 SQL 2005 이상이어야 합니다.

 sqlconnection.jpg

 

3. 프로젝트를 생성하면 클래스가 나옵니다. 이 때 다음과 같이 .NET Code를 넣어주시면 됩니다.

  음력/양력 변환 소스인데요. 원리는 여러 군데 게시판에 있으니 설명을 생략하겠습니다.

 

using System;

using System.Data;

using System.Data.SqlClient;

using System.Data.SqlTypes;

using Microsoft.SqlServer.Server;

using System.Globalization;

 

public partial class UserDefinedFunctions

{

        [Microsoft.SqlServer.Server.SqlFunction]

        public static SqlDateTime Udf_Lunar2Solar(SqlDateTime sDt)

        {

               DateTime dt = (DateTime)sDt;

               bool bExistLeap = false;

 

               KoreanLunisolarCalendar kr_Lunnar = new KoreanLunisolarCalendar();

               int _lunnarYY = kr_Lunnar.GetYear(dt);

               int _lunnarMM = kr_Lunnar.GetMonth(dt);

               int _lunnarDD = kr_Lunnar.GetDayOfMonth(dt);

 

               if (kr_Lunnar.GetMonthsInYear(_lunnarYY) > 12)   

               {

                       bExistLeap = kr_Lunnar.IsLeapMonth(_lunnarYY, _lunnarMM);

                       int intLeap_mm = kr_Lunnar.GetLeapMonth(_lunnarYY);

                       if (_lunnarMM >= intLeap_mm)

                       {

                              _lunnarMM--;

                       }

               }

 

               return Convert.ToDateTime(_lunnarYY.ToString() + "-" + _lunnarMM.ToString() + "-" + _lunnarDD.ToString());

        }

};

 

4. .NET CLR을 SQL에 사용하려면 DB 설정을 변경해야 합니다.

SET NOCOUNT ON;

USE master;

EXEC sp_configure 'clr enabled', 1;

RECONFIGURE;

GO

 

5. 위와 같이 CLR을 사용하게 변경하고 나서 해당 Assembly를 DB에 등록합니다.

use TestDB

Go

 

CREATE ASSEMBLY UDF_Lunar2Solar

    FROM 'D:\SQLNetProjects\UDF_Lunar2Solar\UDF_Lunar2Solar\bin\Debug\UDF_Lunar2Solar.dll'

    WITH PERMISSION_SET = SAFE;

   

CREATE FUNCTION UFN_Lunar2Solar (@sDt as DATETIME)

RETURNS DateTime

AS EXTERNAL NAME UDF_Lunar2Solar.UserDefinedFunctions.Udf_Lunar2Solar

GO

 

6. Assembly를 Function에 정상적으로 등록하고 나면 Function으로 사용이 가능합니다.

with sTB as (

select x = dbo.UFN_Lunar2Solar(cast('1985-03-19' as datetime))

       , y = dbo.UFN_Lunar2Solar('19850319')

       , z = dbo.UFN_Lunar2Solar('1985/03/19')

)

select * from sTB

 

* 결과

x                       y                       z
----------------------- ----------------------- -----------------------
1985-01-28 00:00:00.000 1985-01-28 00:00:00.000 1985-01-28 00:00:00.000

(1개 행이 영향을 받음)

이상입니다.

 

+ Recent posts