[Áöµð³ÝÄÚ¸®¾Æ]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 ¸ø º¸´ø »õ·Î¿î Ŭ·¡½º Áö½ÃÀÚ°¡ ÀÖ´Â °ÍÀ» º¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ÀÌ´Â 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ÀÇ Á¦ÈÞ¸ÅüÀÎ ¸¶ÀÌÅ©·Î¼ÒÇÁÆ®¿þ¾î¿¡ °ÔÀçµÈ ³»¿ëÀÔ´Ï´Ù.