·Î±×ÀÎ | ȸ¿ø°¡ÀÔ (´º½º·¹ÅͽÅû) | SITEMAP
   
  °³¹ß   Ç÷§Æû   ½Ã½ºÅÛ   ¸Å´ÏÁö¸ÕÆ®   Àüü±â»ç  
ÀÚ¹Ù
´å³Ý
C/C++
DB
¸ðµ¨¸µ
À¥°³¹ß
±âŸ
À¯´Ð½º/¸®´ª½º
À©µµ¿ì
±âŸ
¼­¹ö
³×Æ®¿öÅ©
º¸¾È
±âŸ
BM
PM
±âŸ
 
±â»çÀúÀå
0
 
¸¶ÀÌ ½ºÅ©·¦
[SQL ¼­¹ö 2005 ½ÇÀü Ȱ¿ë] ¨è ´å³Ý°úÀÇ ÅëÇÕ

ÇÑ¿ëÈñ (·Ôµ¥Á¤º¸Åë½Å)   2005/07/20
¿¬Àç¼ø¼­
1. T-SQLÀÇ »õ·Î¿î ¸ð½À
2. VS.NETÀ¸·Î °³¹ßÇÏ´Â SQL ¼­¹ö 2005
3. SQL ¼­¹ö 2005 °ü¸®ÀÚ¸¦ À§ÇÑ º¯È­
4. DB º¸È£¿Í º¹±¸¸¦ À§ÇÑ »õ·Î¿î ¸ðµ¨
[Áöµð³ÝÄÚ¸®¾Æ]SQL ¼­¹ö 2005ÀÇ °¡Àå Å« º¯È­¶ó°í ÇÑ´Ù¸é ¾Æ¸¶µµ ´å³Ý ÇÁ·¹ÀÓ¿÷°úÀÇ ÅëÇÕÀÏ °ÍÀÌ´Ù. ÀÌÁ¦´Â Äõ¸®¹®À» C#À» ÀÌ¿ëÇØ¼­ °³¹ßÇÒ ¼ö ÀÖÀ» »Ó¸¸ ¾Æ´Ï¶ó C#À» ÅëÇØ¼­ T-SQLÀÌ ÇÏÁö ¸øÇÏ´Â ±â´ÉÀ» ¸¶À½²¯ È®ÀåÇÒ ¼öµµ ÀÖ´Ù. À̹ø ±Û¿¡¼­´Â CLR¿¡ ÅëÇÕµÈ SQL ¼­¹ö 2005ÀÇ »õ·Î¿î ¸ð½ÀÀ» »ìÆìº»´Ù.

¿¬Àç °¡À̵å¿î¿µÃ¼Á¦ : À©µµ¿ì 2000, À©µµ¿ì 2003, À©µµ¿ì XP
°³¹ß¾ð¾î : MS SQL ¼­¹ö 2005 º£Å¸ 2, ºñÁÖ¾ó ½ºÆ©µð¿À 2005 º£Å¸ 1
±âÃÊÁö½Ä : MS SQL ¼­¹ö 2000, C#
ÀÀ¿ëºÐ¾ß : MS SQL ¼­¹ö 2005 °ü¸®¿Í °³¹ß
Áö³­ ±Û¿¡¼­´Â T-SQLÀÇ »õ·Î¿î ¸ð½À¿¡ ´ëÇÏ¿© »ìÆì º¸¾Ò´Ù. T-SQLÀº ¾ð¾î ÀÚü°¡ ÁýÇÕÀû ¾ð¾îÀ̱⠶§¹®¿¡ ¿©ÀüÈ÷ µ¥ÀÌÅ͸¦ Á¶ÀÛÇϰí Á¢±ÙÇϴµ¥ À־´Â ´å³Ý ¾ð¾î º¸´Ù ´õ ÁÁÀº ¼º´ÉÀ» ³ªÅ¸³½´Ù. ÇÏÁö¸¸ T-SQLÀº ÀýÂ÷Àû ¾ð¾îÀ̱⠶§¹®¿¡ °´Ã¼ÁöÇâÀû ÇÁ·Î±×·¡¹ÖÀ» ÇÒ ¼ö ¾ø´Ù´Â ´ÜÁ¡ÀÌ ÀÖ´Ù.

±×·¯³ª ´å³ÝÀ» ÀÌ¿ëÇÏ¸é ´õ ÀÌ»ó ÀÌ ¹®Á¦·Î °í¹ÎÇÏÁö ¾Ê¾Æµµ µÈ´Ù. C#, VB.NET, Managed C++¸¦ ÀÌ¿ëÇØ¼­ ¾ó¸¶µçÁö °´Ã¼ÁöÇâÀû ÇÁ·Î±×·¡¹ÖÀÌ °¡´ÉÇÏ´Ù. ¶ÇÇÑ º¹ÀâÇÑ ·ÎÁ÷À̳ª °è»ê, ¿ÜºÎ ÀÚ¿ø ¿¬µ¿, ÄÚµå Àç»ç¿ëµî¿¡ À־´Â T-SQL º¸´Ù ´õ ÁÁÀº Á¢±Ù¼º°ú ¼º´ÉÀ» º¸¿©ÁØ´Ù. ÇѸ¶µð·Î .NET ÇÁ·¹ÀÓ¿÷°úÀÇ ÅëÇÕÀº T-SQLÀ» ±³Ã¼ÇÏ´Â °³³äÀÌ ¾Æ´Ï¶ó, ´õ¿í È®ÀåÇÏ°í °­È­Çϱâ À§ÇÏ¿© µµÀÔµÈ °ÍÀ̶ó°í º¸¸é µÈ´Ù.

SQL Server 2005°¡ .NET ÇÁ·¹ÀÓ¿÷°ú ÅëÇյǸ鼭 ¾ÈÁ¤¼ºÀÌ ´ëÆø Çâ»óµÇ¾ú´Ù. ÀÌÀü SQL Server 2000¿¡¼­ È®Àå ÀúÀå ÇÁ·Î½ÃÀú¸¦ C++¸¦ ÀÌ¿ëÇØ¼­ ÀÛ¼ºÀ» ÇÏ´Â °æ¿ì, °£È¤ À߸øµÈ ÄÚµå·Î ÀÎÇÏ¿© SQL Server Àüü°¡ ´Ù¿îµÇ¾î ¹ö¸®´Â °æ¿ì°¡ ÀÖ¾ú´Ù. ±×·¡¼­ È®Àå ÀúÀå ÇÁ·Î½ÃÀú¸¦ ¸Å¿ì ½ÅÁßÇÏ°Ô ¸¸µé¾î¾ß ÇßÀ¸¸ç ¸¸µå´Â °úÁ¤ ÀÚüµµ °£´ÜÇÏÁö°¡ ¾Ê¾Ò´Ù.

ÇÏÁö¸¸ SQL Server 2005¿¡¼­´Â ±âº»ÀûÀ¸·Î .NET ÇÁ·¹ÀÓ¿÷ÀÇ È£½ºÆÃ ¸ðµ¨À» µû¶ó°£´Ù. SQL Server 2005¿Í °¢°¢ÀÇ .NET ÄÚµå·Î ¸¸µé¾îÁø È®Àå ÀúÀåÇÁ·Î½ÃÀú´Â ¼­·ÎÀÇ µ¶¸³¼ºÀ» º¸ÀåÇÑ´Ù. ¼­·Î ¸Þ¸ð¸®¸¦ Á÷Á¢ÀûÀ¸·Î ħ¹üÇÒ ¼ö ¾øÀ¸¸ç, ¼­·ÎÀÇ ½ÇÇà ȯ°æÀ» Ä§ÇØ ÇÒ ¼öµµ ¾ø´Ù. °¢°¢ º°µµ·Î ¿î¿µµÈ´Ù´Â °ÍÀÌ´Ù.

<±×¸²1>À» º¸¸é .NET ÇÁ·¹ÀÓ¿÷ÀÇ È£½ºÆÃ ¸ðµ¨ÀÌ ¿Í ÀÖ´Ù. SQL Server¿Í ¿ÜºÎ ¾î¼Àºí¸®´Â ¼­·Î ´Ù¸¥ µµ¸ÞÀÎÀ» °¡Áö°í ÀÖ¾î ÀÚ½ÅÀÇ µ¶¸³ÀûÀÎ ½ÇÇà ȯ°æÀ» º¸È£ÇÑ´Ù. ±×·¡¼­ ÀÌÁ¦´Â È®Àå ÀúÀå ÇÁ·Î½ÃÀú ¶§¹®¿¡ ´õ ÀÌ»ó SQL Server°¡ ´Ù¿îµÇ´Â ÀÏÀº ¾ø´Ù.

<±×¸²1> .NET ÇÁ·¹ÀÓ¿÷ È£½ºÆÃ

SQL Server´Â ÀÚ±â ÀڽŸ¸ÀÇ Æ¯º°ÇÑ ¾²·¹µå ½ºÄÉÁÙ¸µ, µ¿±âÈ­, Àá±Ý, ¸Þ¸ð¸® ÇÒ´ç Á¤Ã¥À» °¡Áö°í ÀÖ´Ù. SQL Server ÀÚü°¡ ¿ö³« ¸Þ¸ð¸®¸¦ ¸¹ÀÌ »ç¿ëÇÏ°í ¼º´ÉÀÌ Áß¿äÇÑ ±â¾÷¿ë ¾ÖÇø®ÄÉÀ̼ÇÀ̱⠶§¹®¿¡ º¸ÅëÀÇ CLR¿¡¼­ Á¦°øÇÏ´Â Á¤Ã¥À» µû¸£Áö ¾Ê°í ÀÚ±â ÀڽŸ¸ÀÇ Æ¯º°ÇÑ ¹æ½ÄÀ» Àû¿ëÇØ¼­ ¿î¿µÀ» ÇÑ´Ù.

¾à ¿ÜºÎ ¾î¼Àºí¸®°¡ CPU³ª ¸Þ¸ð¸®¸¦ °úµµÇÏ°Ô ¸¹ÀÌ ½á¼­ SQL Server¸¦ ¿î¿µÇϴµ¥ ÁöÀåÀ» Áشٸé, SQL Server´Â À̸¦ Áï½Ã ŽÁöÇØ ³»°í ÇØ´ç »ç¿ë±ÇÀ» ¿ÜºÎ ¾î¼Àºí¸®·ÎºÎÅÍ »¯¾î¿Â´Ù. ÀÌ·¸°Ô ÇÔÀ¸·Î½á SQL Server´Â ´õ ÀÌ»ó ¿ÜºÎÀÇ °£¼·¿¡ ¿µÇâÀ» ¹ÞÁö ¾Ê°í, ÀÚ±â ÀÚ½ÅÀ» ½º½º·Î Áö¼ÓÀûÀ¸·Î ¾ÈÁ¤ÀûÀ¸·Î ¿î¿µÇÒ ¼ö ÀÖ´Â ´É·ÂÀ» °¡Áö°Ô µÇ¾ú´Ù.

°£´ÜÇÑ »ç¿ëÀÚ Á¤ÀÇ ÇÔ¼ö ¸¸µé±â
¸ÕÀú °£´ÜÇÑ »ç¿ëÀÚ Á¤ÀÇ ÇÔ¼ö¸¦ C#À¸·Î ¸¸µé¾î º¼ °ÍÀÌ´Ù. º¹ÀâÇÑ Ç¥Çö½ÄÀ̳ª °è»êÀ» ¿äÇÏ´Â ÀÛ¾÷ÀÇ °æ¿ì C#À¸·Î ¸¸µå´Â °ÍÀÌ ´õ È¿À²ÀûÀ̹ǷΠÀ̹ø ¿¹Á¦¿¡¼­´Â ¿ìÆí¹øÈ£¸¦ üũÇÏ´Â °£´ÜÇÑ Á¤±Ô½Ä Ç¥Çö ÇÔ¼ö¸¦ ¸¸µé¾î º¸ÀÚ.

¸ÕÀú VS.NETÀ» ½ÃÀÛÇÏ°í »õ·Î¿î ÇÁ·ÎÁ§Æ®·Î SQL Server Project¸¦ ¼±ÅÃÇÑ´Ù. CLRExÀ̶ó´Â »õ·Î¿î ÇÁ·ÎÁ§Æ®¸¦ ¸¸µé°í AdventureWorks DB ¼­¹ö¿¡ ¿¬°áÇÑ ÈÄ »õ·Î¿î ¾ÆÀÌÅÛÀ¸·Î IsValidZipCode¶ó´Â »ç¿ëÀÚ Á¤ÀÇ ÇÔ¼ö¸¦ Ãß°¡ÇÑ´Ù.

<È­¸é1> SQL Server¿ë ÅÛÇø´

<È­¸é2> IsValidZipCode Ãʱ⠻ý¼º È­¸é

±×·¯¸é <È­¸é2>¿Í °°Àº ÅÛÇø´ Äڵ尡 µé¾îÀÖ´Ù. ¿©±â¿¡¼­ ÁÖÀÇÇØ¼­ º¸¾Æ¾ß ÇÒ °ÍÀº ÇÔ¼ö À§¿¡ ÀÖ´Â ¼Ó¼º [SqlFunction]ÀÌ´Ù. ÀÌ ¼Ó¼ºÀº ¾Æ·¡ÀÇ ÇÔ¼ö°¡ SQL¿¡¼­ »ç¿ëÇÏ´Â »ç¿ëÀÚ Á¤ÀÇ ÇÔ¼öÀÓÀ» ÄÄÆÄÀÏ·¯¿¡°Ô ¾Ë·ÁÁÖ´Â Áö½ÃÀÚÀÌ´Ù. ÀÌÁ¦ ±âº» ÄÚµå´Â Áö¿ì°í ¾Æ·¡¿Í °°ÀÌ ÄÚµùÀ» ÇÏÀÚ.

using System;
using System.Data.Sql;
using System.Data.SqlTypes;

public partial class UserDefinedFunctions
{
  [SqlFunction]
  public static bool IsValidZipCode(SqlString ZipCode)
  {
    return System.Text.RegularExpressions.Regex.IsMatch(ZipCode.ToString(), @"^\d{3}-\d{3}");
  }
};

[ Partial Class ]  
»ç¿ëÀÚ Á¤ÀÇ ÇÔ¼ö¿Í ÀúÀå ÇÁ·Î½ÃÀú¿¡ º¸¸é partial ¸ø º¸´ø »õ·Î¿î Ŭ·¡½º Áö½ÃÀÚ°¡ ÀÖ´Â °ÍÀ» º¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ÀÌ´Â Visual Studio 2005 ¿¡¼­ »õ·Î ³ª¿Â °³³äÀ¸·Î Ŭ·¡½º¸¦ ºÎºÐÀûÀ¸·Î ³ª´©¾î ¿Ï¼ºÇÒ ¼ö ÀÖ´Â ±â´ÉÀÌ´Ù. ÀÌ´Â ÇϳªÀÇ Å¬·¡½º¸¦ ¿©·¯ °³¹ßÀÚ°¡ ¿©·¯ ÆÄÀÏ·Î ºÐÇÒÇØ¼­ ¸¸µé °æ¿ì ³ªÁß¿¡ ÇÕÃÄÁà¾ß ÇÏ´Â ºÒÆí ¾øÀÌ, ÀÌ Áö½ÃÀÚ Çϳª¸é ÄÄÆÄÀÏ·¯°¡ ¾Ë¾Æ¼­ ÇϳªÀÇ Å¬·¡½º·Î ÀνÄÇØ¼­ ÄÄÆÄÀÏÀ» ÇÑ´Ù. ¿¹¸¦ µé¸é ¾Æ·¡¿Í °°ÀÌ ÇϳªÀÇ Å¬·¡½º¸¦ µÎ °³ÀÇ ÆÄÀÏ·Î ³ª´©¾î¼­ ¸¸µé ¼ö ÀÖ´Ù.

// File: MyClassP1.cs
public partial class MyClass
{
  public void method1()
  {
  }
}
// File: MyClassP2.cs
public partial class MyClass
{
  public void method2()
  {
  }
}

MyClass¶ó´Â Ŭ·¡½º´Â µÎ °³ÀÇ ¸Þ¼Òµå¸¦ °®´Â Ŭ·¡½º·Î¼­ ÀÌ·¸°Ô µÎ °³ÀÇ ÆÄÀÏ·Î ³ª´©¾î¼­ Á¤ÀÇÇÒ ¼ö ÀÖ´Ù. ¿¹Á¦¿¡ ÀÖ´Â »ç¿ëÀÚ Á¤ÀÇ ÇÔ¼ö¿¡ partialÀ̶ó´Â Áö½ÃÀÚ°¡ ºÙÀ½À¸·Î½á ¾ÕÀ¸·Î ¸¸µå´Â ¸ðµç »ç¿ëÀÚ Á¤ÀÇ ÇÔ¼ö´Â ÇϳªÀÇ Å¬·¡½º·Î ¸¸µç´Ù´Â Àǹ̰¡ µÈ´Ù.

°£´ÜÇÏ°Ô ÇØ´ç ¹®ÀÚ¿­ÀÌ ¿ìÆí¹øÈ£½ÄÀÎÁö °Ë»çÇÏ¿© °á°ú¸¦ ¸®ÅÏÇØ ÁÖ°í ÀÖ´Ù. ÀÌÁ¦ ÀÌ Äڵ带 ÄÄÆÄÀÏÇÏ¿© ¹èÆ÷±îÁö ÇÏÀÚ. ±×·¯¸é ÀÚµ¿À¸·Î SQL Server¿¡ ÀÌ ¾î¼Àºí¸®°¡ µî·ÏÀÌ µÈ´Ù. ¹èÆ÷¸¦ ¼º°øÀûÀ¸·Î ³¡³»¸é ¾Æ·¡¿Í °°ÀÌ Å×½ºÆ®¸¦ ÇØº¸ÀÚ.

select dbo.IsValidZipCode('333-333');
select dbo.IsValidZipCode('333-A33');

-----
1
(1 row(s) affected)
-----
0
(1 row(s) affected)

Àß ÀÛµ¿ÇÏ´Â °ÍÀ» º¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù. »ç¿ëÀÚ Á¤ÀÇ ÇÔ¼ö¸¦ ¸¸µé¾î¼­ »ç¿ëÇØ º¸¾Ò´Âµ¥, ÇÔ¼ö¸¦ ¸¸µé°í ¹èÆ÷ ÇÏ´Â °ÍÀÌ °£´ÜÇÏ´Ù´Â °ÍÀ» ´À²¼À» °ÍÀÌ´Ù. ±×·³ SQL Server ³»ºÎ¿¡´Â ¾î¶»°Ô µî·ÏÀÌ µÇ¾î ÀÖ´Â °ÍÀϱî?

SELECT * FROM sys.assemblies;

sys.assemblies¶ó´Â ºä¸¦ º¸¸é ÇØ´ç CLREx À̶ó´Â ¾î¼Àºí¸®°¡ µî·ÏµÇ¾î ÀÖ´Â °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

SELECT * FROM sys.assembly_files;

sys.assembly_files¿¡´Â ½ÇÁ¦ ¾î¼Àºí¸®ÀÇ ³»¿ëÀÌ µé¾îÀÖ´Ù. Áï, DLL ¹ÙÀ̳ʸ® ÀÚü¸¦ SQL Server¾È¿¡ µî·Ï ÇÑ °ÍÀÌ´Ù. ±×·¯¹Ç·Î Çѹø ¾î¼Àºí¸®¸¦ SQL Server¾È¿¡ ¹èÆ÷¸¦ Çϸé ÇØ´ç DLL ÆÄÀÏÀº ¾ø¾îµµ ¹«¹æÇÏ´Ù.

À§¿¡¼­´Â ¹èÆ÷¸¦ VS.NETÀ» ÀÌ¿ëÇØ¼­ ÀÚµ¿À¸·Î ¹èÆ÷¸¦ ÇÏ¿´Áö¸¸, ¼öµ¿À¸·Î ¹èÆ÷ÇÏ´Â ¹æ¹ýµµ ÀÖ´Ù.

CREATE ASSEMBLY UDF1
FROM '\\localhost\Projects\CLREx\CLREx\bin\Debug\CLREx.dll';

CREATE FUNCTION IsValidZipCode(@ZipCode nvarchar(10))
RETURNS bit
EXTERNAL NAME
CLREx.UserDefinedFunctions.IsValidZipCode;

À§¿Í °°ÀÌ ¸ÕÀú ¾î¼Àºí¸®¸¦ µî·ÏÀ» Çϰí ÇØ´ç ÇÔ¼ö¸¦ ¸¸µé¾î ÁÖ¸é ¼öµ¿À¸·Îµµ µî·ÏÀ» ÇÒ ¼ö ÀÖ´Ù.

ÀÌÁ¦´Â ÀúÀå ÇÁ·Î½ÃÀú¸¦ C#À¸·Î ¸¸µç´Ù°í?
À̹ø¿¡´Â ÀúÀå ÇÁ·Î½ÃÀú¸¦ ¸¸µé¾î º¸ÀÚ. ÀúÀå ÇÁ·Î½ÃÀú¸¦ ¸¸µé·Á¸é ¸ÕÀú SQL¹®ÀåÀ» ½ÇÇàÇØ¼­ °á°ú¸¦ ¸®ÅÏÇØ¾ß ÇÑ´Ù. ±×·¯±â À§Çؼ­´Â ¾î¼Àºí¸®°¡ DB¿¡ Á¢¼ÓÀ» ÇØ¼­ SQL¹®ÀåÀ» º¸³»ÁÖ¾î¾ß ÇÑ´Ù. ÀϹÝÀûÀ¸·Î ADO.NETÀ» ÀÌ¿ëÇØ¼­ DB¿¡ Á¢¼ÓÀ» ÇÏÁö¸¸ ±âÁ¸ÀÇ ¿¬°á ¹æ¹ýÀ» »ç¿ëÇÒ °æ¿ì¿¡´Â ¿ÜºÎ¿¡¼­ Á¢¼ÓÇØ µé¾î¿À´Â °ÍÀ̹ǷΠ¼º´É»ó¿¡ ¹®Á¦°¡ ÀÖ´Ù.

µû¶ó¼­ ³»ºÎ Á¢¼ÓÀ» À§ÇÑ º°µµÀÇ Data Provider°¡ ÇÊ¿äÇѵ¥ ±×°ÍÀÌ ¹Ù·Î SQL Server Managed ProviderÀÌ´Ù. ÀÌ ÇÁ·Î¹ÙÀÌ´õ´Â SQL Server ³»¿¡¼­ ½ÇÇàµÇ¹Ç·Î º°µµÀÇ Á¢¼ÓÀ» ¸ÎÀ» ÇÊ¿ä ¾øÀÌ ºü¸£°Ô ¼öÇàÀ» ÇÑ´Ù. µû¶ó¼­ open, close¿Í °°Àº ÀýÂ÷°¡ ÇÊ¿ä¾ø´Â Data ProviderÀÌ´Ù. »ç¿ë ¹æ¹ýÀº ¾Æ·¡¿Í °°ÀÌ ¼±¾ðÀ» ÇÏ¸é µÈ´Ù.

using System.Data.SqlServer;

SQL Server Managed Provider¿¡´Â È¿°úÀûÀÎ ÀÛ¾÷À» À§ÇÏ¿© ¸î°¡Áö ŸÀÔÀ» Á¦°øÇÑ´Ù. SqlCommand, SqlPipe, SqlResultSet, SqlTransaction, SqlTriggerContext ¿Í °°Àº ŸÀÔÀ» Á¦°øÇÑ´Ù. ÀÌÁß ´ëºÎºÐÀº SqlClient¿¡ ÀÖ´Â °Í°ú µ¿ÀÏÇϰí SqlPipe¿Í SqlTiggerContext°¡ À̹ø¿¡ »õ·Î µîÀåÇÑ Å¸ÀÔÀÌ´Ù. SqlTiggerContext´Â Æ®¸®°Å ÀÛ¼ºÀ» À§ÇÑ Å¸ÀÔÀ̰í SqlPipe´Â Å×À̺í°ú °°Àº µ¥ÀÌÅ͸¦ È£Ãâ ÇÏ´Â ÂÊ¿¡ º¸³» ÁÙ¶§ »ç¿ëÇϴ ŸÀÔÀÌ´Ù. ±×·¯¸é SqlResultSet°ú ¹¹°¡ ´Ù¸£³Ä°í ÇÒ ¼öµµ ÀÖ´Ù.

SqlResultSetÀº ¼º´É ¹®Á¦·Î ÀÎÇÏ¿© »ç¿ëÀ» ±ÇÇÏÁö ¾Ê´Â ŸÀÔÀ̰í(ÀÌÁ¦´Â ¾ø¾îÁúÁöµµ ¸ð¸¥´Ù) SqlPipe°¡ ¼º´É»ó ´õ ÁÁÀº ŸÀÔÀÌ´Ù. SqlPipe´Â ¸» ±×´ë·Î È£ÃâÀÚ¿¡°Ô ÆÄÀÌÇÁ·Î ¹°À» º¸³»µíÀÌ µ¥ÀÌÅ͸¦ ¹Þ´Â Áï½Ã ¹Ù·Î º¸³½´Ù. ¼º´É¸é¿¡¼­µµ T-SQLÀÇ ÀúÀå ÇÁ·Î½ÃÀú¿Í °ÅÀÇ ºñ½ÁÇÑ ¼º´ÉÀ» º¸¿©ÁØ´Ù. ±×·¯¹Ç·Î ¾ÕÀ¸·Î Å×ÀÌºí µ¥ÀÌÅ͸¦ ¸®ÅÏ ¹Þ´Â °æ¿ì¿¡´Â SqlPipe¸¦ ½á¾ß ÇÑ´Ù. ¶ÇÇÑ .NET ÀúÀå ÇÁ·Î½ÃÀú´Â ¸®ÅϰªÀ¸·Î intÇü°ú voidÇü¸¸À» ¸®ÅÏ ÇÒ ¼ö ÀÖÀ¸¹Ç·Î ¾îÂ÷ÇÇ SqlResultSet Çü½ÄÀ¸·Î ¸®ÅÏÇÏÁöµµ ¸øÇÑ´Ù.

À̹ø¿¡´Â Á÷Á¢ ÀúÀå ÇÁ·Î½ÃÀú¸¦ ¸¸µé¾î º¸ÀÚ. ÀÌÀü¿¡ ¸¸µç ÇÁ·ÎÁ§Æ®¿¡ ÀúÀåÇÁ·Î½ÃÀú¸¦ Çϳª Ãß°¡ÇÏ°í ¾Æ·¡¿Í °°ÀÌ ÄÚµùÀ» ÇÑ´Ù.

using System;
using System.Data;
using System.Data.Sql;
using System.Data.SqlServer;
using System.Data.SqlTypes;


public partial class StoredProcedures
{
  [SqlProcedure]
  public static void SelectEmp(SqlInt16 val)
  {
    SqlCommand sqlCmd = SqlContext.GetCommand();

    sqlCmd.CommandText = "SELECT * FROM HumanResources.Employee "
      + "WHERE DepartmentID = @pDeptID";

    // ÆÄ¶ó¸ÞÅͰª ´ëÀÔ
    sqlCmd.Parameters.AddWithValue("@pDeptID", (Object)val);

    // SqlPipe¸¦ ÀÌ¿ëÇÏ¿© °á°ú ¸®ÅÏ
    SqlContext.GetPipe().Execute(sqlCmd);
  }
};

À̹ø ¿¹Á¦´Â »ç¿ëÀÚ Å×ÀÌºí¿¡¼­ ƯÁ¤ ºÎ¼­ÀÇ »ç¶÷µéÀ» ÃßÃâÇÏ´Â ÀúÀåÇÁ·Î½ÃÀúÀÌ´Ù. À̸¦ ÄÄÆÄÀÏ ÇÏ°í ¹èÆ÷ÇÑ ´ÙÀ½ ¾Æ·¡¿Í °°Àº SQL¹®ÀåÀ¸·Î Å×½ºÆ® ÇØ º¸¸é °á°ú¸¦ º¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

EXEC dbo.SelectEmp 4;

»ç¿ëÀÚ Á¤ÀÇ µ¥ÀÌÅÍ Å¸ÀÔÀ» ÀÌ¿ëÇÏ¿© ³ª¸¸ÀÇ µ¥ÀÌÅÍ Å¸ÀÔÀ» ¸¸µéÀÚ
SQL Server¿¡´Â ±âº»ÀûÀ¸·Î CHAR, INT¿Í °°Àº ±âº» µ¥ÀÌÅÍ Å¸ÀÔÀ» Áö¿øÇÑ´Ù. ¿©±â¿¡ ´õ È®ÀåÀ» ÇÏ¿© ¿ì¸®°¡ ¿øÇÏ´Â µ¥ÀÌÅÍ Å¸ÀÔÀ» ½º½º·Î ¸¸µé¾î¼­ Ãß°¡ÇÒ ¼öµµ ÀÖ´Ù. ¿¹¸¦ µé¸é, À§µµ, °æµµ, Æ÷ÀÎÆ®¸¦ ³ªÅ¸³»´Â µ¥ÀÌÅÍ Å¸ÀÔÀ̶óµçÁö À̸ÞÀÏ ÁÖ¼Ò¸¦ ³ªÅ¸³»´Â µ¥ÀÌÅÍ Å¸ÀÔÀ» »õ·Î ¸¸µé¾î¼­ Ãß°¡ÇÒ ¼ö ÀÖ´Ù. Æ÷ÀÎÆ®¸¦ º¸¸é 10:30 °ú °°Àº Ç¥Çö½ÄÀ» ¼ö¿ëÇÏ´Â ÇϳªÀÇ Ä®·³À» ¸¸µé ¼öµµ ÀÖ´Ù. ±×·±µ¥ »ç½Ç ÀÌ·¯ÇÑ Ç¥ÇöÀº ±âÁ¸ÀÇ Ä®·³À» µÎ °³·Î ³ª´©¾î¼­ x, y ÁÂÇ¥ °ªÀ» ÀúÀåÇØµµ µÈ´Ù. ±¸Áö »ç¿ëÀÚ Á¤ÀÇ µ¥ÀÌÅÍ Å¸ÀÔ(User-Defined Data Types)(UDT)À» ¾È ¸¸µé¾îµµ ÇÒ ¼ö´Â ÀÖ´Ù.

ÇÏÁö¸¸, Àǹ̻ó Çϳª·Î Ç¥ÇöÇÏ´Â °ÍÀÌ ´õ Ÿ´çÇϰí, ±× ÀÚ·áÇü°ú °ü·ÃµÈ ¸¹Àº ¸Þ¼­µå³ª ÇàÀ§°¡ ÇÊ¿äÇÒ ¶§¿¡´Â ÇϳªÀÇ µ¥ÀÌÅÍÇüÀ¸·Î ¸¸µå´Â °ÍÀÌ ¹Ù¶÷Á÷ÇÏ´Ù. ¿¹¸¦ µé¸é ³¯Â¥ °°Àº µ¥ÀÌÅÍ Å¸ÀÔÀ» ³â,¿ù,ÀÏ·Î ³ª´©¾î¼­ 3°³ÀÇ Ä®·³¿¡ ÀúÀåÇÏ´Â °Í º¸´Ù´Â ³â¿ùÀÏ Çϳª·Î ¸¸µé¾î¼­ ÇϳªÀÇ Ä®·³¿¡ ÀúÀåÇÏ´Â °ÍÀÌ ´õ Àǹ̻ó ´õ Ÿ´çÇÏ´Ù´Â °ÍÀº ´©±¸³ª ¾Ë°í ÀÖ´Ù.

¶ÇÇÑ ³¯Â¥¿Í °ü·ÃµÈ ¸¹Àº ¸Þ¼­µå¿Í Á¦¾à»çÇ×µéÀÌ Àֱ⠶§¹®¿¡ À̸¦ 3°³ÀÇ Ä®·³À¸·Î ³ª´©¾î¼­ ó¸®ÇÏ´Â °ÍÀº ¸¹Àº ºÒÇÊ¿äÇÑ ÄÚµåµéÀ» ÇÊ¿ä·Î ÇÑ´Ù. ¿¹¸¦ µé¸é ¿ù¿¡ 1¿ùÀ» ´õÇϰųª »©´Â ¿¬»ê°ú °°Àº °ÍµéÀ» ÇϳªÀÇ µ¥ÀÌÅÍ Å¸ÀÔ¿¡ °°ÀÌ ³Ö¾î µÎ¸é ¾îµð¼­³ª ¼Õ½±°Ô ²ø¾î´Ù ¾µ ¼ö ÀÖ´Ù. SQL ServerÀÇ UDT´Â µ¥ÀÌÅÍ ÀÚü»Ó¸¸ ¾Æ´Ï¶ó ¸Þ¼­µåµµ °°ÀÌ Æ÷ÇÔ ÇÒ ¼ö ÀÖÀ¸¹Ç·Î (»ç½Ç UDT´Â Ŭ·¡½º³ª ±¸Á¶Ã¼·Î Á¤ÀÇÇÑ´Ù) ÀÌ·¯ÇÑ ±¸ÇöÀÌ °¡´ÉÇÏ´Ù.

ÀÚ ±×·³ ¿©±â¼­ ÀÌ·± »ý°¢±îÁö ÇÏ´Â »ç¶÷ÀÌ ÀÖÀ» ¼öµµ ÀÖ´Ù. ¡°UDT¸¦ Ŭ·¡½ºÀÇ °³³äÀ¸·Î º¼ ¼ö ÀÖÀ¸´Ï, ÀÌÁ¦´Â °´Ã¼¸¦ ±×´ë·Î DB¿¡ ÀúÀå ÇÒ ¼ö ÀÖ´Ù´Â ¾ê±â±º. ±×·³ ¾Æ¿¹ »ç¿ø(Employee) °´Ã¼¸¦ Åë°·Î DB¿¡ ÀúÀåÇØ º¼±î?¡± ¿©±â±îÁö »ý°¢À» ÇÏ¸é ¡°±×µ¿¾È ¹ÌµéƼ¾î¿¡¼­ Çß´ø OR¸ÅÇÎ(Object Relational Mapping)ÀÌ ´õ ÀÌ»ó ÇÊ¿ä ¾ø´Â ÁøÁ¤ÇÑ °´Ã¼ÁöÇâÀÇ DB°¡ ź»ýÇß±º!¡± À̶ó°í »ý°¢ÇÏ´Â »ç¶÷ÀÌ ÀÖÀ» ¼öµµ ÀÖ´Ù.

Ʋ¸° ¾ê±â´Â ¾Æ´Ï´Ù. ÇÏÁö¸¸ ¼º´É°ú ¿ë·®ÀÌ ¹®Á¦°¡ µÈ´Ù. UDT´Â 8KB¶ó´Â »çÀÌÁî Á¦ÇÑÀÌ ÀÖ°í, Àε¦½Ì ó¸®ÀÇ Á¦¾à, ±×¸®°í µ¥ÀÌÅÍ ¾÷µ¥ÀÌÆ®½Ã ºÎÇϰ¡ ÀÖ´Ù. ±×·¯¹Ç·Î UDT´Â ±×·¯ÇÑ º¹ÀâÇÑ °´Ã¼¸¦ ÀúÀåÇÏ´Â µ¥¿¡´Â ÀûÀýÇÏÁö ¾Ê´Ù. óÀ½¿¡ ¿¹¸¦ µé¾ú´ø, À§µµ, °æµµ, Æ÷ÀÎÆ®¿Í °°ÀÌ °¡º­¿î °´Ã¼¸¦ ÀúÀåÇÒ ¶§¿¡¸¸ ÀÌ UDT¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù.

UDT´Â °á±¹ Ŭ·¡½º¸¦ Çϵåµð½ºÅ©¿¡ ÀúÀåÇÏ´Â °ÍÀ̱⠶§¹®¿¡ Á÷·ÄÈ­¸¦ ÇØ¾ß ÇÑ´Ù. Á÷·ÄÈ­¸¦ À§Çؼ­´Â µ¥ÀÌÅÍÀÇ Å©±â°¡ Áß¿äÇÏ´Ù. ±âº»ÀûÀ¸·Î .NET ȯ°æ¿¡¼­´Â °ªÅ¸ÀÔ(Value Type)°ú ÂüÁ¶Å¸ÀÔ(Refernce Type)À̶ó´Â µÎ °¡Áö ŸÀÔÀÌ ÀÖ´Ù. °ªÅ¸ÀÔÀº int, char°ú °°ÀÌ ½ÇÁ¦ µ¥ÀÌÅͰ¡ Á÷Á¢ Àִ ŸÀÔÀ̰í, ÂüÁ¶ ŸÀÔÀº string°ú °°ÀÌ ½ÇÁ¦ µ¥ÀÌÅͰ¡ ¾Æ´Ñ µ¥ÀÌÅÍÀÇ ÁÖ¼Ò°¡ µé¾îÀִ ŸÀÔÀ» ¸»ÇÑ´Ù. µû¶ó¼­ ÀÌµé µ¥ÀÌÅÍ Å¸ÀÔ¿¡ µû¶ó ÀúÀåÇÏ´Â ¹æ¹ýµµ ´Þ¶óÁø´Ù.

°ªÅ¸ÀÔÀº ´ëºÎºÐ °íÁ¤µÈ ±æÀ̸¦ °¡Áö°í ÀÖÀ¸¹Ç·Î ÄÄÆÄÀÏ·¯°¡ ¾Ë¾Æ¼­ ±× Å©±â¸¦ °è»êÇÒ ¼ö ÀÖÁö¸¸, ÂüÁ¶ ŸÀÔÀÇ °æ¿ì ±× Å©±â°¡ ¾ó¸¶³ª µÉÁö ¸ð¸¥´Ù. ±×·¡¼­ Çϵåµð½ºÅ©¿¡ ¾ó¸¶ Á¤µµÀÇ °ø°£À» ÇÒ´çÇØ¾ß ÇÏ´ÂÁö ¸ð¸£´Â °ÍÀÌ´Ù. ±×·¡¼­ ÂüÁ¶ ŸÀÔÀ» Á÷·ÄÈ­ ÇÏ´Â °æ¿ì¿¡´Â »ç¿ëÀÚ°¡ Á÷Á¢ ±× ¹æ¹ýÀ» Á¤ÀǸ¦ ÇØÁà¾ß ÇÑ´Ù. Á÷·ÄÈ­ ¹æ¹ýÀ» Á¤¸®ÇØ º¸¸é ¾Æ·¡¿Í °°ÀÌ 3°¡Áö ¹æ¹ýÀÌ ÀÖ´Ù.

¡ß SerializedDataWithMetadata
°ªÅ¸ÀÔÀ̳ª ÂüÁ¶ ŸÀÔ¿¡ °ü°è¾øÀÌ ¾î¶² µ¥ÀÌÅÍ Å¸ÀÔµµ ÀúÀå °¡´É. ÇÏÁö¸¸ ¼º´É ¸é¿¡¼­´Â °¡Àå ´À¸®´Ù. ¾Æ¸¶ Beta3¿¡¼­´Â ¾ø¾îÁú Æ÷¸ËÀÌ´Ù. ÇѸ¶µð·Î »ç¿ëÇÏ¸é ¾È µÇ´Â Æ÷¸ËÀÌ´Ù.
¡ß Native
Å©±â°¡ °íÁ¤µÈ °ªÅ¸ÀÔÀÇ µ¥ÀÌÅÍ Çü¸¸ ÀúÀå °¡´É. °¡Àå ºü¸£´Ù.
¡ß UserDefined
°ªÅ¸ÀÔ, ÂüÁ¶ ŸÀÔ ¸ðµÎ »ç¿ë°¡´É. ÇÏÁö¸¸, »ç¿ëÀÚ°¡ µ¥ÀÌÅ͸¦ Àд ¹æ¹ý°ú ¾²´Â ¹æ¹ýÀ» Á¤ÀÇÇØ ÁÖ¾î¾ß ÇÑ´Ù.

À§ 3°¡Áö Æ÷¸ËÁß »ç¿ëÀÚ Á¤ÀÇ Æ÷¸Ë¿¡¼­ Àбâ¿Í ¾²±â¸¦ Á÷Á¢ ±¸ÇöÇÏ´Â °ÍÀÌ °£´ÜÇÏÁö°¡ ¾Ê´Ù. ¾à°£ º¹ÀâÇÏ´Ù. ±×·¡¼­ À̹ø ¿¹Á¦´Â UDT¸¦ ¼Ò°³ÇÏ´Â °ÍÀÌ ¸ñÀûÀ̹ǷΠNative Æ÷¸ËÀ» ÀÌ¿ëÇÏ´Â °£´ÜÇÑ Æ÷ÀÎÆ® ¿¹Á¦¸¦ º¸¿©ÁÖ·Á°í ÇÑ´Ù.

±âÁ¸ CLRExÇÁ·ÎÁ§Æ®¿¡ »õ·Î¿î ¾ÆÀÌÅÛÀ¸·Î Point¶ó´Â »ç¿ëÀÚ Á¤ÀÇ µ¥ÀÌÅÍ Å¸ÀÔÀ» Ãß°¡ÇØ º¸ÀÚ. ±×·¯¸é ±âº»ÀûÀÎ ÄÚµåµéÀÌ »ý¼ºµÇ¾î ÀÖÀ» °ÍÀÌ´Ù. ¸ðµÎ Áö¿ìÀÚ. ÇöÀç ÅÛÇø´¿¡¼­ »ý¼ºµÈ ÄÚµå´Â ¿¾³¯ ¹æ½ÄÀÇ ÄÚµåÀÌ´Ù. ±âº»ÀûÀÎ ±¸Á¶´Â ¾Æ·¡¿Í °°´Ù.

[Serializable]
[SqlUserDefinedType(Format.Native)]
public struct Point : INullable
{
  private Boolean is_null;
  private Int32 m_x;
  private Int32 m_y;

  // ±âº» ¸Þ¼­µå
  public override string ToString() { ... }
  public bool IsNull { get; }
  public static Point Null { get; }
  public static Point Parse(SqlString s) {...}

  // Ãß°¡ÇÑ ¸Þ¼­µå
  public Int32 x {...}
  public Int32 x {...}
  public decimal DistanceTo(Point other) {...} // µÎ Æ÷ÀÎÆ®°£ °Å¸® ±¸Çϱâ
}

ÀÌ ¸Þ¼­µåµéÀ» ä¿öÁÖ¸é Æ÷ÀÎÆ® UDT°¡ ¿Ï¼º µÈ´Ù. À§ÀÇ °¡»óÄڵ带 º¸¸é Á÷·ÄÈ­¸¦ Áö¿øÇϰí Native Æ÷¸ËÀ¸·Î Á¤ÀǵǾî ÀÖ´Â °ÍÀ» º¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ±×¸®°í class°¡ ¾Æ´Ñ struct·Î ¼±¾ðÇÑ °ÍÀÌ º¸ÀÏ °ÍÀÌ´Ù. ±¸Áö class°¡ ¾Æ´Ñ struct¸¦ ¾´ ÀÌÀ¯´Â ÀüÅëÀûÀ¸·Î »ç¿ëÀÚ Á¤ÀÇ µ¥ÀÌÅÍ Å¸ÀÔÀº ±¸Á¶Ã¼¸¦ ½è±â ¶§¹®ÀÌ´Ù. ±× ÀÌÀ¯´Â Ŭ·¡½º´Â Èü¿¡ µ¥ÀÌÅͰ¡ ÀúÀåÀÌ µÇÁö¸¸ ±¸Á¶Ã¼´Â ±×·¸Áö°¡ ¾Ê´Ù. µû¶ó¼­ Ŭ·¡½º´Â °¡ºñÁö ÄÝ·ºÅͰ¡ ½±°Ô ¼ö°ÅÇØ °¥ ¼ö ÀÖÁö¸¸, ±¸Á¶Ã¼´Â ±×·¸Áö ¾Ê´Ù.

¼º´É¸é¿¡¼­ ±¸Á¶Ã¼°¡ ¾à°£ ´õ ºü¸£´Ù´Â °ÍÀÌ´Ù. ¶ÇÇÑ NULL°ªÀ» ±¸ÇöÇϴµ¥ ÀÖ¾î ±¸Á¶Ã¼´Â º°µµÀÇ ÃʱâÈ­ ¾øÀÌ ±âº»ÀûÀ¸·Î ¸ðµç °ªÀ» ±âº»°ªÀ¸·Î ÃʱâÈ­¸¦ ÇØÁØ´Ù. ¿¹¸¦ µé¸é ¼ýÀÚÇüÀº ¸ðµÎ 0À¸·Î ÀÚµ¿ ÃʱâÈ­¸¦ ÇØÁØ´Ù. ±×·¡¼­ µ¥ÀÌÅÍ ÇüÀ» ´Ù·ç´Â µ¥¿¡´Â ¾Æ¹«·¡µµ Ŭ·¡½º º¸´Ù´Â ±¸Á¶Ã¼°¡ ¾à°£ ´õ ÆíÇÏ´Ù°í ÇÒ ¼ö ÀÖ´Ù. SQL Server¿¡¼­´Â NULLÀ̶ó´Â °ªÀÌ Á¸ÀçÇÑ´Ù. µû¶ó¼­ UDT¸¦ ¸¸µé¶§¿¡´Â NULLÀ̶ó´Â Àǹ̸¦ ºÎ¿©ÇØ ÁÖ¾î¾ß ÇÑ´Ù. ±×·¡¼­ INullable ÀÎÅÍÆäÀ̽º¸¦ »ó¼Ó¹Þ¾Æ¼­ NULLÀ» ±¸ÇöÇϰí ÀÖ´Ù.

Æ÷ÀÎÆ®¸¦ ÀúÀåÇϱâ À§Çؼ­ X,Y°ªÀ» À§ÇÑ °ø°£À» ¸¶·ÃÇÏ°í ³Î°ª üũ¸¦ À§ÇÑ °ø°£µµ ¸¶·ÃÇÏ¿´´Ù. ±×·±µ¥ »ç½Ç ³Î°ª üũ¸¦ À§Çؼ­ À§¿Í °°ÀÌ º°µµÀÇ ÀúÀå °ø°£À» »ç¿ëÇÏ´Â °ÍÀº Çϵåµð½ºÅ© ³¶ºñ°¡ µÉ ¼ö ÀÖ´Ù. ±×·¡¼­ ¾î¶² »ç¶÷µéÀº À§¿Í °°Àº °æ¿ì Int32.MinValue¸¦ ³Î°ª ´ë½ÅÀ¸·Î »ç¿ëÇϱ⵵ ÇÑ´Ù. Áï Int32ÀÇ ÃÖ¼Ò°ªÀ» ³Î°ªÀ¸·Î ´ë½Å ÇÏ´Â °ÍÀÌ´Ù. ¸¸¾à Æ÷ÀÎÆ®ÀÇ µ¥ÀÌÅÍÇüÀÌ stringÇüÀ̸é ÀÌ·¯ÇÑ ºÒÆíÀÌ ¾ø´Ù. stringÇüÀº ÂüÁ¶ ŸÀÔÀ̱⠶§¹®¿¡ nullÀ̶ó´Â °ªÀ» ¼ö¿ëÇÒ ¼ö Àֱ⠶§¹®ÀÌ´Ù.

Int32¶ó´Â µ¥ÀÌÅÍÇüÀº °ªÅ¸ÀÔÀ̱⠶§¹®¿¡ NULLÀ» ¼ö¿ëÇÒ ¼ö°¡ ¾ø¾î À§¿Í °°Àº ¹æ¹ýÀ» »ç¿ëÇÏ¿´´Ù. ¾î¶² ¹æ¹ýÀ» »ç¿ëÇÏ´ø ±×°ÍÀº °³¹ßÀÚÀÇ ¸òÀÌ´Ï »óȲ¿¡ µû¶ó ÀûÀýÇÑ ¹æ¹ýÀ» »ç¿ëÇÏ¸é µÈ´Ù. À̹ø ¿¹Á¦¿¡¼­´Â Çϵåµð½ºÅ©ÀÇ °ø°£À» °ÆÁ¤ ¾ÈÇØµµ µÇ¹Ç·Î ±×³É µû·Î ³Î°ª üũ¸¦ À§ÇÑ µ¥ÀÌÅÍÇüÀ» µû·Î ¸¸µé¾ú´Ù. ±âº»ÀûÀÎ ¸Þ¼­µåÀÇ ¼³¸íÀº ¾Æ·¡¿Í °°´Ù.

<Ç¥1> ±âº»ÀûÀÎ ¸Þ½îµå ¼³¸í

½ÇÁ¦ ¿Ï¼ºµÈ ÄÚµå´Â Áö¸é°ü°è»ó ÀÌ´ÞÀÇ µð½ºÄÏ¿¡ ÀÖÀ¸´Ï Âü°íÇϱ⠹ٶõ´Ù.
ÀÌÁ¦ ÀÌ UDT¸¦ ÄÄÆÄÀÏ ÇÏ°í ¹èÆ÷ ÇÏ¸é ¾Æ·¡¿Í °°ÀÌ Å×½ºÆ® ÇÒ ¼ö ÀÖ´Ù.

DECLARE @a Point, @b Point;

IF @a is null
  PRINT 'null'
ELSE
  PRINT 'not null';

SET @a.x = 10;
SET @a.y = 20;

SET @b.x = 100;
SET @b.y = 110;

SELECT CAST(@a AS CHAR);
SELECT CAST(@b AS CHAR);

SELECT @a.DistanceTo( @b ); -- µÎ Á¡»çÀÌÀÇ °Å¸® ±¸Çϱâ
-----------------------------------------------------------------
null
10:20
100:110
127

SUM, MAX¿Í °°Àº ÁýÇÕ ÇÔ¼ö¸¸À¸·Î´Â ´õ ÀÌ»ó ÃæºÐÇÏÁö ¾Ê´Ù.
À̹ø¿¡ SQL ServerÀÇ CLR ÅëÇÕ ±â´É Áß¿¡¼­ Á¦ÀÏ ¹Ý°¡¿î ±â´ÉÀÌ ¹Ù·Î ÀÌ ±â´ÉÀÌ´Ù. ±âÁ¸¿¡ MIN, MAX, SUM, COUNT, AVG °°Àº ÁýÇÕ ÇÔ¼ö¸¦ ¾²´Ù º¸¸é ºÎÁ·ÇÔÀ» ´À³¢´Â °æ¿ì°¡ ¸¹´Ù. ÀÌ·¯ÇÑ ÁýÇÕ ÇÔ¼ö°¡ ÀÖÀ¸¸é ÁÁÀºµ¥... ÇÏ°í ¸¹Àº »ç¶÷µéÀÌ ¿øÇß´ø °ÍÀÌ »ç½ÇÀÌ´Ù. ÀÌÁ¦´Â ÀÌ·¯ÇÑ ÁýÇÕ ÇÔ¼ö¸¦ Á÷Á¢ ¸¸µé¾î ¾µ ¼ö ÀÖ´Ù. ¸¸µå´Â ¹æ¹ýÀº UDT¿Í »ó´çÈ÷ À¯»çÇÏ´Ù. À̹ø ¿¹Á¦¿¡¼­´Â ÃÖ´ë º¯À̰ªÀ» ±¸ÇÏ´Â ÇÔ¼ö¸¦ ¸¸µé °ÍÀÌ´Ù. Áï, ÃÖ´ë°ª-ÃÖ¼Ò°ªÀ» ±¸ÇÏ´Â MaxVariance¶ó´Â ÇÔ¼ö ÀÌ´Ù. ±âÁ¸ ÇÁ·ÎÁ§Æ®¿¡ »õ·Î¿î ¾ÆÀÌÅÛÀ¸·Î Aggregate¸¦ Ãß°¡Çϰí ÀÌ¹Ì ÀÖ´Â ÅÛÇø´ ÄÚµå´Â ¿ª½Ã ¿¾³¯ ¹æ½ÄÀ̹ǷΠÁö¿î´Ù. ±âº»ÀûÀÎ ±¸Á¶´Â ¾Æ·¡¿Í °°´Ù.

[Serializable]
[StructLayout(LayoutKind.Sequential)]
[SqlUserDefinedAggregate(Format.Native)]
public struct MaxVariance
{
  private Int32 m_LowValue;
  private Int32 m_HighValue;

  public void Init() {...}
  public void Accumulate(SqlInt32 Value) {...}
  public void Merge(MaxVariance Group){...}
  public SqlInt32 Terminate() { ... }
}

µ¥ÀÌÅÍÇüÀÌ °ªÅ¸ÀÔ ¹Û¿¡ ¾øÀ¸¹Ç·Î Native Æ÷¸ËÀ¸·Î ÇßÀ¸¸ç, ÃÖ´ë°ª°ú ÃÖ¼Ò°ªÀ» ÀúÀåÇÏ´Â º°µµÀÇ º¯¼ö¸¦ ¸¸µé¾ú´Ù. °¢ ¸Þ¼Òµåº° ¼³¸íÀº ¾Æ·¡¿Í °°´Ù.

<Ç¥2> °¢ ¸Þ½îµåº° ¼³¸í

ÀÚ¼¼ÇÑ ÄÚµå´Â ÀÌ´ÞÀÇ µð½ºÄÏ¿¡ ÀÖÀ¸´Ï Âü°íÇϱ⠹ٶõ´Ù. À§ÀÇ »ç¿ëÀÚ Á¤ÀÇ ÁýÇÕ(User-Defined Aggregate)(UDA)À» ÄÄÆÄÀÏ ÇÏ°í ¹èÆ÷ÇÑ ÈÄ ¾Æ·¡¿Í °°Àº ÄÚµå·Î Å×½ºÆ® ÇØ º¸ÀÚ. ¾Æ·¡ ÄÚµå´Â Àüü »ç¿øÁß¿¡¼­ ÈÞ°¡½Ã°£ÀÌ °¡Àå ¸¹Àº »ç¶÷°ú °¡Àå ÀûÀº »ç¶÷ÀÇ Â÷À̸¦ ³ªÅ¸³½ °ÍÀÌ´Ù.

SELECT dbo.MaxVariance(VacationHours)
FROM HumanResources.Employee;

SELECT MAX(VacationHours) - MIN(VacationHours)
FROM HumanResources.Employee;

-----------
99
(1 row(s) affected)
99
(1 row(s) affected)

À§¿Í ¾Æ·¡ÀÇ Äõ¸®¹®À» ´ëÁ¶ÇØ º¸¸é Á¦´ë·Î µÈ °á°ú°¡ ³ª¿ÔÀ½À» È®ÀÎÇØ º¼ ¼ö ÀÖ´Ù.

Ŭ¶óÀÌ¾ðÆ® ADO.NETÀÇ °³¼±Á¡
À̹ø¿¡ ADO.NET 2.0À¸·Î ³ª¿À¸é¼­ SQL Server¿Í °ü·ÃÇØ¼­ Å©°Ô ÁÖ¸ñÇÒ ºÎºÐÀº µÎ°¡Áö°¡ ÀÖ´Ù. Çϳª´Â ºñµ¿±â È£Ãâ±â´É°ú ÇϳªÀÇ ¿¬°á·Î ´Ù¼öÀÇ Ä¿¸Çµå¸¦ ½ÇÇàÇÏ´Â ±â´É(Multiple Active Result Sets)(MARS)ÀÌ´Ù. Áö³­È£¿¡¼­ ADO.NET¿¡¼­µµ ÆäÀÌ¡ 󸮰¡ °¡´ÉÇÏ´Ù°í Çߴµ¥, ±× ±â´ÉÀÌ ÀÌÁ¨ ¾ø¾îÁú ¿¹Á¤ÀÌ¶ó¼­ À̹ø¿¡ Á¦¿ÜÇß´Ù.

´õ ÀÌ»ó ±â´Ù¸± ÇÊ¿ä ¾ø´Â ºñµ¿±â È£Ãâ
ºñµ¿±â È£Ãâ ±â´ÉÀº ±âÁ¸¿¡ Äõ¸® ¹®ÀåÀ» ¼öÇà ½ÃŰ°í °á°ú°¡ ¿Ã ¶§±îÁö ±â´Ù·Á¾ß Çß´Ü ºÒÆíÀ» ¾ø¾Ö°í, Ŭ¶óÀÌ¾ðÆ®´Â °á°ú°¡ ¿Ã ¶§±îÁö ³ª¸§´ë·ÎÀÇ ÀÛ¾÷À» ÇÒ ¼ö ÀÖ´Ù. ±×·¯¹Ç·Î »ç¿ëÀÚ´Â Äõ¸® ¹®ÀåÀ» ³¯¸®°í ¸ð·¹½Ã°èÀÇ ¾ÆÀÌÄÜÀ» ±â´Ù¸± ÇÊ¿ä ¾øÀÌ ´Ù¸¥ ÀÛ¾÷À» ¼öÇà ÇÒ ¼öµµ ÀÖ´Ù. À̶§ óÀ½ DB¿¡ ¿¬°áÀ» ¸ÎÀ» ¶§ ºñµ¿±â È£ÃâÀ» ¾´´Ù´Â Ç¥½Ã¸¦ ¡°Asynchronous Processing=true¡± ÀÌ¿Í °°ÀÌ ÇØÁÖ¾î¾ß ÇÑ´Ù. °£´ÜÇÑ ¿¹Á¦¸¦ º¸ÀÚ. Àüü ¿¹Á¦´Â ÀÌ´ÞÀÇ µð½ºÄÏ¿¡ ÀÖ´Ù.

SqlConnection cnn = new SqlConnection(
  "Data Source=localhost;" +
    "Initial Catalog=AdventureWorks;" +
    "Integrated Security=SSPI;" +
    "Asynchronous Processing=true");

cnn.Open();
// 2Ãʰ£ÀÇ µô·¹ÀÌ ÈÄ Á¶È¸
SqlCommand cmd = new SqlCommand(
  "WAITFOR DELAY '00:00:02';SELECT * FROM Sales.Customer", cnn);

Console.WriteLine("ÀÛ¾÷ ½ÃÀÛ");
IAsyncResult iar = cmd.BeginExecuteReader();

while (!iar.IsCompleted) { Console.Write("*"); } //°á°ú ¿Ã ¶§±îÁö º°Âï±â

cmd.EndExecuteReader(iar);
Console.WriteLine("\nÀÛ¾÷ ³¡");

--------------------------------------------------------------------
ÀÛ¾÷ ½ÃÀÛ
******************
ÀÛ¾÷ ³¡

À§ ¿¹Á¦´Â °í°´ µ¥ÀÌÅ͸¦ Á¶È¸ Çϴµ¥ ÀÖ¾î ºñµ¿±â È£ÃâÀ» ÀÌ¿ëÇϰí ÀÖ´Ù. ¸ÕÀú ºñµ¿±â È£ÃâÀÇ ÀåÁ¡À» º¸·Á¸é DB¿¡¼­ ½Ã°£ÀÌ ¿À·¡ °É¸®´Â ÀÛ¾÷À» µ¹·ÁÁÖ¾î¾ß ±× È¿°ú¸¦ È®½ÇÈ÷ º¼ ¼ö ÀÖ´Ù. ±×·¡¼­ 2Ãʰ£ µô·¹À̸¦ ÁÖ´Â ¹®ÀåÀ» »ðÀÔÇÏ¿© °­Á¦·Î ½Ã°£ÀÌ ¿À·¡ °É¸®µµ·Ï ÇÏ¿´´Ù. ±×¸®°í Ŭ¶óÀÌ¾ðÆ®´Â °á°ú°¡ ¿Ã ¶§±îÁö °è¼Ó º°À» Âï´Ù°¡ °á°ú°¡ ¿À¸é ³¡³»´Â ¿¹Á¦ÀÌ´Ù.

±×·±µ¥ À̹ø ¿¹Á¦¿¡¼­´Â °£´ÜÈ÷ Çϱâ À§Çؼ­ ³¡³µ´ÂÁö ¾È ³¡³µ´ÂÁö¸¦ ¾Ë¾Æº¸±â À§ÇÏ¿© WHILE¹®¿¡¼­ °è¼Ó üũ¸¦ ÇÏ¿´Áö¸¸, ½ÇÁ¦ »ç¿ëÇÒ ¶§¿¡´Â ÀÌ·¸°Ô ÇÒ ÇÊ¿ä ¾øÀÌ ºñµ¿±â Äݹé ÇÔ¼ö¸¦ ¸¸µé¾î¼­ ´Ù ³¡³ª¸é ÀúÀý·Î ±× ÇÔ¼ö°¡ È£ÃâµÇ°Ô ÇÏ´Â °ÍÀÌ ´õ ÁÁÀº ¹æ¹ýÀÌ µÉ °ÍÀÌ´Ù.

ÇϳªÀÇ ¿¬°á·Î ´Ù¼öÀÇ Äõ¸® ½ÇÇà
±âÁ¸ ADO.NET¿¡¼­´Â ÇϳªÀÇ ¿¬°áÀ» ¸ÎÀ¸¸é ÇϳªÀÇ Ä¿¸Çµå¸¸ ½ÇÇà°¡´É ÇÏ¿´´Ù. ±×·¡¼­ ´Ù¸¥ Ä¿¸Çµå¸¦ ½ÇÇàÇÏ·Á¸é º°µµÀÇ ¿¬°áÀ» ´Ù½Ã ¸Î¾î¾ß¸¸ Çß´Ù. ÇÏÁö¸¸ ÀÌÁ¦´Â ÇϳªÀÇ ¿¬°á·Î ´Ù¼öÀÇ Ä¿¸Çµå¸¦ ½ÇÇà ÇÒ ¼ö ÀÖ´Ù. ÀÌ·¸°Ô ÇÔÀ¸·Î½á ¸Å¹ø »õ·Î¿î ¿¬°áÀ» ¾È ¸Î¾îµµ µÇ¹Ç·Î ¼º´É Çâ»óÀÌ ÀÖ´Â °ÍÀÌ´Ù. ±¸ÇöÇÏ´Â ¹æ¹ýÀº ¾î·ÆÁö ¾Ê´Ù. ±×³É ¾²¸é µÈ´Ù. ¾Æ·¡ ¿¹Á¦¸¦ º¸ÀÚ.

// ÇϳªÀÇ ¿¬°á
SqlConnection cnn = new SqlConnection(
  "Data Source=localhost;" +
  "Initial Catalog=AdventureWorks;" +
  "Integrated Security=SSPI;");
cnn.Open();

// ù¹øÂ° ½ÇÇà
SqlCommand cmd1 = new SqlCommand(
  "SELECT * FROM Production.Location", cnn);
SqlDataReader dr1 = cmd1.ExecuteReader();

// µÎ¹øÂ° ½ÇÇà
SqlCommand cmd2 = new SqlCommand(
  "SELECT * FROM HumanResources.Department", cnn);
SqlDataReader dr2 = cmd2.ExecuteReader();

// °á°ú Ãâ·Â
while (dr1.Read() == true && dr2.Read() == true)
{
  Console.WriteLine(dr1[0] + " | " + dr2[0] );
}
-------------------------------------------------------
1 | 1
2 | 2
3 | 3
4 | 4
5 | 5
.......

cmd1°ú cmd2°¡ ÇϳªÀÇ cnnÀ̶ó´Â ¿¬°áÀ» °øÀ¯Çؼ­ ¾²°í ÀÖ´Ù. Àüü ¿¹Á¦´Â ÀÌ´ÞÀÇ µð½ºÄÏ¿¡ ÀÖ´Ù.

SQL ServerÀÇ º¯½ÅÀº ¹«ÁË?
óÀ½¿¡ SQL Server°¡ ´å³Ý ÇÁ·¹ÀÓ¿÷(CLR)¿¡ ÅëÇյȴٰí ÇÏ¿´À» ¶§ ¸¹Àº »ç¶÷µéÀÌ ±Ã±ÝÁõÀ» °¡Áö°í ÁöÄѺ¸¾Ò´Ù. ÀÌÁ¦´Â C#À» °øºÎÇØ¾ß Çϴ°¡ ÇÏ°í °ÆÁ¤ÇÏ´Â »ç¶÷µéµµ ÀÖ¾ú´Ù. ÇÏÁö¸¸ ¸·»ó ¶Ñ²±À» ¿­¾îº¸´Ï CLRÅëÇÕ À̶ó´Â ±â´ÉÀº T-SQLÀ» ´ëüÇÏ´Â ±â´ÉÀÌ ¾Æ´Ñ Á»´õ È®ÀåÇÏ°í º¸°­Çϱâ À§ÇÑ ±â´ÉÀ¸·Î º¸´Â °ÍÀÌ ÁÁ´Ù´Â °á°ú°¡ ³ª¿Ô´Ù. SQL Server¸¦ °³¹ßÇϴµ¥ ÀÖ¾î ±âº»Àº T-SQLÀÌ´Ù. ÇÏÁö¸¸ °Å±â¼­ ¸ØÃßÁö ¾Ê°í ´õ¿í »õ·Î¿î ±â´ÉÀ» Ãß°¡Çϰí È®ÀåÇÏ°í ½Í´Ù¸é .NETÀ» ÀÌ¿ëÇÏ¸é µÈ´Ù. ´ÙÀ½ ±Û¿¡¼­´Â DB °ü¸®Åø°ú º¸¾È¿¡ ´ëÇØ ¼Ò°³ÇÒ °ÍÀÌ´Ù.@

* ÀÌ ±â»ç´Â ZDNet KoreaÀÇ Á¦ÈÞ¸ÅüÀÎ ¸¶ÀÌÅ©·Î¼ÒÇÁÆ®¿þ¾î¿¡ °ÔÀçµÈ ³»¿ëÀÔ´Ï´Ù.
°ü·Ã±â»ç
[DB ¼º´É°ü¸® 2% ä¿ì±â] ¨ç ÀÚµ¿È­ ÅøÀÇ ÇѰè
¡¸°´Ã¼ ÁöÇâ ¹æ¹ý·Ð¡¹À¸·Î â°í ¼Ó Á¤º¸ ²¨³»±â
µ¥ÀÌÅͺ£À̽º Áø´Ü, ¸¸º´ÅëÄ¡¾à ¹Ù¶óÁö ¸»¶ó
°ü°èÇü DB, ¸¸´ÉÀ̶ó´Â ȯ»ó ¹ö·Á¶ó
[SQL ¼­¹ö 2005 ½ÇÀü Ȱ¿ë] ¨ç ´õ °­·ÂÇØÁø T-SQL
µ¶ÀÚÀÇ°ß ³²±â±â (·Î±×ÀÎ ÈÄ µ¶ÀÚ ÀǰßÀ» ³²±â½Ç ¼ö ÀÖ½À´Ï´Ù.)
¾ÆÀ̵ð ºñ¹Ð¹øÈ£
 
 
[Ã¥¼Ò°³]ÇÁ¸®Á¨Å×ÀÌ¼Ç Á¨: »ý°¢À»...
[DDD ¨ç] µµ¸ÞÀÎ ÁÖµµ °³¹ß
°¡»óÈ­¿¡ ½ÇÆÐÇÏ´Â 10°¡Áö ÀÌÀ¯
À©µµ¿ìCE µð¹ö±ë¿¡ °üÇÑ 12°¡Áö...
[±â°í]±×¸° ½ºÅ丮Áö·Î °¡´Â±æ
[Ã¥¼Ò°³] À¥ °³¹ßÀÚ¸¦ À§ÇÑ ½ºÇÁ...
À©µµ¿ìCE °³¹ßÅø¿¡ °üÇÑ 12°¡Áö...
[¿ÀÇÂÀÎÅͺä]Àè Äá HTCºÎ»çÀå "½º¸¶Æ®Æù ½ÃÀå °³Ã´, Áö±ÝÀÌ Àû±â" [00:17:38]
ÁøÇà ·ùÁØ¿µ ±âÀÚ, Á¦ÀÛ À¯È¸Çö PD
[»ï¼º ¿½ ½ºÅ丮-¨è]'P2 DMB' °ÑÆ÷Àå, Æò¹üÄ¡ ¾ÊÀº ÀÌÀ¯ ÀÖ¾ú³× [00:10:13]
ÁøÇà ·ùÁØ¿µ ±âÀÚ, Á¦ÀÛ À¯È¸Çö PD
Á¶Áßµ¿, ´ÙÀ½¿¡ ´º½º°ø±Þ Áß´Ü¡¦"...
º¸¾È°­È­ ±¸±Û ¡°À©µµ ¹ö¸®°í À¥À¸...
¡®À©µµXP¡¯½Ã´ë Æó¸·, »ç¿ëÀÚ¿¡°Ô...
¡®³ªÈ¦·Î ¾×ƼºêX¡¯¡¦¼¼°è ÀÎÅͳݰú...
ÀÎÅÍ³Ý ¹ðÅ· ºê¶ó¿ìÀú´Â µû·Î ÀÖ´Ù...
SKT µ¶Á¡ 800MHz Á֯ļö,...
[ºÎÀ½]±èÈ«¿µ ÆÒÅð迭 CSº»ºÎÀå...
¹æÅëÀ§, ¹æ¼ÛÄÜÅÙÃ÷ ÁøÈï»ç¾÷¿¡ 2...
LG¿£½Ã½º, IT ÀÎÀç ¾ç¼º »êÇÐ...
NHN, ÀÎõ°øÇ׿¡ ¹«·á ÀÎÅÍ³Ý ...
[Àλç]ÇϳªÀºÇà
 
 
The Korean edition of 'ZDNet' is published under license from CNET Networks, Inc., San Francisco, CA, USA. Editorial items appearing in 'ZDNet Korea' that were originally published in the US Edition of 'ZDNet', 'CNET', and 'CNET News.com' are the copyright properties of CNET Networks, Inc. or its suppliers.
Copyright ¨Ï 2008 CNET Networks, Inc. All Rights Reserved. 'ZDNet', 'CNET' and 'CNET News.com' are trademarks of CNET Networks, Inc.