이 글은 Visual Studio 2008 SP1 과 SQL Server 2005 를 기준으로 작성되었습니다.
BS가 이런 저런 이유로 SQL Server에서 순수한 SQL 문법만으로는 처리하기 힘든 몇가지가 있어서
.Net 의 도움을 받으려고 자료를 대충 찾아보고 삽으로 땅을 파서 대충 만든 소스입니다.
약간의 수정??이 필요하지만 기본적인 모습은 갖추고 있습니다. ㅎㅎ
그럼 이제 설명을 시작하겠습니다.
1. SQL Server 프로젝트 만들기
Visual Studio 2008을 실행하여 새 프로젝트에 가면 Visual C#의 데이터베이스 프로젝트 형식에서 찾을 수 있습니다.

그리고 DB 정보를 입력합니다.

디버깅에 대한 프롬프트가 하나 뜨는데 디버깅 하는 동안 서버의 모든 관리되는 스레드가 중지됩니다.
즉, .Net 어셈블리를 사용하는 기능이 디버깅동안 중지됨을 말합니다.
일단 No…
프로젝트 생성이 끝났습니다.
2. 코드 추가하기
생성된 프로젝트에 파일을 추가합니다. 타입은 C# 클래스입니다.
이제 생성된 소스에 아래 내용을 넣어봅시다.
using System;
using System.Data;
using System.Data.Sql;
using System.Data.SqlTypes;
using System.Data.SqlClient;
using Microsoft.SqlServer.Server;
using System.Collections;
public partial class MyTest
{
// Table Value Function
[SqlFunction(FillRowMethodName = “FillTVFRow”, TableDefinition = “F1 NVARCHAR(50), F2 INT”)]
public static IEnumerable TestTVF()
{
return new TestTVFReader();
}
// Scalar Value Function
[SqlFunction]
public static SqlString TestSVF()
{
return new SqlString(“Test”);
}
// Stored Procedure
[SqlProcedure]
public static void TestProc()
{
using (SqlConnection conn = new SqlConnection(@”context connection=true”))
{
conn.Open();
SqlTransaction trans = conn.BeginTransaction();
try
{
// Drop Table
{
SqlCommand cmd = new SqlCommand(“IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[TestTable]’) AND type in (N’U’)) DROP TABLE TestTable”, conn, trans);
cmd.ExecuteNonQuery();
}
// Create Table
{
SqlCommand cmd = new SqlCommand(“CREATE TABLE TestTable (F1 NVARCHAR(50) NOT NULL, F2 INT NOT NULL)”, conn, trans);
cmd.ExecuteNonQuery();
}
// Insert Data 1
{
SqlCommand cmd = new SqlCommand(“INSERT INTO TestTable (F1, F2) VALUES (@F1,@F2)”, conn, trans);
cmd.Parameters.Add(“@F1”, SqlDbType.NVarChar, 50);
cmd.Parameters.Add(“@F2”, SqlDbType.Int);
cmd.Parameters[0].Value = “Test Value”;
cmd.Parameters[1].Value = 123;
cmd.ExecuteNonQuery();
cmd.Parameters[0].Value = “Test Value 2”;
cmd.Parameters[1].Value = 456;
cmd.ExecuteNonQuery();
}
// Insert Data 2
{
SqlCommand cmd = new SqlCommand(“INSERT INTO TestTable (F1, F2) SELECT * FROM [TestTVF]()”, conn, trans);
cmd.ExecuteNonQuery();
}
trans.Commit();
}
catch (Exception)
{
trans.Rollback();
}
}
}
public static void FillTVFRow(object row, out SqlString str, out SqlInt32 num)
{
object[] rowarr = (object[])row;
str = (SqlString)(rowarr[0]);
num = (SqlInt32)(rowarr[1]);
}
public class TestTVFReader : IEnumerable
{
public TestTVFReader()
{
}
public IEnumerator GetEnumerator()
{
return new TestTVFEnumerator();
}
private class TestTVFEnumerator : IEnumerator
{
int pos;
public TestTVFEnumerator()
{
Reset();
}
public void Reset()
{
pos = -1;
}
public bool MoveNext()
{
++pos;
return (pos < 2);
}
public object Current
{
get
{
object[] row = new Object[2];
row[0] = new SqlString(“Test”);
row[1] = new SqlInt32(10);
return row;
}
}
}
}
}
3. 이제 배포를 해 봅니다.
빌드 메뉴에서 솔루션 배포를 선택합니다.
배포하고 나면 아래와 같이 확인이 됩니다.

4. 테스트 해보기
SQL Server Management Studio 를 통해서 쿼리를 실행해 봅니다.
SELECT * FROM [dbo].[TestTVF]();
SELECT [dbo].[TestSVF]();
EXEC [dbo].[TestProc];
SELECT * FROM [TestTable];
5. 예제 소스 파일
cfile10.uf.13445E3B5006322605741C.cs