<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Trainee's Weblog &#187; SQL</title>
	<atom:link href="http://gltrainee.wordpress.com/category/sql/feed/" rel="self" type="application/rss+xml" />
	<link>http://gltrainee.wordpress.com</link>
	<description>блог .NET разработчиков ... in .Net veritas ...</description>
	<lastBuildDate>Thu, 03 Jul 2008 14:50:21 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>ru</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='gltrainee.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/4849b8cdccdb7cbe479254e464bcb906?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>Trainee's Weblog &#187; SQL</title>
		<link>http://gltrainee.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://gltrainee.wordpress.com/osd.xml" title="Trainee&#8217;s Weblog" />
		<item>
		<title>Импортирование UDT в MS SQL SERVER 2005</title>
		<link>http://gltrainee.wordpress.com/2008/07/03/%d0%b8%d0%bc%d0%bf%d0%be%d1%80%d1%82%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5-udt-%d0%b2-ms-sql-server-2005/</link>
		<comments>http://gltrainee.wordpress.com/2008/07/03/%d0%b8%d0%bc%d0%bf%d0%be%d1%80%d1%82%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5-udt-%d0%b2-ms-sql-server-2005/#comments</comments>
		<pubDate>Thu, 03 Jul 2008 13:01:52 +0000</pubDate>
		<dc:creator>masalov</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://gltrainee.wordpress.com/?p=43</guid>
		<description><![CDATA[Как вы уже, наверное, знаете, в  состав MS SQL Server 2005 была интегрирована CLR, что сделало возможным разворачивать наши приложения в пределах процесса MS SQL Server.

Данная статья посвящена созданию UDT(user defined type)  и интеграции его в MS SQL Server.
Итак, давайте начнем&#8230; Для начала необходимо рассмотреть требования, предъявляемые к каждому UDT:
- UDT реализуется в [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gltrainee.wordpress.com&blog=3911599&post=43&subd=gltrainee&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Как вы уже, наверное, знаете, в  состав MS SQL Server 2005 была интегрирована CLR, что сделало возможным разворачивать наши приложения в пределах процесса MS SQL Server.</p>
<p><span id="more-43"></span><br />
Данная статья посвящена созданию UDT(user defined type)  и интеграции его в MS SQL Server.</p>
<p>Итак, давайте начнем&#8230; Для начала необходимо рассмотреть требования, предъявляемые к каждому UDT:<br />
- UDT реализуется в виде public структур или классов;</p>
<p>- Должны быть отмечены атрибутом SqlUserDefinedType с указанием обязательных параметров, касающихся способа сериализации, и атрибутом Serializable</p>
<p>- Должны реализовывать интерфейс INullable<br />
public bool IsNull 			Проверка на NULL</p>
<p>- Должны реализовывать методы:<br />
public static &lt;Тип&gt; Parse(SqlString s)	Преобразование из строки<br />
public override string ToString() 		Преобразование в строку<br />
public static &lt;Тип&gt; Null			NULL значение</p>
<p>- Если выбран способ сериализации UserDefined, то должен быть реализован интерфейс IBinarySerialize<br />
public void Write(System.IO.BinaryWriter w)    Сериализация<br />
public void Read(System.IO.BinaryReader r)    Десериализация</p>
<p>Теперь давайте рассмотрим небольшой пример, в котором я реализовал 3 UDP:<br />
1) SQLPoint &#8211; точка, которая представлена в виде 2х значений, разделенными двоеточием &#8211; x и y координаты. Пример: &laquo;4:2&#8243;<br />
2) SQLPointList &#8211; множество точек, разделенными запятыми. Пример: &laquo;2:1,5:3,22:12&#8243;<br />
3) ListOfSQLPointList &#8211; набор множеств точек. Пример: &laquo;{2:4,4:5,2:1},{2:4,4:4},{2:2}&raquo;</p>
<p>Создадим сборку, в которой реализуем данные типы:</p>
<div style="background:#AEAEAE;border:1px;">using System;<br />
using System.Collections.Generic;<br />
using System.Linq;<br />
using System.Text;<br />
using System.Data.SqlTypes;</p>
<p>namespace NewType<br />
{<br />
[Serializable]<br />
[Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute(Microsoft.SqlServer.Server.Format.UserDefined, MaxByteSize = 500)]<br />
public class ListOfSQLPointList : Microsoft.SqlServer.Server.IBinarySerialize, INullable<br />
{<br />
List _lists;</p>
<p>public List Lists<br />
{<br />
get { return _lists; }<br />
set { _lists = value; }<br />
}<br />
public ListOfSQLPointList()<br />
{<br />
_lists = new List();<br />
}</p>
<p>#region IBinarySerialize Members</p>
<p>public void Read(System.IO.BinaryReader r)<br />
{<br />
string strRead = r.ReadString();<br />
ListOfSQLPointList listOfPointLists = ListOfSQLPointList.Parse(strRead);<br />
foreach (SQLPointList pointList in listOfPointLists.Lists)<br />
{<br />
this._lists.Add(pointList);<br />
}</p>
<p>}<br />
public static ListOfSQLPointList Parse(SqlString s)<br />
{<br />
ListOfSQLPointList list = new ListOfSQLPointList();<br />
string[] strArr = s.ToString().Split(new string[] { &laquo;},{&raquo; }, StringSplitOptions.RemoveEmptyEntries);<br />
for (int i = 0; i &lt; strArr.Length; i++)<br />
{<br />
strArr[i] = strArr[i].TrimEnd(&#8216;}&#8217;);<br />
strArr[i] = strArr[i].TrimStart(&#8216;{&#8216;);<br />
SQLPointList point = SQLPointList.Parse(strArr[i]);<br />
list.Lists.Add(point);<br />
}<br />
return list;<br />
}<br />
public override string ToString()<br />
{<br />
string strResult = String.Empty;<br />
if (_lists.Count &gt; 0)<br />
{<br />
for (int i = 0; i &lt; this._lists.Count &#8211; 1; i++)<br />
{<br />
strResult += &laquo;{&raquo; + _lists[i].ToString() + &laquo;},&raquo;;<br />
}</p>
<p>strResult += &laquo;{&raquo; + _lists[_lists.Count - 1].ToString() + &laquo;}&raquo;;<br />
}<br />
return strResult;<br />
}<br />
public void Write(System.IO.BinaryWriter w)<br />
{<br />
w.Write(this.ToString());<br />
}</p>
<p>#endregion</p>
<p>#region INullable Members</p>
<p>public bool IsNull<br />
{<br />
get { return false; }<br />
}</p>
<p>#endregion</p>
<p>public static ListOfSQLPointList Null<br />
{<br />
get { return null; }<br />
}<br />
}</p>
<p>[Serializable]<br />
[Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute(Microsoft.SqlServer.Server.Format.UserDefined, MaxByteSize = 150)]<br />
public class SQLPointList : Microsoft.SqlServer.Server.IBinarySerialize, INullable<br />
{<br />
List _points;</p>
<p>public List Points<br />
{<br />
get { return _points; }<br />
set { _points = value; }<br />
}<br />
public SQLPointList()<br />
{<br />
_points = new List();<br />
}</p>
<p>#region IBinarySerialize Members</p>
<p>public void Read(System.IO.BinaryReader r)<br />
{<br />
string strRead = r.ReadString();<br />
SQLPointList pointList = SQLPointList.Parse(strRead);<br />
foreach (SQLPoint point in pointList.Points)<br />
{<br />
this._points.Add(point);<br />
}</p>
<p>}<br />
public static SQLPointList Parse(SqlString s)<br />
{<br />
SQLPointList list = new SQLPointList();<br />
string[] strArr = s.ToString().Split(&#8216;,&#8217;);<br />
for (int i = 0; i &lt; strArr.Length; i++)<br />
{<br />
if (strArr[i] != &laquo;&raquo;)<br />
{<br />
SQLPoint point = SQLPoint.Parse(strArr[i]);<br />
list.Points.Add(point);<br />
}<br />
}<br />
return list;<br />
}<br />
public override string ToString()<br />
{<br />
string strResult = String.Empty;<br />
if (_points.Count &gt; 0)<br />
{<br />
for (int i = 0; i &lt; _points.Count &#8211; 1; i++)<br />
{<br />
strResult += _points[i].ToString() + &#8216;,&#8217;;<br />
}<br />
strResult += _points[_points.Count - 1].ToString();<br />
}<br />
return strResult;<br />
}<br />
public void Write(System.IO.BinaryWriter w)<br />
{<br />
w.Write(this.ToString());<br />
}</p>
<p>#endregion</p>
<p>#region INullable Members</p>
<p>public bool IsNull<br />
{<br />
get { return false; }<br />
}</p>
<p>#endregion</p>
<p>public static SQLPointList Null<br />
{<br />
get { return null; }<br />
}<br />
}</p>
<p>[Serializable]<br />
[Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute(Microsoft.SqlServer.Server.Format.UserDefined, MaxByteSize = 20)]<br />
public class SQLPoint : Microsoft.SqlServer.Server.IBinarySerialize, INullable<br />
{<br />
private int _x;<br />
private int _y;</p>
<p>public int X<br />
{<br />
get { return _x; }<br />
set { _x = value; }<br />
}<br />
public int Y<br />
{<br />
get { return _y; }<br />
set { _y = value; }<br />
}</p>
<p>#region IBinarySerialize Members</p>
<p>public void Read(System.IO.BinaryReader r)<br />
{<br />
string strResult = r.ReadString();<br />
SQLPoint point = SQLPoint.Parse(strResult);<br />
this._x = point.X;<br />
this._y = point.Y;<br />
}</p>
<p>public void Write(System.IO.BinaryWriter w)<br />
{<br />
w.Write(this.ToString());<br />
}</p>
<p>#endregion</p>
<p>#region INullable Members</p>
<p>public bool IsNull<br />
{<br />
get { return false; }<br />
}</p>
<p>#endregion</p>
<p>public static SQLPoint Parse(SqlString s)<br />
{<br />
string[] strArr = s.ToString().Split(&#8216;:&#8217;);<br />
SQLPoint point = new SQLPoint();<br />
point.X = int.Parse(strArr[0]);<br />
point.Y = int.Parse(strArr[1]);<br />
return point;<br />
}<br />
public override string ToString()<br />
{<br />
return _x.ToString() + &laquo;:&raquo; + _y.ToString();<br />
}<br />
public static SQLPoint Null<br />
{<br />
get { return null; }<br />
}</p>
<p>}<br />
}</p></div>
<p>Открываем Managment Studio, выбираем базу данных, для которой будем импортировать новые типы и создаем SQL запрос</p>
<div style="background:#AEAEAE;border:1px;">CREATE ASSEMBLY NewTypes<br />
FROM &#8216;ПУТЬ К DLL&#8217;ке&#8217; ;<br />
GO<br />
CREATE TYPE SQLPointList<br />
EXTERNAL NAME NewTypes.[NewType.SQLPointList] ;<br />
GO<br />
CREATE TYPE SQLPoint<br />
EXTERNAL NAME NewTypes.[NewType.SQLPoint] ;<br />
go<br />
CREATE TYPE ListOfSQLPointList<br />
EXTERNAL NAME NewTypes.[NewType.ListOfSQLPointList] ;</div>
<p>А также не забудьте активировать CLR в MS SQL SERVER</p>
<div style="background:#AEAEAE;border:1px;">EXEC sp_configure &#8217;show advanced options&#8217; , &#8216;1&#8242;;<br />
go<br />
reconfigure;<br />
go<br />
EXEC sp_configure &#8216;clr enabled&#8217; , &#8216;1&#8242;<br />
go<br />
reconfigure;<br />
&#8211; Turn advanced options back off<br />
EXEC sp_configure &#8217;show advanced options&#8217; , &#8216;1&#8242;;<br />
go</div>
<p>При создании таблицы появится 3 новых типа:<br />
<a href="http://gltrainee.files.wordpress.com/2008/07/111sssss1.jpg"><img class="aligncenter size-full wp-image-45" src="http://gltrainee.files.wordpress.com/2008/07/111sssss1.jpg?w=610&#038;h=349" alt="Sample" width="610" height="349" /></a></p>
<p>И теперь вы сможете сохранять собственный тип в ячейку:<br />
<a href="http://gltrainee.files.wordpress.com/2008/07/111dddd.jpg"><img class="aligncenter size-full wp-image-46" src="http://gltrainee.files.wordpress.com/2008/07/111dddd.jpg?w=605&#038;h=205" alt="" width="605" height="205" /></a></p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/gltrainee.wordpress.com/43/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/gltrainee.wordpress.com/43/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/gltrainee.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/gltrainee.wordpress.com/43/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/gltrainee.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/gltrainee.wordpress.com/43/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/gltrainee.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/gltrainee.wordpress.com/43/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/gltrainee.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/gltrainee.wordpress.com/43/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/gltrainee.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/gltrainee.wordpress.com/43/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gltrainee.wordpress.com&blog=3911599&post=43&subd=gltrainee&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://gltrainee.wordpress.com/2008/07/03/%d0%b8%d0%bc%d0%bf%d0%be%d1%80%d1%82%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5-udt-%d0%b2-ms-sql-server-2005/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/68d963ae477c9c1d15463d3a10c23b56?s=96&#38;d=monsterid" medium="image">
			<media:title type="html">masalov</media:title>
		</media:content>

		<media:content url="http://gltrainee.files.wordpress.com/2008/07/111sssss1.jpg" medium="image">
			<media:title type="html">Sample</media:title>
		</media:content>

		<media:content url="http://gltrainee.files.wordpress.com/2008/07/111dddd.jpg" medium="image" />
	</item>
	</channel>
</rss>