연습: 관리 코드로 저장 프로시저 만들기
업데이트: 2007년 11월
이제 SQL Server 2005 데이터베이스용 저장 프로시저를 Visual Basic, C# 및 C++ 등의 .NET Framework 언어를 사용하는 관리 코드로 작성할 수 있습니다. 관리 코드로 작성된 저장 프로시저는 CLR 저장 프로시저라고 합니다.
SQL Server 프로젝트에 저장 프로시저 항목을 추가하여 SQL 저장 프로시저를 만들 수 있습니다. SQL Server에 배포한 후에는 관리 코드로 만든 저장 프로시저를 다른 저장 프로시저처럼 호출하고 실행할 수 있습니다.
이 연습에서 수행할 작업은 다음과 같습니다.
새 Windows 응용 프로그램 프로젝트 만들기
관리 코드로 저장 프로시저 만들기
SQL Server 2005 데이터베이스에 저장 프로시저 배포
데이터베이스에서 저장 프로시저를 테스트하는 스크립트 만들기
데이터베이스에서 데이터를 쿼리하여 저장 프로시저가 올바르게 실행되었는지 확인
사전 요구 사항
이 연습을 완료하려면 다음과 같은 요건을 갖추어야 합니다.
- SQL Server 2005에서 실행 중인 AdventureWorks 샘플 데이터베이스에 대한 연결. 자세한 내용은 방법: 샘플 데이터베이스 설치를 참조하십시오.
프로젝트 만들기
새 SQL Server 프로젝트를 만들려면
파일 메뉴에서 새 프로젝트를 만듭니다.
SQL Server 프로젝트를 선택하고 프로젝트의 이름을 SQLCLRStoredProcedure로 지정한 후 확인을 클릭합니다. 자세한 내용은 방법: SQL Server 프로젝트 만들기를 참조하십시오.
SQL Server 2005 데이터베이스에 연결
이 연습을 수행하려면 SQL Server 2005에서 실행 중인 AdventureWorks 샘플 데이터베이스에 연결되어 있어야 합니다. 서버 탐색기에서 AdventureWorks 샘플 데이터베이스에 연결할 수 있으면 데이터베이스 참조 추가 대화 상자에 이러한 연결이 나열됩니다.
참고: |
---|
기본적으로 CLR(공용 언어 런타임) 통합 기능은 Microsoft SQL Server에서 해제됩니다. SQL Server 프로젝트 항목을 사용하려면 이를 설정해야 합니다. CLR 통합 기능을 사용하도록 설정하려면 sp_configure 저장 프로시저의 clr enabled 옵션을 사용합니다. 자세한 내용은 CLR 통합 설정을 참조하십시오. |
AdventureWorks 샘플 데이터베이스에 연결하려면
연결 추가 대화 상자를 완료하여 SQL Server 2005에 포함된 AdventureWorks 샘플 데이터베이스에 연결합니다. 자세한 내용은 연결 추가/수정(Microsoft SQL Server)을 참조하십시오.
- 또는 -
데이터베이스 참조 추가 대화 상자에서 AdventureWorks 샘플 데이터베이스에 대한 기존 연결을 선택합니다. 자세한 내용은 데이터베이스 참조 추가 대화 상자를 참조하십시오.
SQL Server 저장 프로시저 만들기
SQL Server 프로젝트를 만든 후 저장 프로시저를 추가합니다.
SQL Server 저장 프로시저를 만들려면
프로젝트 메뉴에서 새 항목 추가를 클릭합니다.
새 항목 추가 대화 상자에서 저장 프로시저를 선택합니다.
새 저장 프로시저의 이름으로 InsertCurrency를 입력합니다.
추가를 클릭합니다.
코드 편집기에서 코드를 다음과 같이 바꿉니다.
참고: C++ 예제는 /clr:safe 컴파일러 옵션을 사용하여 컴파일해야 합니다.
Imports System Imports System.Data Imports System.Data.SqlClient Imports System.Data.SqlTypes Imports Microsoft.SqlServer.Server Partial Public Class StoredProcedures <SqlProcedure()> _ Public Shared Sub InsertCurrency( _ ByVal currencyCode As SqlString, ByVal name As SqlString) Using conn As New SqlConnection("context connection=true") Dim InsertCurrencyCommand As New SqlCommand() Dim currencyCodeParam As New SqlParameter("@CurrencyCode", SqlDbType.NVarChar) Dim nameParam As New SqlParameter("@Name", SqlDbType.NVarChar) currencyCodeParam.Value = currencyCode nameParam.Value = name InsertCurrencyCommand.Parameters.Add(currencyCodeParam) InsertCurrencyCommand.Parameters.Add(nameParam) InsertCurrencyCommand.CommandText = _ "INSERT Sales.Currency (CurrencyCode, Name, ModifiedDate)" & _ " VALUES(@CurrencyCode, @Name, GetDate())" InsertCurrencyCommand.Connection = conn conn.Open() InsertCurrencyCommand.ExecuteNonQuery() conn.Close() End Using End Sub End Class
using System; using System.Data; using System.Data.SqlClient; using System.Data.SqlTypes; using Microsoft.SqlServer.Server; public partial class StoredProcedures { [SqlProcedure()] public static void InsertCurrency_CS( SqlString currencyCode, SqlString name) { using (SqlConnection conn = new SqlConnection("context connection=true")) { SqlCommand InsertCurrencyCommand = new SqlCommand(); SqlParameter currencyCodeParam = new SqlParameter("@CurrencyCode", SqlDbType.NVarChar); SqlParameter nameParam = new SqlParameter("@Name", SqlDbType.NVarChar); currencyCodeParam.Value = currencyCode; nameParam.Value = name; InsertCurrencyCommand.Parameters.Add(currencyCodeParam); InsertCurrencyCommand.Parameters.Add(nameParam); InsertCurrencyCommand.CommandText = "INSERT Sales.Currency (CurrencyCode, Name, ModifiedDate)" + " VALUES(@CurrencyCode, @Name, GetDate())"; InsertCurrencyCommand.Connection = conn; conn.Open(); InsertCurrencyCommand.ExecuteNonQuery(); conn.Close(); } } }
#include "stdafx.h" #using <System.dll> #using <System.Data.dll> #using <System.Xml.dll> using namespace System; using namespace System::Data; using namespace System::Data::Sql; using namespace System::Data::SqlClient; using namespace System::Data::SqlTypes; using namespace Microsoft::SqlServer::Server; // In order to debug your Stored Procedure, add the following to your debug.sql file: // // EXEC InsertCurrency_CPP 'AAA', 'Currency Test' // SELECT * FROM Sales.Currency WHERE CurrencyCode = 'AAA' public ref class StoredProcedures { public: [SqlProcedure] static void InsertCurrency_CPP(SqlString currencyCode, SqlString name) { SqlConnection ^conn = gcnew SqlConnection("context connection=true"); SqlCommand ^insertCurrencyCommand = gcnew SqlCommand(); SqlParameter ^currencyCodeParam = gcnew SqlParameter("@CurrencyCode", SqlDbType::NVarChar); SqlParameter ^nameParam = gcnew SqlParameter("@Name", SqlDbType::NVarChar); insertCurrencyCommand->CommandText = "insert Sales.Currency(CurrencyCode, Name, ModifiedDate)" + " values(@CurrencyCode, @Name)"; insertCurrencyCommand->Connection = conn; conn->Open(); insertCurrencyCommand->ExecuteNonQuery(); conn->Close(); } };
저장 프로시저 배포, 실행 및 디버깅
새 저장 프로시저를 만든 후에는 F5 키를 눌러 빌드, SQL Server에 배포 및 디버깅을 수행할 수 있습니다. 먼저 프로젝트의 TestScripts 폴더에 있는 Test.sql 파일에 저장 프로시저를 실행하고 테스트하는 코드를 추가합니다. Visual C++에서 이 파일의 이름은 debug.sql입니다. 테스트 스크립트를 만드는 방법에 대한 자세한 내용은 방법: SQL 개체를 실행하도록 Test.sql 스크립트 편집을 참조하십시오.
SQL 디버깅에 대한 자세한 내용은 SQL 데이터베이스 개체 디버깅을 참조하십시오.
InsertCurrency 저장 프로시저를 배포하고 실행하려면
Visual Basic 및 Visual C#의 경우 솔루션 탐색기에서 TestScripts 폴더를 확장하고 Test.sql 파일을 두 번 클릭합니다.
Visual C++의 경우 솔루션 탐색기에서 debug.sql 파일을 두 번 클릭합니다.
Test.sql(Visual C++의 경우 debug.sql) 파일의 코드를 다음 코드로 바꿉니다.
EXEC InsertCurrency 'AAA', 'Currency Test' SELECT * from Sales.Currency where CurrencyCode = 'AAA'
F5 키를 눌러 저장 프로시저를 빌드, 배포 및 디버깅합니다. 디버깅하지 않고 배포하는 방법에 대한 자세한 내용은 방법: SQL Server에 SQL Server 프로젝트 항목 배포를 참조하십시오.
출력 창에 표시된 결과를 보고 다음에서 출력 보기: 데이터베이스 출력을 선택합니다.
참고 항목
작업
방법: CLR SQL Server 저장 프로시저 만들기 및 실행
방법: CLR SQL Server 트리거 만들기 및 실행
방법: CLR SQL Server 집계 만들기 및 실행
방법: CLR SQL Server 사용자 정의 함수 만들기 및 실행
방법: CLR SQL Server 사용자 정의 형식 만들기 및 실행
개념
관리 코드를 사용하여 데이터베이스 개체를 만드는 경우의 이점
참조
SQL Server 프로젝트 및 데이터베이스 개체의 특성