<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://msmvps.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Paulo Morgado : SQLServer</title><link>http://msmvps.com/blogs/paulomorgado/archive/tags/SQLServer/default.aspx</link><description>Tags: SQLServer</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP2 (Build: 40407.4157)</generator><item><title>Playing With SQL Server CLR Integration – Part IV (Deploying To SQL Server 2005)</title><link>http://msmvps.com/blogs/paulomorgado/archive/2009/06/13/playing-with-sql-server-clr-integration-part-iv-deploying-to-sql-server-2005.aspx</link><pubDate>Sat, 13 Jun 2009 08:39:10 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1695185</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1695185</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1695185</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2009/06/13/playing-with-sql-server-clr-integration-part-iv-deploying-to-sql-server-2005.aspx#comments</comments><description>&lt;p&gt;With all developed and tested on my laptop using &lt;a title="Microsoft SQL Server" href="http://www.microsoft.com/sqlserver/" target="_blank"&gt;SQL Server&lt;/a&gt; 2008, it’s time to deploy to the company’s test machine running SQL Server 2005.&lt;/p&gt;  &lt;p&gt;The first thing I ran into when executing:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;CREATE ASSEMBLY &lt;/span&gt;[MyAssembly]
&lt;span style="color:blue;"&gt;AUTHORIZATION &lt;/span&gt;[dbo]
&lt;span style="color:blue;"&gt;FROM &lt;/span&gt;&lt;span style="color:red;"&gt;&amp;#39;...\MyAssembly.dll&amp;#39;
&lt;/span&gt;&lt;span style="color:blue;"&gt;WITH PERMISSION_SET &lt;/span&gt;&lt;span style="color:gray;"&gt;= &lt;/span&gt;&lt;span style="color:blue;"&gt;SAFE
GO&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;was:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:red;"&gt;Msg 10327, Level 14, State 1, Line 1
Assembly &amp;#39;MyAssembly&amp;#39; references assembly &amp;#39;system.xml.linq, version=3.5.0.0, culture=neutral, publickeytoken=b77a5c561934e089.&amp;#39;,
which is not present in the current database.
SQL Server attempted to locate and automatically load the referenced assembly from the same location where referring assembly came from,
but that operation has failed (reason: 2(The system cannot find the file specified.)).
Please load the referenced assembly into the current database and retry your request.&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Looks like SQL Server 2005 doesn’t know about &lt;a title="Microsoft .NET" href="http://cli.gs/cligs/Microsoft-NET" target="_blank"&gt;.NET Framework&lt;/a&gt; 3.5. I’d just load the assemblies being used: &lt;strong&gt;System.Core&lt;/strong&gt; and &lt;strong&gt;System.Linq.Xml&lt;/strong&gt;:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;CREATE ASSEMBLY &lt;/span&gt;[System.Core]
&lt;span style="color:blue;"&gt;AUTHORIZATION &lt;/span&gt;[dbo]
&lt;span style="color:blue;"&gt;FROM &lt;/span&gt;&lt;span style="color:red;"&gt;&amp;#39;C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Core.dll&amp;#39;
&lt;/span&gt;&lt;span style="color:blue;"&gt;WITH PERMISSION_SET &lt;/span&gt;&lt;span style="color:gray;"&gt;= &lt;/span&gt;&lt;span style="color:blue;"&gt;SAFE
GO
&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Not so easy:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:black;"&gt;Warning: The Microsoft .Net frameworks assembly &amp;#39;system.core, version=3.5.0.0, culture=neutral, publickeytoken=b77a5c561934e089, processorarchitecture=msil.&amp;#39; you are registering is not fully tested in SQL Server hosted environment.&lt;/span&gt;
&lt;span style="color:red;"&gt;Msg 6218, Level 16, State 2, Line 1
CREATE ASSEMBLY for assembly &amp;#39;System.Core&amp;#39; failed because assembly &amp;#39;System.Core&amp;#39; failed verification. Check if the referenced assemblies are up-to-date and trusted (for external_access or unsafe) to execute in the database. CLR Verifier error messages if any will follow this message
[ : System.Diagnostics.Eventing.EventProvider::EtwRegister][mdToken=0x600003b][offset 0x0000003D][found Native Int][expected unmanaged pointer] Unexpected type on the stack.
[ : System.Diagnostics.Eventing.EventProvider::EncodeObject][mdToken=0x6000046][offset 0x00000000] Unmanaged pointers are not a verifiable type.
[ : System.Diagnostics.Eventing.EventProvider::WriteMessageEvent][mdToken=0x6000047][offset 0x0000003C][found ref &amp;#39;System.String&amp;#39;] Expected numeric type on the stack.
[ : System.Diagnostics.Eventing.EventProvider::WriteEvent][mdToken=0x6000049][offset 0x0000012E] Instruction cannot be verified.
[ : System.Diagnostics.Eventing.EventProvider::WriteEvent][mdToken=0x6000049][offset 0x00000030] Instruction cannot be verified.
[ : System.Diagnostics.Eventing.EventProvider::WriteEvent][mdToken=0x600004a][offset 0x0000005F][found ref &amp;#39;System.String&amp;#39;] Expected numeric type on the stack.
[ : System.Diagnostics.Eventing.EventProvider::WriteEvent][mdToken=0x600004b][offset 0x00000010][found unmanaged pointer][expected unmanaged pointer] Unexpected type on the stack.
[ : System.Diagnostics.Eventing.EventProvider::WriteTransferEvent][mdToken=0x600004c][offset 0x0000007D] Instruction cannot be verified.
[ : System.Diagnostics.Eventing.EventProvider::WriteTransferEvent][mdToken=0x600004c][offset 0x00000309][found Native Int][expected unmanaged pointer] Unexpected type on the stack.
[ : System.Diagnostics.Eventing.EventProvider::WriteTransferEvent][mdToken=0x600004d][offset 0x0000001B][found unmanaged pointer][expected unmanaged pointer] Unexpected type on the stack.
[ : System.Security.Cryptography.CapiNative::ImportSymmetricKey][mdToken=0x60007c2][offset 0x00000071][found address of Byte] Expected numeric type on the stac...&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Ok. I’d just load it with &lt;strong&gt;PERMISSION_SET = UNSAFE&lt;/strong&gt;:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;CREATE ASSEMBLY &lt;/span&gt;[MyAssembly]
&lt;span style="color:blue;"&gt;AUTHORIZATION &lt;/span&gt;[dbo]
&lt;span style="color:blue;"&gt;FROM &lt;/span&gt;&lt;span style="color:red;"&gt;&amp;#39;...\MyAssembly.dll&amp;#39;
&lt;/span&gt;&lt;span style="color:blue;"&gt;WITH PERMISSION_SET &lt;/span&gt;&lt;span style="color:gray;"&gt;= &lt;/span&gt;&lt;span style="color:blue;"&gt;UNSAFE
GO&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;Not yet:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:black;"&gt;Warning: The Microsoft .Net frameworks assembly &amp;#39;system.core, version=3.5.0.0, culture=neutral, publickeytoken=b77a5c561934e089, processorarchitecture=msil.&amp;#39; you are registering is not fully tested in SQL Server hosted environment.&lt;/span&gt;
&lt;span style="color:red;"&gt;Msg 10327, Level 14, State 1, Line 1
CREATE ASSEMBLY for assembly &amp;#39;System.Core&amp;#39; failed because assembly &amp;#39;System.Core&amp;#39; is not authorized for PERMISSION_SET = UNSAFE.
The assembly is authorized when either of the following is true: the database owner (DBO) has UNSAFE ASSEMBLY permission and the database has the TRUSTWORTHY database property on; or the assembly is signed with a certificate or an asymmetric key that has a corresponding login with UNSAFE ASSEMBLY permission.
If you have restored or attached this database, make sure the database owner is mapped to the correct login on this server.
If not, use sp_changedbowner to fix the problem.&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Solved:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;ALTER DATABASE &lt;/span&gt;MyDatabase &lt;span style="color:blue;"&gt;SET TRUSTWORTHY ON
GO&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Only than I was able to load the .NET 3.5 assemblies:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;CREATE ASSEMBLY &lt;/span&gt;[System.Core]
&lt;span style="color:blue;"&gt;AUTHORIZATION &lt;/span&gt;[dbo]
&lt;span style="color:blue;"&gt;FROM &lt;/span&gt;&lt;span style="color:red;"&gt;&amp;#39;C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Core.dll&amp;#39;
&lt;/span&gt;&lt;span style="color:blue;"&gt;WITH PERMISSION_SET &lt;/span&gt;&lt;span style="color:gray;"&gt;= &lt;/span&gt;&lt;span style="color:blue;"&gt;UNSAFE
GO

CREATE ASSEMBLY &lt;/span&gt;[System.Xml.Linq]
&lt;span style="color:blue;"&gt;AUTHORIZATION &lt;/span&gt;[dbo]
&lt;span style="color:blue;"&gt;FROM &lt;/span&gt;&lt;span style="color:red;"&gt;&amp;#39;C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Xml.Linq.dll&amp;#39;
&lt;/span&gt;&lt;span style="color:blue;"&gt;WITH PERMISSION_SET &lt;/span&gt;&lt;span style="color:gray;"&gt;= &lt;/span&gt;&lt;span style="color:blue;"&gt;UNSAFE
GO&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;With all dependencies in place, I tried to load the assembly with &lt;strong&gt;PERMISSION_SET = SAFE&lt;/strong&gt; with no luck:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:red;"&gt;Msg 6212, Level 16, State 1, Line 1
CREATE ASSEMBLY failed because method &amp;#39;ShortPropsToXml&amp;#39; on type &amp;#39;ShortProps&amp;#39;  in safe assembly &amp;#39;Esi.SA.Encyclopedia&amp;#39; is storing to a static field.
Storing to a static field is not allowed in safe assemblies.&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;It had to be with &lt;strong&gt;PERMISSION_SET = UNSAFE&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;After successfully loading the assemblies, I was finally able to create the &lt;a title="Transact-SQL Overview" href="http://cli.gs/Transact-SQL" target="_blank"&gt;Transact-SQL&lt;/a&gt; definitions for the functions (see &lt;a title="Playing With SQL Server CLR Integration - Part I" href="http://cli.gs/gupt5m" target="_blank"&gt;Part I&lt;/a&gt; and &lt;a title="Playing With SQL Server CLR Integration - Part II" href="http://cli.gs/2gs6GD" target="_blank"&gt;Part II&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Now the DBAs won’t definitely let me use this, but it was fun to build it.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1695185" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SoftDev/default.aspx">SoftDev</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SQLServer/default.aspx">SQLServer</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SQLServer2005/default.aspx">SQLServer2005</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SQLCLR/default.aspx">SQLCLR</category></item><item><title>Playing With SQL Server CLR Integration – Part III</title><link>http://msmvps.com/blogs/paulomorgado/archive/2009/06/12/playing-with-sql-server-clr-integration-part-iii.aspx</link><pubDate>Fri, 12 Jun 2009 00:11:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1695056</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1695056</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1695056</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2009/06/12/playing-with-sql-server-clr-integration-part-iii.aspx#comments</comments><description>&lt;p&gt;You might have noticed that I used &lt;a title="Language-Integrated Query (LINQ)" href="http://msdn2.microsoft.com/library/bb397926.aspx" target="_blank"&gt;LINQ&lt;/a&gt; in my last Playing With SQL Server CLR Integration posts (&lt;a title="Playing With SQL Server CLR Integration - Part I" href="http://cli.gs/gupt5m" target="_blank"&gt;Part I&lt;/a&gt;, &lt;a title="Playing With SQL Server CLR Integration - Part II" href="http://cli.gs/2gs6GD" target="_blank"&gt;Part II&lt;/a&gt;).&lt;/p&gt;  &lt;p&gt;I couldn’t make it work with the standard &lt;a title="Microsoft Visual Studio" href="http://cli.gs/vstudio" target="_blank"&gt;Visual Studio&lt;/a&gt; 2008 SQL CLR project template. Changing the &lt;strong&gt;Target Framework&lt;/strong&gt; to &lt;a title=".NET Framework" href="http://cli.gs/netframework" target="_blank"&gt;&lt;/a&gt;&lt;a title="Microsoft .NET" href="http://cli.gs/cligs/Microsoft-NET" target="_blank"&gt;.NET Framework&lt;/a&gt; 3.5&lt;/a&gt; wasn’t enough. I had to edit the &lt;strong&gt;.csproj&lt;/strong&gt; file by hand:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;p&gt;&lt;span style="color:blue;"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#a31515;"&gt;xml &lt;/span&gt;&lt;span style="color:red;"&gt;version&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;1.0&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;encoding&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;utf-8&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;?&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Project &lt;/span&gt;&lt;span style="color:red;"&gt;ToolsVersion&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;3.5&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;DefaultTargets&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;Build&lt;/span&gt;&amp;quot; &lt;span style="color:red;"&gt;xmlns&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;http://schemas.microsoft.com/developer/msbuild/2003&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&amp;gt;&lt;span style="color:blue;"&gt;&lt;/span&gt;
&lt;span style="color:blue;"&gt;  &amp;lt;!—&lt;/span&gt;&lt;span style="color:green;"&gt; ... &lt;span style="color:blue;"&gt;--&lt;/span&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:blue;"&gt;  &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ItemGroup&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;&lt;span style="color:blue;"&gt;!—&lt;/span&gt;&lt;span style="color:green;"&gt; ... &lt;span style="color:blue;"&gt;--&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
&lt;strong&gt;    &amp;lt;&lt;/strong&gt;&lt;/span&gt;&lt;strong&gt;&lt;span style="color:#a31515;"&gt;Reference &lt;/span&gt;&lt;span style="color:red;"&gt;Include&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;System.Core&lt;/span&gt;&amp;quot;&lt;/strong&gt;&lt;strong&gt;&lt;span style="color:blue;"&gt;&amp;gt;
      &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;RequiredTargetFramework&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;3.5&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;RequiredTargetFramework&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="color:blue;"&gt;&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Reference&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="color:blue;"&gt;&amp;gt;
&lt;/span&gt;&lt;span style="color:blue;"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Reference &lt;/span&gt;&lt;span style="color:red;"&gt;Include&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;System.Xml.Linq&lt;/span&gt;&amp;quot;&lt;/strong&gt;&lt;strong&gt;&lt;span style="color:blue;"&gt;&amp;gt;
      &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;RequiredTargetFramework&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;3.5&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;RequiredTargetFramework&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="color:blue;"&gt;&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Reference&lt;/span&gt;&lt;/strong&gt;&lt;span style="color:blue;"&gt;&lt;strong&gt;&amp;gt;&lt;/strong&gt;
  &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ItemGroup&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
&lt;/span&gt;&lt;span style="color:blue;"&gt;  &amp;lt;&lt;span style="color:blue;"&gt;!—&lt;/span&gt;&lt;span style="color:green;"&gt; ... &lt;span style="color:blue;"&gt;--&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Project&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1695056" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SoftDev/default.aspx">SoftDev</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SQLServer/default.aspx">SQLServer</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SQLServer2008/default.aspx">SQLServer2008</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SQLServer2005/default.aspx">SQLServer2005</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SQLCLR/default.aspx">SQLCLR</category></item><item><title>Playing With SQL Server CLR Integration – Part II</title><link>http://msmvps.com/blogs/paulomorgado/archive/2009/06/12/playing-with-sql-server-clr-integration-part-ii.aspx</link><pubDate>Thu, 11 Jun 2009 23:52:37 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1695052</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1695052</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1695052</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2009/06/12/playing-with-sql-server-clr-integration-part-ii.aspx#comments</comments><description>&lt;p align="justify"&gt;On my last &lt;a title="Playing With SQL Server CLR Integration – Part I" href="http://cli.gs/gupt5m" target="_blank"&gt;post&lt;/a&gt;, I showed how to convert a property bag stored in text to a &lt;a title="CLR Table-Valued Functions" href="http://cli.gs/DGRt9u" target="_blank"&gt;CLR Table-Valued Function&lt;/a&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;I started thinking that I could retrieve the property values, but I couldn’t change them or add new properties.&lt;/p&gt;  &lt;p align="justify"&gt;Passing a table as a parameter is still not possible in &lt;a title="Microsoft SQL Server" href="http://www.microsoft.com/sqlserver/" target="_blank"&gt;SQL Server&lt;/a&gt; 2005. And that would force me to load the table into a variable, change it and load it back into the property bag.&lt;/p&gt;  &lt;p align="justify"&gt;Or I could create functions to Create, Update and Delete properties from the property bag.&lt;/p&gt;  &lt;p align="justify"&gt;Or I could just use XML. All it takes is creating a &lt;a title="CLR Scalar-Valued Functions" href="http://cli.gs/ySuXMU" target="_blank"&gt;CLR Scalar-Valued Function&lt;/a&gt; to convert the property bag to an XML representation and another to convert the XML back to the property bag format.&lt;/p&gt;  &lt;p align="justify"&gt;It still makes me load the property bag into a variable if I want to change it, but it’s usable in SQL Server 2005, which was the targeted platform.&lt;/p&gt;  &lt;p align="justify"&gt;Converting the property bag to an XML document is easy using the previously created enumerator:&lt;/p&gt;  &lt;pre class="code"&gt;[Microsoft.SqlServer.Server.&lt;span style="color:#2b91af;"&gt;SqlFunction&lt;/span&gt;(
    Name = &lt;span style="color:#a31515;"&gt;&amp;quot;ShortPropsToXml&amp;quot;&lt;/span&gt;,
    IsDeterministic = &lt;span style="color:blue;"&gt;true&lt;/span&gt;,
    IsPrecise = &lt;span style="color:blue;"&gt;false&lt;/span&gt;,
    DataAccess = &lt;span style="color:#2b91af;"&gt;DataAccessKind&lt;/span&gt;.None,
    SystemDataAccess = &lt;span style="color:#2b91af;"&gt;SystemDataAccessKind&lt;/span&gt;.None)]
&lt;span style="color:blue;"&gt;public static &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;SqlXml &lt;/span&gt;ShortPropsToXml(&lt;span style="color:blue;"&gt;string &lt;/span&gt;shortPropsText)
{
    &lt;span style="color:blue;"&gt;var &lt;/span&gt;xml = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;XElement&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;ShortProps&amp;quot;&lt;/span&gt;,
        &lt;span style="color:blue;"&gt;from &lt;/span&gt;shortProp &lt;span style="color:blue;"&gt;in &lt;/span&gt;ShortPropsEnumerable(shortPropsText)
        &lt;span style="color:blue;"&gt;select new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;XElement&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;p&amp;quot;&lt;/span&gt;,
            &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;XAttribute&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;n&amp;quot;&lt;/span&gt;, shortProp.Key),
            &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;XCData&lt;/span&gt;(shortProp.Value)));

    &lt;span style="color:blue;"&gt;using &lt;/span&gt;(&lt;span style="color:blue;"&gt;var &lt;/span&gt;buffer = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;MemoryStream&lt;/span&gt;())
    {
        &lt;span style="color:blue;"&gt;using &lt;/span&gt;(&lt;span style="color:blue;"&gt;var &lt;/span&gt;xmlWriter = &lt;span style="color:#2b91af;"&gt;XmlWriter&lt;/span&gt;.Create(buffer, &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;XmlWriterSettings &lt;/span&gt;{ CheckCharacters = &lt;span style="color:blue;"&gt;false &lt;/span&gt;}))
        {
            xml.WriteTo(xmlWriter);
        }

        buffer.Position = 0;

        &lt;span style="color:blue;"&gt;using &lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;XmlReader &lt;/span&gt;xmlReader = &lt;span style="color:#2b91af;"&gt;XmlReader&lt;/span&gt;.Create(buffer, &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;XmlReaderSettings &lt;/span&gt;{ CheckCharacters = &lt;span style="color:blue;"&gt;false &lt;/span&gt;}))
        {
            &lt;span style="color:blue;"&gt;return new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;SqlXml&lt;/span&gt;(xmlReader);
        }
    }
}&lt;/pre&gt;

&lt;p align="justify"&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;Converting the an XML document back into the property bag format is also easy:&lt;/p&gt;

&lt;pre class="code"&gt;[Microsoft.SqlServer.Server.&lt;span style="color:#2b91af;"&gt;SqlFunction&lt;/span&gt;(
    Name = &lt;span style="color:#a31515;"&gt;&amp;quot;XmlToShortProps&amp;quot;&lt;/span&gt;,
    IsDeterministic = &lt;span style="color:blue;"&gt;true&lt;/span&gt;,
    IsPrecise = &lt;span style="color:blue;"&gt;false&lt;/span&gt;,
    DataAccess = &lt;span style="color:#2b91af;"&gt;DataAccessKind&lt;/span&gt;.None,
    SystemDataAccess = &lt;span style="color:#2b91af;"&gt;SystemDataAccessKind&lt;/span&gt;.None)]
&lt;span style="color:blue;"&gt;public static &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;SqlChars &lt;/span&gt;XmlToShortProps(&lt;span style="color:#2b91af;"&gt;SqlXml &lt;/span&gt;shortPropsXml)
{
    &lt;span style="color:blue;"&gt;var &lt;/span&gt;xml = &lt;span style="color:#2b91af;"&gt;XDocument&lt;/span&gt;.Parse(shortPropsXml.Value);

    &lt;span style="color:blue;"&gt;var &lt;/span&gt;textBuilder = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;StringBuilder&lt;/span&gt;();
    &lt;span style="color:blue;"&gt;foreach &lt;/span&gt;(&lt;span style="color:blue;"&gt;var &lt;/span&gt;item &lt;span style="color:blue;"&gt;in &lt;/span&gt;xml.Document.Element(&lt;span style="color:#a31515;"&gt;&amp;quot;ShortProps&amp;quot;&lt;/span&gt;).Elements(&lt;span style="color:#a31515;"&gt;&amp;quot;p&amp;quot;&lt;/span&gt;))
    {
        textBuilder.AppendFormat(&lt;span style="color:#a31515;"&gt;&amp;quot;[[[{1}]]]{0}{2}{0}&amp;quot;&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;Environment&lt;/span&gt;.NewLine, item.Attribute(&lt;span style="color:#a31515;"&gt;&amp;quot;n&amp;quot;&lt;/span&gt;).Value, item.Value);
    }

    &lt;span style="color:blue;"&gt;return new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;SqlChars&lt;/span&gt;(textBuilder.ToString().ToCharArray());
}&lt;/pre&gt;

&lt;p align="justify"&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;Now it’s just uploading the new version of the assembly to the database:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;ALTER ASSEMBLY &lt;/span&gt;[MyAssembly]
&lt;span style="color:blue;"&gt;FROM &lt;/span&gt;&lt;span style="color:red;"&gt;&amp;#39;...\MyAssembly.dll&amp;#39;
&lt;/span&gt;&lt;span style="color:blue;"&gt;GO&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;And defining the Scalar-Valued Functions in &lt;a title="Transact-SQL Overview" href="http://cli.gs/Transact-SQL" target="_blank"&gt;Transact-SQL&lt;/a&gt;:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;CREATE FUNCTION &lt;/span&gt;[dbo]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShortPropsToXml]&lt;span style="color:gray;"&gt;(&lt;/span&gt;@shortPropsText [nvarchar]&lt;span style="color:gray;"&gt;(&lt;/span&gt;4000&lt;span style="color:gray;"&gt;))
&lt;/span&gt;&lt;span style="color:blue;"&gt;RETURNS &lt;/span&gt;[xml] &lt;span style="color:blue;"&gt;WITH EXECUTE AS CALLER
AS 
EXTERNAL &lt;/span&gt;NAME [Esi.SA.Encyclopedia]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShortProps]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShortPropsToXml]
&lt;span style="color:blue;"&gt;GO
&lt;/span&gt;
&lt;span style="color:blue;"&gt;CREATE FUNCTION &lt;/span&gt;[dbo]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[XmlToShortProps]&lt;span style="color:gray;"&gt;(&lt;/span&gt;@shortPropsXml [xml]&lt;span style="color:gray;"&gt;)
&lt;/span&gt;&lt;span style="color:blue;"&gt;RETURNS &lt;/span&gt;[nvarchar]&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:magenta;"&gt;max&lt;/span&gt;&lt;span style="color:gray;"&gt;) &lt;/span&gt;&lt;span style="color:blue;"&gt;WITH EXECUTE AS CALLER
AS 
EXTERNAL &lt;/span&gt;NAME [Esi.SA.Encyclopedia]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShortProps]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[XmlToShortProps]
&lt;span style="color:blue;"&gt;GO
&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;And it’s all set to go.&lt;/p&gt;

&lt;p align="justify"&gt;Now, given this property bag definition:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;declare &lt;/span&gt;@text &lt;span style="color:blue;"&gt;nvarchar&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:magenta;"&gt;max&lt;/span&gt;&lt;span style="color:gray;"&gt;)=&lt;/span&gt;&lt;span style="color:red;"&gt;&amp;#39;[[[name1]]]
value1
[[[name2]]]
value2
[[[name3]]]
value3
&amp;#39;
&lt;/span&gt;&lt;/pre&gt;

&lt;p align="justify"&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;I can change it into XML:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;DECLARE &lt;/span&gt;@xml [xml] &lt;span style="color:gray;"&gt;= &lt;/span&gt;dbo&lt;span style="color:gray;"&gt;.&lt;/span&gt;ShortPropsToXml&lt;span style="color:gray;"&gt;(&lt;/span&gt;@text&lt;span style="color:gray;"&gt;)&lt;/span&gt;&lt;/pre&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;div align="justify"&gt;Update: &lt;/div&gt;

    &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;set &lt;/span&gt;@xml&lt;span style="color:gray;"&gt;.&lt;/span&gt;&lt;span style="color:blue;"&gt;modify&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:red;"&gt;&amp;#39;replace value of (/ShortProps/p[@n=&amp;quot;name2&amp;quot;]/text())[1] with &amp;quot;new value2&amp;quot;&amp;#39;&lt;/span&gt;&lt;span style="color:gray;"&gt;)
&lt;/span&gt;&lt;/pre&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;Insert: &lt;/div&gt;

    &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;set &lt;/span&gt;@xml&lt;span style="color:gray;"&gt;.&lt;/span&gt;&lt;span style="color:blue;"&gt;modify&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:red;"&gt;&amp;#39;insert &amp;lt;p n=&amp;quot;name4&amp;quot;&amp;gt;Value4.1
Value4.2&amp;lt;/p&amp;gt; after (/ShortProps/p[@n=&amp;quot;name2&amp;quot;])[1]&amp;#39;&lt;/span&gt;&lt;span style="color:gray;"&gt;)&lt;/span&gt;&lt;/pre&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;Delete &lt;/div&gt;

    &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;set &lt;/span&gt;@xml&lt;span style="color:gray;"&gt;.&lt;/span&gt;&lt;span style="color:blue;"&gt;modify&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:red;"&gt;&amp;#39;delete (/ShortProps/p[@n=&amp;quot;name3&amp;quot;])[1]&amp;#39;&lt;/span&gt;&lt;span style="color:gray;"&gt;)&lt;/span&gt;&lt;/pre&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;p align="justify"&gt;Convert back to the property bag format: &lt;/p&gt;

    &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;print &lt;/span&gt;dbo&lt;span style="color:gray;"&gt;.&lt;/span&gt;XmlToShortProps&lt;span style="color:gray;"&gt;(&lt;/span&gt;@xml&lt;span style="color:gray;"&gt;)&lt;/span&gt;&lt;/pre&gt;
    &lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

    &lt;pre class="code"&gt;[[[name1]]]
value1
[[[name2]]]
new value2
[[[name4]]]
Value4.1
Value4.2&lt;/pre&gt;
    &lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p align="justify"&gt;Query as a table: &lt;/p&gt;

    &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;select &lt;/span&gt;T&lt;span style="color:gray;"&gt;.&lt;/span&gt;C&lt;span style="color:gray;"&gt;.&lt;/span&gt;value&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:red;"&gt;&amp;#39;./@n&amp;#39;&lt;/span&gt;&lt;span style="color:gray;"&gt;, &lt;/span&gt;&lt;span style="color:red;"&gt;&amp;#39;nvarchar(max)&amp;#39;&lt;/span&gt;&lt;span style="color:gray;"&gt;) &lt;/span&gt;&lt;span style="color:blue;"&gt;as &lt;/span&gt;Name&lt;span style="color:gray;"&gt;, &lt;/span&gt;T&lt;span style="color:gray;"&gt;.&lt;/span&gt;C&lt;span style="color:gray;"&gt;.&lt;/span&gt;value&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:red;"&gt;&amp;#39;.&amp;#39;&lt;/span&gt;&lt;span style="color:gray;"&gt;, &lt;/span&gt;&lt;span style="color:red;"&gt;&amp;#39;nvarchar(max)&amp;#39;&lt;/span&gt;&lt;span style="color:gray;"&gt;) &lt;/span&gt;&lt;span style="color:blue;"&gt;as &lt;/span&gt;Value &lt;span style="color:blue;"&gt;from &lt;/span&gt;@xml&lt;span style="color:gray;"&gt;.&lt;/span&gt;nodes&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:red;"&gt;&amp;#39;/ShortProps/p&amp;#39;&lt;/span&gt;&lt;span style="color:gray;"&gt;) &lt;/span&gt;T&lt;span style="color:gray;"&gt;(&lt;/span&gt;C&lt;span style="color:gray;"&gt;)&lt;/span&gt;&lt;/pre&gt;

    &lt;table style="border-bottom:black thin solid;border-left:black thin solid;border-top:black thin solid;border-right:black thin solid;"&gt;&lt;tbody&gt;
        &lt;tr&gt;
          &lt;th style="border-bottom:black thin solid;border-left:black thin solid;border-top:black thin solid;border-right:black thin solid;"&gt;Name&lt;/th&gt;

          &lt;th style="border-bottom:black thin solid;border-left:black thin solid;border-top:black thin solid;border-right:black thin solid;"&gt;Value&lt;/th&gt;
        &lt;/tr&gt;

        &lt;tr&gt;
          &lt;td style="border-bottom:black thin solid;border-left:black thin solid;border-top:black thin solid;border-right:black thin solid;"&gt;name1&lt;/td&gt;

          &lt;td style="border-bottom:black thin solid;border-left:black thin solid;border-top:black thin solid;border-right:black thin solid;"&gt;value1&lt;/td&gt;
        &lt;/tr&gt;

        &lt;tr&gt;
          &lt;td style="border-bottom:black thin solid;border-left:black thin solid;border-top:black thin solid;border-right:black thin solid;"&gt;name2&lt;/td&gt;

          &lt;td style="border-bottom:black thin solid;border-left:black thin solid;border-top:black thin solid;border-right:black thin solid;"&gt;new value2&lt;/td&gt;
        &lt;/tr&gt;

        &lt;tr&gt;
          &lt;td style="border-bottom:black thin solid;border-left:black thin solid;border-top:black thin solid;border-right:black thin solid;"&gt;name4&lt;/td&gt;

          &lt;td style="border-bottom:black thin solid;border-left:black thin solid;border-top:black thin solid;border-right:black thin solid;"&gt;Value4.1 
            &lt;br /&gt;Value4.2&lt;/td&gt;
        &lt;/tr&gt;
      &lt;/tbody&gt;&lt;/table&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p align="justify"&gt;Unfortunately, the application uses characters that are invalid to SQL Server as XML characters and I can’t use it on that application. I’ll have to understand those values better and add other fields to the table and XML.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1695052" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SoftDev/default.aspx">SoftDev</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SQLServer/default.aspx">SQLServer</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/XML/default.aspx">XML</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SQLServer2008/default.aspx">SQLServer2008</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SQLServer2005/default.aspx">SQLServer2005</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SQLCLR/default.aspx">SQLCLR</category></item><item><title>Playing With SQL Server CLR Integration – Part I</title><link>http://msmvps.com/blogs/paulomorgado/archive/2009/06/12/playing-with-sql-server-clr-integration-part-i.aspx</link><pubDate>Thu, 11 Jun 2009 23:41:14 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1695049</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1695049</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1695049</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2009/06/12/playing-with-sql-server-clr-integration-part-i.aspx#comments</comments><description>&lt;p align="justify"&gt;I’m currently working with an application that stores a property bag in a &lt;a title="Microsoft SQL Server" href="http://www.microsoft.com/sqlserver/" target="_blank"&gt;SQL Server&lt;/a&gt; column like this:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color:black;"&gt;[[[name1]]]
value1
[[[name2]]]
value2.1
value2.2
[[[name3]]]
value3&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;Don’t ask me why it’s done like this. It just is.&lt;/p&gt;

&lt;p align="justify"&gt;The application decodes this property bag into its inner structures and all works fine.&lt;/p&gt;

&lt;p align="justify"&gt;Sometimes I would like to query the database directly or do some reporting on those properties and just can’t.&lt;/p&gt;

&lt;p align="justify"&gt;So, I thought this was a good use case for SQL Server &lt;a title="Overview of CLR Integration" href="http://cli.gs/rDr0Yj" target="_blank"&gt;CLR Integration&lt;/a&gt;. I decided to build a &lt;a title="CLR Table-Valued Functions" href="http://cli.gs/DGRt9u" target="_blank"&gt;CLR Table-Valued Function&lt;/a&gt; that would return the property bag as a two column table.&lt;/p&gt;

&lt;p align="justify"&gt;Parsing the property bag text can easily be achieved with a simple regular expression:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Regex&lt;/span&gt;(
        &lt;span style="color:blue;"&gt;string&lt;/span&gt;.Format(&lt;span style="color:#a31515;"&gt;@&amp;quot;(?&amp;lt;Name&amp;gt;(?&amp;lt;=\[\[\[).*(?=\]\]\]{0}))\]\]\]{0}(?&amp;lt;Value&amp;gt;(([\s\S]*?(?={0}\[\[\[))|([\s\S]*?(?={0}$))))&amp;quot;&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;Environment&lt;/span&gt;.NewLine),
        &lt;span style="color:#2b91af;"&gt;RegexOptions&lt;/span&gt;.Multiline | &lt;span style="color:#2b91af;"&gt;RegexOptions&lt;/span&gt;.ExplicitCapture | &lt;span style="color:#2b91af;"&gt;RegexOptions&lt;/span&gt;.CultureInvariant | &lt;span style="color:#2b91af;"&gt;RegexOptions&lt;/span&gt;.Compiled);&lt;/pre&gt;

&lt;p align="justify"&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a title="Ultrapico" href="http://cli.gs/Ultrapico" target="_blank"&gt;Ultrapico&lt;/a&gt;’s &lt;a title="Ultrapico&amp;#39;s Expresso" href="http://cli.gs/Ultrapico-Expresso" target="_blank"&gt;Expresso&lt;/a&gt; was a big help when developing this regular expression.&lt;/p&gt;

&lt;p align="justify"&gt;In case you don’t know, the way CLR Table-Valued Function are built is using an initial method to take the input and return an IEnumerable and row filler method the receives the enumerator item and outputs the column values.&lt;/p&gt;

&lt;p align="justify"&gt;Since these are really key-value pairs of strings, I decided to use &lt;a title="KeyValuePair&amp;lt;(Of &amp;lt;(TKey, TValue&amp;gt;)&amp;gt;) Structure" href="http://msdn.microsoft.com/library/5tbh8a42.aspx" target="_blank"&gt;)&amp;gt;) Structure&amp;quot; href=&amp;quot;http://msdn.microsoft.com/library/5tbh8a42.aspx&amp;quot; target=_blank&amp;gt;KeyValuePair&lt;/a&gt;&amp;lt;string, string&amp;gt; instances to store each item and the enumerator became simply this:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;private static &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;KeyValuePair&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;, &lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;gt;&amp;gt; ShortPropsEnumerable(&lt;span style="color:blue;"&gt;string &lt;/span&gt;shortPropsText)
{
    &lt;span style="color:blue;"&gt;return from &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Match &lt;/span&gt;m &lt;span style="color:blue;"&gt;in &lt;/span&gt;shortPropsRegex.Matches(shortPropsText)
           &lt;span style="color:blue;"&gt;select new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;KeyValuePair&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;, &lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;gt;(m.Groups[&lt;span style="color:#a31515;"&gt;&amp;quot;Name&amp;quot;&lt;/span&gt;].Value, m.Groups[&lt;span style="color:#a31515;"&gt;&amp;quot;Value&amp;quot;&lt;/span&gt;].Value);
}&lt;/pre&gt;

&lt;p align="justify"&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;And the implementation of the CLR Table-Valued Function is as simple as this: &lt;/p&gt;

&lt;pre class="code"&gt;[Microsoft.SqlServer.Server.&lt;span style="color:#2b91af;"&gt;SqlFunction&lt;/span&gt;(
    Name = &lt;span style="color:#a31515;"&gt;&amp;quot;ShortPropsToTable&amp;quot;&lt;/span&gt;,
    FillRowMethodName = &lt;span style="color:#a31515;"&gt;&amp;quot;ShortPropsToTableFillRow&amp;quot;&lt;/span&gt;,
    TableDefinition = &lt;span style="color:#a31515;"&gt;&amp;quot;Name NVARCHAR(4000), Value NVARCHAR(4000)&amp;quot;&lt;/span&gt;,
    IsDeterministic = &lt;span style="color:blue;"&gt;true&lt;/span&gt;,
    IsPrecise = &lt;span style="color:blue;"&gt;false&lt;/span&gt;,
    DataAccess = &lt;span style="color:#2b91af;"&gt;DataAccessKind&lt;/span&gt;.None,
    SystemDataAccess = &lt;span style="color:#2b91af;"&gt;SystemDataAccessKind&lt;/span&gt;.None)]
&lt;span style="color:blue;"&gt;public static &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IEnumerable &lt;/span&gt;ShortPropsToTable(&lt;span style="color:blue;"&gt;string &lt;/span&gt;shortPropsText)
{
    &lt;span style="color:blue;"&gt;return &lt;/span&gt;ShortPropsEnumerable(shortPropsText);
}

&lt;span style="color:blue;"&gt;public static void &lt;/span&gt;ShortPropsToTableFillRow(&lt;span style="color:blue;"&gt;object &lt;/span&gt;item, &lt;span style="color:blue;"&gt;out &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;SqlChars &lt;/span&gt;name, &lt;span style="color:blue;"&gt;out &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;SqlChars &lt;/span&gt;value)
{
    &lt;span style="color:#2b91af;"&gt;KeyValuePair&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;, &lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;gt; shortProp = (&lt;span style="color:#2b91af;"&gt;KeyValuePair&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;, &lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;gt;)item;

    name = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;SqlChars&lt;/span&gt;(shortProp.Key);
    value = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;SqlChars&lt;/span&gt;(shortProp.Value);
}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;To use this in SQL Server a few simple steps are need:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;div align="justify"&gt;Load the assembly into the database: &lt;/div&gt;

    &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;CREATE ASSEMBLY &lt;/span&gt;[MyAssembly]
&lt;span style="color:blue;"&gt;AUTHORIZATION &lt;/span&gt;[dbo]
&lt;span style="color:blue;"&gt;FROM &lt;/span&gt;&lt;span style="color:red;"&gt;&amp;#39;...\MyAssembly.dll&amp;#39;
&lt;/span&gt;&lt;span style="color:blue;"&gt;WITH PERMISSION_SET &lt;/span&gt;&lt;span style="color:gray;"&gt;= &lt;/span&gt;&lt;span style="color:blue;"&gt;SAFE
GO&lt;/span&gt;&lt;/pre&gt;
    &lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;Defining the &lt;a title="Table-Valued User-Defined Functions" href="http://cli.gs/GngXhh" target="_blank"&gt;Table-Valued User-Defined Function&lt;/a&gt; in &lt;a title="Transact-SQL Overview" href="http://cli.gs/Transact-SQL" target="_blank"&gt;Transact-SQL&lt;/a&gt;: &lt;/div&gt;

    &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;CREATE FUNCTION &lt;/span&gt;[dbo]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShortPropsToTable]&lt;span style="color:gray;"&gt;(&lt;/span&gt;@shortPropsText [nvarchar]&lt;span style="color:gray;"&gt;(&lt;/span&gt;4000&lt;span style="color:gray;"&gt;))
&lt;/span&gt;&lt;span style="color:blue;"&gt;RETURNS  TABLE &lt;/span&gt;&lt;span style="color:gray;"&gt;(
    &lt;/span&gt;[Name] [nvarchar]&lt;span style="color:gray;"&gt;(&lt;/span&gt;4000&lt;span style="color:gray;"&gt;) NULL,
    &lt;/span&gt;[Value] [nvarchar]&lt;span style="color:gray;"&gt;(&lt;/span&gt;4000&lt;span style="color:gray;"&gt;) NULL
) &lt;/span&gt;&lt;span style="color:blue;"&gt;WITH EXECUTE AS CALLER
AS 
EXTERNAL &lt;/span&gt;NAME [MyAssembly]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShortProps]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShortPropsToTable]
&lt;span style="color:blue;"&gt;GO
&lt;/span&gt;&lt;/pre&gt;
    &lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;Enable CLR Integration: &lt;/div&gt;

    &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;EXEC &lt;/span&gt;&lt;span style="color:maroon;"&gt;sp_configure &lt;/span&gt;&lt;span style="color:red;"&gt;&amp;#39;clr enabled&amp;#39;&lt;/span&gt;&lt;span style="color:gray;"&gt;, &lt;/span&gt;1
&lt;span style="color:blue;"&gt;GO
RECONFIGURE
GO
&lt;/span&gt;&lt;/pre&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p align="justify"&gt;And all is set to go.&lt;/p&gt;

&lt;p align="justify"&gt;Now I can just query the property bag as a table:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;SELECT
    &lt;/span&gt;e&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ID]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;e&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Name]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;e&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Class]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;e&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Type]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;p&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Name]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;p&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Value]
&lt;span style="color:blue;"&gt;FROM
    &lt;/span&gt;dbo&lt;span style="color:gray;"&gt;.&lt;/span&gt;Entity &lt;span style="color:blue;"&gt;as &lt;/span&gt;e
    &lt;span style="color:gray;"&gt;CROSS APPLY &lt;/span&gt;dbo&lt;span style="color:gray;"&gt;.&lt;/span&gt;ShortPropsToTable&lt;span style="color:gray;"&gt;(&lt;/span&gt;e&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ShortProps]&lt;span style="color:gray;"&gt;) &lt;/span&gt;&lt;span style="color:blue;"&gt;as &lt;/span&gt;p&lt;/pre&gt;

&lt;p align="justify"&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;Just for curiosity, for a little over 50000 entities (that can be retrieved on about 1 second on my laptop), I got a little under 630000 properties in les then 40 seconds.&lt;/p&gt;

&lt;p align="justify"&gt;40 seconds might seem a lot compared to the 1 second, but I would like to see better times using T-SQL. And develop and test the TVF in just a couple of hours.&lt;/p&gt;

&lt;p align="justify"&gt;Now, if only he DBAs would allow me to use it. It doesn’t fit into the company’s “security policy”, you know.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1695049" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SoftDev/default.aspx">SoftDev</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SQLServer/default.aspx">SQLServer</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SQLServer2008/default.aspx">SQLServer2008</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SQLServer2005/default.aspx">SQLServer2005</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SQLCLR/default.aspx">SQLCLR</category></item><item><title>Tip: Connecting To A Database Using Windows Authentication With Different Credentials Using SQL Server Management Studio</title><link>http://msmvps.com/blogs/paulomorgado/archive/2009/05/04/tip-connecting-to-a-database-using-windows-authentication-with-different-credentials-using-sql-server-management-studio.aspx</link><pubDate>Sun, 03 May 2009 23:34:19 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1691800</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1691800</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1691800</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2009/05/04/tip-connecting-to-a-database-using-windows-authentication-with-different-credentials-using-sql-server-management-studio.aspx#comments</comments><description>&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p align="justify"&gt;It is a good security practice to use &lt;a title="Microsoft Windows" href="http://cli.gs/Microsoft-Windows" target="_blank"&gt;Windows&lt;/a&gt; Authentication to connect to &lt;a title="Microsoft SQL Server" href="http://www.microsoft.com/sqlserver/" target="_blank"&gt;SQL Server&lt;/a&gt; because you don’t need to write the password on some configuration file or registry entry.&lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p align="justify"&gt;This practice also brings governance benefits. Managing users becomes part of domain administration and not part of each SQL Server instance’s administration.&lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p align="justify"&gt;But this becomes an hassle to users (in this context, the user is someone that needs to perform administration task of some kind – a &lt;a title="Introducing SQL Server Management Studio" href="http://msdn.microsoft.com/library/ms174173.aspx" target="_blank"&gt;SQL Server Management Studio&lt;/a&gt; user) who need to connect to databases using different credentials.&lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p align="justify"&gt;One workaround is using the &lt;a title="Runas" href="http://technet.microsoft.com/library/bb490994.aspx" target="_blank"&gt;runas&lt;/a&gt; command:&lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;pre class="code"&gt;runas /user:&lt;em&gt;DOMAIN\USERNAME&lt;/em&gt; &amp;quot;C:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\Ssms.exe&amp;quot;&lt;/pre&gt;
&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;p&gt;But if you are working on an environment were there are several domains and your machine does not belong to the domain of the ser account you want to use, you’ll get the folloing error:&lt;/p&gt;
&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;pre class="code"&gt;RUNAS ERROR: Unable to run - C:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\Ssms.exe
1787: The security database on the server does not have a computer account for this workstation trust relationship.&lt;/pre&gt;
&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;But not everything is lost. Because you want to make a remote connection, you can use the &lt;strong&gt;/netonly&lt;/strong&gt; switch, and it works just fine:&lt;/p&gt;
&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;pre class="code"&gt;runas /netonly /user:&lt;em&gt;DOMAIN\USERNAME&lt;/em&gt; &amp;quot;C:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\Ssms.exe&amp;quot;&lt;/pre&gt;
&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;SQL Server Management Studio still shows all the databases in the server (unlike what happens if you connect from a machine logged in as the user you want to access to the SQL Server instance), but &lt;a title="Apex SQL Edit : A complete Editor / IDE for SQL Server" href="http://cli.gs/ApexSQL-Edit" target="_blank"&gt;ApexSQL Edit&lt;/a&gt; will only show the databases that account has access to.&lt;/p&gt;
&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1691800" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SQLServer/default.aspx">SQLServer</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Windows/default.aspx">Windows</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/TipsAndTricks/default.aspx">TipsAndTricks</category></item><item><title>Microsoft Releases SQL Server 2008</title><link>http://msmvps.com/blogs/paulomorgado/archive/2008/08/06/microsoft-releases-sql-server-2008.aspx</link><pubDate>Wed, 06 Aug 2008 22:44:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1643612</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1643612</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1643612</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2008/08/06/microsoft-releases-sql-server-2008.aspx#comments</comments><description>&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p align="center"&gt;&lt;a title="SQL Server 2008" href="http://www.microsoft.com/sqlserver/" target="_blank"&gt;&lt;img src="http://www.microsoft.com/global/sqlserver/2008/en/us/PublishingImages/diag-sql2008-lg.gif" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p align="justify"&gt;&lt;a title="Microsoft SQL Server" href="http://www.microsoft.com/sqlserver/" target="_blank"&gt;SQL Server 2008&lt;/a&gt; is finally out and comes with the &lt;a class="" title="The ADO.NET Entity Framework Overview" href="http://msdn.microsoft.com/library/aa697427.aspx" target="_blank"&gt;Entity Framework&lt;/a&gt;, which means that SP1 for &lt;a title="Microsoft Visual Studio" href="http://msdn.microsoft.com/vstudio/" target="_blank"&gt;Visual Studio 2008&lt;/a&gt; and the &lt;a title=".NET Framework Developer Center" href="http://msdn.microsoft.com/netframework/" target="_blank"&gt;.NET Framework&lt;/a&gt; is almost out.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1643612" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SoftDev/default.aspx">SoftDev</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SQLServer/default.aspx">SQLServer</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/TechNet/default.aspx">TechNet</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SQLServer2008/default.aspx">SQLServer2008</category></item><item><title>The Architecture Tool Space Keeps Growing</title><link>http://msmvps.com/blogs/paulomorgado/archive/2008/05/05/the-architecture-tool-space-keeps-growing.aspx</link><pubDate>Sun, 04 May 2008 23:33:54 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1613436</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1613436</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1613436</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2008/05/05/the-architecture-tool-space-keeps-growing.aspx#comments</comments><description>&lt;p align="justify"&gt;The tool space for software architecture has been growing. There are new tools and continuous improvement in the existing ones.&lt;/p&gt;  &lt;h4&gt;Framework Design Studio&lt;/h4&gt;  &lt;p align="justify"&gt;Last month &lt;a title="Krzysztof Cwalina&amp;#39;s Blog" href="http://blogs.msdn.com/kcwalina/default.aspx" target="_blank"&gt;Krzysztof Cwalina&lt;/a&gt; from &lt;a title="Microsoft Corporation" href="http://www.microsoft.com/" target="_blank"&gt;Microsoft&lt;/a&gt; released the &lt;a title="Framework Design Studio" href="http://code.msdn.microsoft.com/fds" target="_blank"&gt;Framework Design Studio&lt;/a&gt; at &lt;a title="MSDN Code Gallery" href="http://code.msdn.microsoft.com/" target="_blank"&gt;MSDN Code Gallery&lt;/a&gt;.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p align="justify"&gt;&lt;em&gt;The tool allows comparing two versions of an assembly to identify API differences: API additions and removals. Comparing versions of APIs comes very handy during API design process. Often you want to ensure that things did not get removed accidentally (which can cause incompatibilities), and as APIs grow, you want to review the addition without having to re-review APIs that were already reviewed. The tool, called Framework Design Studio (FDS) supports these scenarios.&lt;/em&gt; - from &lt;a title="Framework Design Studio Released" href="http://blogs.msdn.com/kcwalina/archive/2008/04/04/8357773.aspx" target="_blank"&gt;Krzysztof&amp;#39;s blog post&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;h4&gt;Lattix&lt;/h4&gt;  &lt;p align="justify"&gt;&lt;a title="Lattix - Software for Architecture Management" href="http://www.lattix.com/" target="_blank"&gt;Lattix&lt;/a&gt; keeps improving its &lt;a title="The Lattix Architecture Management System" href="http://www.lattix.com/products/products.php" target="_blank"&gt;Architecture Management System&lt;/a&gt; composed of two tools:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;&lt;a title="Lattix LDM" href="http://www.lattix.com/products/LDM.php" target="_blank"&gt;Lattix LDM&lt;/a&gt; for architects&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;a title="Lattix LDV" href="http://www.lattix.com/products/LDC.php" target="_blank"&gt;Lattix LDV&lt;/a&gt; for developers and QA&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;The &lt;a title="Lattix - Software for Architecture Management" href="http://www.lattix.com/" target="_blank"&gt;Lattix&lt;/a&gt; tools can be used in the following environments:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;li&gt;&lt;a href="http://www.lattix.com/LDMforAda.php"&gt;Ada&lt;/a&gt; &lt;/li&gt;      &lt;li&gt;&lt;a href="http://www.lattix.com/LDMforCPP.php"&gt;C/C++&lt;/a&gt; &lt;/li&gt;      &lt;li&gt;&lt;a href="http://www.lattix.com/LDMforDelphiPascal.php"&gt;Delphi Pascal&lt;/a&gt; &lt;/li&gt;      &lt;li&gt;&lt;a href="http://www.lattix.com/LDMforJava.php"&gt;Java&lt;/a&gt; &lt;/li&gt;      &lt;li&gt;&lt;a href="http://www.lattix.com/LDMforNET.php"&gt;.NET&lt;/a&gt; &lt;/li&gt;      &lt;li&gt;&lt;a href="http://www.lattix.com/LDMforOracle.php"&gt;Oracle&lt;/a&gt; &lt;/li&gt;      &lt;li&gt;&lt;a href="http://www.lattix.com/LDMforSQLSvr.php"&gt;SQL Server&lt;/a&gt; &lt;/li&gt;      &lt;li&gt;&lt;a href="http://www.lattix.com/LDMforSybase.php"&gt;Sybase&lt;/a&gt; &lt;/li&gt;      &lt;li&gt;&lt;a href="http://www.lattix.com/LDI.php"&gt;LDI&lt;/a&gt; (An XML specification that allows users to load dependency information from different languages, configuration files and proprietary tools)&lt;/li&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The site has lots of resources on its &lt;a title="Getting Started" href="http://www.lattix.com/dl/gettingstarted.php" target="_blank"&gt;getting started section&lt;/a&gt; that can be used to evaluate the tools:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Download a trial version of Lattix LDM&lt;/li&gt;    &lt;li&gt;Take the tour&lt;/li&gt;    &lt;li&gt;See a live Demonstration&lt;/li&gt;    &lt;li&gt;Assess your software&lt;/li&gt;    &lt;li&gt;Try a JumpStart project&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The latest release (&lt;a title="Lattix Releases Lattix 4.1" href="http://www.lattix.com/news/articles/Lattix41.php" target="_blank"&gt;Lattix 4.1&lt;/a&gt;) was released on April 21, 2008.&lt;/p&gt;  &lt;h4&gt;NDepend&lt;/h4&gt;  &lt;p align="justify"&gt;&lt;a title="NDepend" href="http://www.ndepend.com/" target="_blank"&gt;NDepend&lt;/a&gt;, from fellow &lt;a title="Visual C# Featured MVPs" href="http://msdn.microsoft.com/vcsharp/aa336732.aspx" target="_blank"&gt;C# MVP&lt;/a&gt; &lt;a title="Patrick Smacchia [MVP C#]" href="http://codebetter.com/blogs/patricksmacchia/" target="_blank"&gt;Patrick Smacchia&lt;/a&gt;, targets only the &lt;a title="Microsoft .NET" href="http://www.microsoft.com/net/" target="_blank"&gt;.NET Framework&lt;/a&gt; (stay tuned for more) is also in continuous development. Its UI is more familiar for &lt;a title="Microsoft Visual Studio" href="http://msdn.microsoft.com/vstudio/" target="_blank"&gt;Microsoft Visual Studio&lt;/a&gt; and &lt;a title="Microsoft Office" href="http://office.microsoft.com/" target="_blank"&gt;Microsoft Office&lt;/a&gt; users than Lattix&amp;#39;s UI and a really cool feature:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;&lt;a href="http://www.ndepend.com/Features.aspx#CQL"&gt;Code Query Language (CQL)&lt;/a&gt; that allows code to be considered a database which can be queried to check assertions&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;The site has lots of videos (both on the &lt;a title="NDepend" href="http://www.ndepend.com/Default.aspx" target="_blank"&gt;Home&lt;/a&gt; page and &lt;a title="Getting Started" href="http://www.ndepend.com/GettingStarted.aspx" target="_blank"&gt;Getting Started&lt;/a&gt; page) and documentation on all the concepts used by the tool.&lt;/p&gt;  &lt;p&gt;The latest release (&lt;a title="NDepend 2.8.1" href="http://www.ndepend.com/NDependDownload.aspx" target="_blank"&gt;NDepend 2.8.1&lt;/a&gt;) was released on April 26, 2008.&lt;/p&gt;  &lt;h4&gt;ApexSQL Enforce&lt;/h4&gt;  &lt;p align="justify"&gt;&lt;a title="ApexSQL Enforce" href="http://www.apexsql.com/sql_tools_enforce.asp" target="_blank"&gt;ApexSQL Enforce&lt;/a&gt;, from &lt;a title="ApexSQL - SQL Developer Essentials" href="http://www.apexsql.com/" target="_blank"&gt;ApexSQL&lt;/a&gt;, targets &lt;a title="Microsoft SQL Server" href="http://www.microsoft.com/sqlserver/" target="_blank"&gt;SQL Server&lt;/a&gt; databases allows to:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div&gt;Ensure adherence to design standards in &amp;quot;real time&amp;quot;&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div&gt;Facilitate upgrades to new versions of SQL Server by identifying potential conversion problems before the database is ported&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div&gt;Automatically reverse or fix detected violations using generated &amp;quot;FixSQL&amp;quot; scripts&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div&gt;Enforce Naming conventions and ensure that SQL reserved words and special characters are not used&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;The site has lots of product information:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;&lt;a title="ApexSQL Enforce Datasheet" href="http://www.apexsql.com/datasheets/apexsql_enforce_datasheet.pdf" target="_blank"&gt;Datasheet&lt;/a&gt;&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;a title="ApexSQL Enforce FAQs" href="http://www.apexsql.com/faqs/faqs_Enforce.asp" target="_blank"&gt;FAQs&lt;/a&gt;&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;a title="ApexSQL Enforce Help File" href="http://www.apexsql.com/help_files.asp#enforce" target="_blank"&gt;Help File&lt;/a&gt;&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;a title="ApexSQL Enforce Training Videos" href="http://www.apexsql.com/training.asp#Enforce" target="_blank"&gt;Training Videos&lt;/a&gt;&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;The latest release (2008.02) was released on Marsh 26, 2008.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1613436" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SoftDev/default.aspx">SoftDev</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SQLServer/default.aspx">SQLServer</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Tools/default.aspx">Tools</category></item><item><title>Techdays Portugal 2008 - For A World 2.0</title><link>http://msmvps.com/blogs/paulomorgado/archive/2008/02/06/techdays-portugal-2008-for-a-world-2-0.aspx</link><pubDate>Wed, 06 Feb 2008 21:45:52 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1500150</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1500150</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1500150</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2008/02/06/techdays-portugal-2008-for-a-world-2-0.aspx#comments</comments><description>&lt;div style="overflow:auto;width:900px;"&gt; &lt;div&gt;&lt;a title="TechDays 2008 | For a World 2.0" href="http://www.techdays.pt/" target="_blank"&gt;&lt;img src="http://www.techdays.pt/images/banner_topo.jpg" alt="" /&gt;&lt;/a&gt;&lt;/div&gt; &lt;div&gt;&lt;a title="TechDays 2008 | For a World 2.0" href="http://www.techdays.pt/" target="_blank"&gt;&lt;img style="padding-right:10px;float:left;" src="http://www.techdays.pt/images/mini_mrec.jpg" alt="" /&gt;&lt;/a&gt; &lt;/div&gt; &lt;p style="padding-right:10px;padding-left:10px;padding-bottom:10px;margin:10px;padding-top:10px;" align="justify"&gt;&lt;a title="Microsoft Portugal" href="http://www.microsoft.com/portugal/" target="_blank"&gt;Microsoft Portugal&lt;/a&gt; will be hosting &lt;a title="TechDays 2008 | For a World 2.0" href="http://www.Techdays.pt/" target="_blank"&gt;Techdays 2008&lt;/a&gt; from Mars 12&lt;sup&gt;nd&lt;/sup&gt; to 14&lt;sup&gt;th&lt;/sup&gt;, right after the Portuguese launch of &lt;a href="http://msdn2.microsoft.com/en-us/vstudio/default.aspx" target="_blank"&gt;Microsoft Visual Studio 2008&lt;/a&gt;, &lt;a href="http://www.microsoft.com/sql/2008/default.mspx" target="_blank"&gt;Microsoft SQL Server 2008&lt;/a&gt; and &lt;a href="http://www.microsoft.com/windowsserver2008/default.mspx" target="_blank"&gt;Microsoft Windows Server 2008&lt;/a&gt; on Mars 11&lt;sup&gt;th&lt;/sup&gt;.&lt;/p&gt; &lt;p style="padding-right:10px;padding-left:10px;padding-bottom:10px;margin:10px;padding-top:10px;" align="justify"&gt;This is the biggest and greatest tech event in Portugal and there will be lots of national and international speakers and contests.&lt;/p&gt; &lt;p style="padding-right:10px;padding-left:10px;padding-bottom:10px;margin:10px;padding-top:10px;" align="justify"&gt;I&amp;#39;ll be there. Come visit us.&lt;/p&gt;&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1500150" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Community/default.aspx">Community</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Events/default.aspx">Events</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/MVP/default.aspx">MVP</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SQLServer/default.aspx">SQLServer</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/VisualStudio/default.aspx">VisualStudio</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Windows/default.aspx">Windows</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Techdays/default.aspx">Techdays</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/TechdaysPT08/default.aspx">TechdaysPT08</category></item><item><title>Custom Generators For SQL Data Generator 1.0 Beta</title><link>http://msmvps.com/blogs/paulomorgado/archive/2008/01/27/custom-generators-for-sql-data-generator-1-0-beta.aspx</link><pubDate>Sun, 27 Jan 2008 23:11:06 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1483154</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1483154</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1483154</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2008/01/27/custom-generators-for-sql-data-generator-1-0-beta.aspx#comments</comments><description>&lt;p&gt;&lt;a title="SQL Data Generator" href="http://www.red-gate.com/Products/SQL_Data_Generator/" target="_blank"&gt;SQL Data Generator&lt;/a&gt; will be a great tool when &lt;a title="redgate - ingeniously simple tools" href="http://www.red-gate.com/" target="_blank"&gt;redgate&lt;/a&gt; releases it.&lt;/p&gt; &lt;p&gt;&lt;a title="David Connell - Software Developer - Red Gate Software" href="http://blogs.red-gate.com/david_connell/default.aspx" target="_blank"&gt;David Connell&lt;/a&gt; has a &lt;a title="How to write a Generator for SQL Data Generator 1.0 Beta" href="http://blogs.red-gate.com/david_connell/archive/2008/01/15/how-to-write-a-generator-for-sql-data-generator-1-0-beta.aspx" target="_blank"&gt;detailed post on how to build your own generator where he explains the concepts and ideas behind developing generators for SQL Data Generator 1.0 Beta&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.simple-talk.com/author/andrew-clarke/"&gt;Andrew Clarke&lt;/a&gt; also has a nice example with it&amp;#39;s &lt;a title="The Waffle Generator" href="http://www.simple-talk.com/dotnet/.net-tools/the-waffle-generator/" target="_blank"&gt;Waffle Generator&lt;/a&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1483154" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SQLServer/default.aspx">SQLServer</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Tools/default.aspx">Tools</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Testing/default.aspx">Testing</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/redgate/default.aspx">redgate</category></item><item><title>Visual Studio 2008 and .NET Framework 3.5 shipped!</title><link>http://msmvps.com/blogs/paulomorgado/archive/2007/11/21/visual-studio-2008-and-net-framework-3-5-shipped.aspx</link><pubDate>Wed, 21 Nov 2007 00:21:36 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1342974</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1342974</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1342974</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2007/11/21/visual-studio-2008-and-net-framework-3-5-shipped.aspx#comments</comments><description>&lt;p&gt;&lt;a title="Visual Studio" href="http://msdn2.microsoft.com/en-us/vstudio/products/default.aspx" target="_blank"&gt;Visual Studio 2008&lt;/a&gt; and &lt;a title=".NET Framework" href="http://msdn2.microsoft.com/netframework/" target="_blank"&gt;.NET Framework 3.5&lt;/a&gt; has finally shipped.&lt;/p&gt; &lt;p&gt;&lt;a title="MSDN" href="http://msdn2.microsoft.com/" target="_blank"&gt;MSDN&lt;/a&gt; subscribers can &lt;a title="MSDN Subscribers: Get Visual Studio 2008 Now" href="http://msdn2.microsoft.com/subscriptions/bb608344.aspx" target="_blank"&gt;download the final version&lt;/a&gt; of &lt;a title="Visual Studio" href="http://msdn2.microsoft.com/en-us/vstudio/products/default.aspx" target="_blank"&gt;Visual Studio 2008&lt;/a&gt; from &lt;a title="MSDN Subscription Downloads" href="http://msdn2.microsoft.com/en-us/subscriptions/bb608344" target="_blank"&gt;MSDN Subscription Downloads&lt;/a&gt;, but anyone can get a &lt;a title="Download Trial Editions of Visual Studio 2008" href="http://msdn2.microsoft.com/en-us/vstudio/products/aa700831.aspx" target="_blank"&gt;trial version&lt;/a&gt; or an &lt;a title="Download Visual Studio 2008 Express Editions" href="http://www.microsoft.com/express" target="_blank"&gt;Express Edition&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;The &lt;a title=".NET Framework" href="http://msdn2.microsoft.com/netframework/" target="_blank"&gt;.NET Framework 3.5&lt;/a&gt; contains many new features building incrementally upon .NET Framework 2.0 and 3.0, and includes .NET Framework 2.0 service pack 1 and .NET Framework 3.0 service pack 1. and is also &lt;a title="Download the .NET Framework 3.5" href="http://go.microsoft.com/?linkid=7755937" target="_blank"&gt;available for download&lt;/a&gt;. &lt;/p&gt; &lt;p&gt;You can read all about it from various teams and team member&amp;#39;s blogs:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a title="Somasegar&amp;#39;s WebLog" href="http://blogs.msdn.com/somasegar/default.aspx" target="_blank"&gt;Soma S. Somasegar&lt;/a&gt;&lt;/li&gt; &lt;ul&gt; &lt;li&gt;&lt;a title="Visual Studio 2008 and .NET Framework 3.5 shipped!" href="http://blogs.msdn.com/somasegar/archive/2007/11/19/visual-studio-2008-and-net-framework-3-5-shipped.aspx" target="_blank"&gt;Visual Studio 2008 and .NET Framework 3.5 shipped!&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;&lt;a title="ScottGu&amp;#39;s Blog" href="http://weblogs.asp.net/scottgu/" target="_blank"&gt;Scott Guthrie&lt;/a&gt;&lt;/li&gt; &lt;ul&gt; &lt;li&gt;&lt;a title="Visual Studio 2008 and .NET 3.5 Released" href="http://weblogs.asp.net/scottgu/archive/2007/11/19/visual-studio-2008-and-net-3-5-released.aspx" target="_blank"&gt;Visual Studio 2008 and .NET 3.5 Released&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;&lt;a title="BCLTeam&amp;#39;s WebLog" href="http://blogs.msdn.com/bclteam/" target="_blank"&gt;BCL Team&lt;/a&gt;&lt;/li&gt; &lt;ul&gt; &lt;li&gt;&lt;a title=".NET Framework 3.5 Now Available! [Justin Van Patten]" href="http://blogs.msdn.com/bclteam/archive/2007/11/19/net-framework-3-5-now-available-justin-van-patten.aspx" target="_blank"&gt;.NET Framework 3.5 Now Available! [Justin Van Patten]&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;&lt;a title="Jack Gudenkauf (JackG) WebLog" href="http://blogs.msdn.com/jackg/" target="_blank"&gt;Jack Gudenkauf&lt;/a&gt;&lt;/li&gt; &lt;ul&gt; &lt;li&gt;&lt;a title="What&amp;rsquo;s new in the .Net Framework 3.5 (Orcas)" href="http://blogs.msdn.com/jackg/archive/2007/09/13/what-s-new-in-the-net-framework-3-5-orcas.aspx" target="_blank"&gt;What’s new in the .Net Framework 3.5 (Orcas)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;&lt;a title="Charlie Calvert&amp;#39;s Community Blog" href="http://blogs.msdn.com/charlie/" target="_blank"&gt;Charlie Calvert&lt;/a&gt;&lt;/li&gt; &lt;ul&gt; &lt;li&gt;&lt;a title="Visual Studio 2008 Available for Download" href="http://blogs.msdn.com/charlie/archive/2007/11/19/visual-studio-2008-available-for-download.aspx" target="_blank"&gt;Visual Studio 2008 Available for Download&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a title="Some Articles on Visual Studio 2008" href="http://blogs.msdn.com/charlie/archive/2007/11/20/some-articles-on-visual-studio-2008.aspx" target="_blank"&gt;Some Articles on Visual Studio 2008&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1342974" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/WinForms/default.aspx">WinForms</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SoftDev/default.aspx">SoftDev</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SQLServer/default.aspx">SQLServer</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/XML/default.aspx">XML</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/VisualStudio/default.aspx">VisualStudio</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/WCF/default.aspx">WCF</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/WPF/default.aspx">WPF</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/WF/default.aspx">WF</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/WindowsClient/default.aspx">WindowsClient</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/LINQ/default.aspx">LINQ</category></item><item><title>SQL Prompt 3 is out!</title><link>http://msmvps.com/blogs/paulomorgado/archive/2007/01/22/sql-prompt-3-is-out.aspx</link><pubDate>Mon, 22 Jan 2007 22:24:09 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:511600</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=511600</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=511600</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2007/01/22/sql-prompt-3-is-out.aspx#comments</comments><description>&lt;p&gt;&lt;a title="red-gate software" href="http://www.red-gate.com/" target="_blank"&gt;red-gate&lt;/a&gt; just released version 3 of &lt;a title="SQL Prompt - Intelligent code completion for SQL Server" href="http://www.red-gate.com/products/SQL_Prompt/index.htm" target="_blank"&gt;SQL Prompt&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=511600" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SoftDev/default.aspx">SoftDev</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SQLServer/default.aspx">SQLServer</category></item></channel></rss>