<feed version="0.3" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns="http://purl.org/atom/ns#" xml:lang="en-US"><title>Peter W. DeBetta </title><link rel="alternate" type="text/html" href="http://www.sqljunkies.com/WebLog/peter_debetta/default.aspx" /><tagline type="text/html" /><id>http://www.sqljunkies.com/WebLog/peter_debetta/default.aspx</id><author><url>http://www.sqljunkies.com/WebLog/peter_debetta/default.aspx</url></author><generator url="http://communityserver.org" version="1.0.1.50214">Community Server</generator><modified>2007-02-12T16:43:46Z</modified><entry><title>OT: What will Bill Gates do after he leaves Microsoft?</title><link rel="alternate" type="text/html" href="http://www.sqljunkies.com/WebLog/peter_debetta/archive/2008/01/07/102549.aspx" /><id>d2584c15-f6ef-46f7-a2d4-24fc0e143e76:102549</id><created>2008-01-07T17:12:05Z</created><content type="text/html" mode="escaped">&lt;P&gt;I laughed, I cried...&lt;/P&gt;
&lt;P&gt;&lt;A href="http://video.msn.com/video.aspx?mkt=en-US&amp;amp;brand=&amp;amp;vid=27db94c9-4892-4059-8688-f4afd3c4b64a"&gt;http://video.msn.com/video.aspx?mkt=en-US&amp;amp;brand=&amp;amp;vid=27db94c9-4892-4059-8688-f4afd3c4b64a&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Bill Gates presents a farewell video at the keynote of the Consumer Electronics Show.&lt;/P&gt;
&lt;br&gt;&lt;hr&gt;&lt;br&gt;Cross-posted from SQLBlog! - &lt;a href="http://www.sqlblog.com"&gt;http://www.sqlblog.com&lt;/a&gt;&lt;br&gt;&lt;hr&gt;&lt;br&gt;&lt;img src="http://www.sqljunkies.com/WebLog/aggbug.aspx?PostID=102549" width="1" height="1"&gt;</content><slash:comments>0</slash:comments></entry><entry><title>TechEd2008 Abstract Deadline Extension</title><link rel="alternate" type="text/html" href="http://www.sqljunkies.com/WebLog/peter_debetta/archive/2008/01/03/102501.aspx" /><id>d2584c15-f6ef-46f7-a2d4-24fc0e143e76:102501</id><created>2008-01-03T11:28:31Z</created><content type="text/html" mode="escaped">&lt;p&gt;Just over a month ago, Simon Guest had &lt;a title="Your Opportunity to Speak at TechEd 2008!" href="http://simonguest.com/blogs/smguest/archive/2007/11/29/Speak-at-the-TechEd-US-Developers-Conference_2100_.aspx"&gt;posted a blog entry&lt;/a&gt; about the call for sessions for TechEd 2008. The original deadline was 31 December 2007, but I've just gotten confirmation that this deadline has been extended to 31 January 2008, so if you were thinking of submitting any abstracts, you still have some time to do it.&lt;/p&gt;  &lt;p&gt;To get started, you need to first go to &lt;a title="TechEd 2008 Call for Content" href="https://2008.msteched.com/cft/"&gt;https://2008.msteched.com/cft/&lt;/a&gt;. Use &lt;strong&gt;TEUS-Speakers&lt;/strong&gt; as the access code, create a profile, and begin submitting topics.&lt;/p&gt;
&lt;br&gt;&lt;hr&gt;&lt;br&gt;Cross-posted from SQLBlog! - &lt;a href="http://www.sqlblog.com"&gt;http://www.sqlblog.com&lt;/a&gt;&lt;br&gt;&lt;hr&gt;&lt;br&gt;&lt;img src="http://www.sqljunkies.com/WebLog/aggbug.aspx?PostID=102501" width="1" height="1"&gt;</content><slash:comments>0</slash:comments></entry><entry><title>2008: Converting XML to HIERARCHYID</title><link rel="alternate" type="text/html" href="http://www.sqljunkies.com/WebLog/peter_debetta/archive/2007/12/09/99119.aspx" /><id>d2584c15-f6ef-46f7-a2d4-24fc0e143e76:99119</id><created>2007-12-09T13:40:02Z</created><content type="text/html" mode="escaped">&lt;p&gt;While working on a new book, I have been experimenting with the new HIERARCHYID data type. And since I've seen comparisons drawn between using XML versus using HIERARCHYID to manage a hierarchy of data, I decided that it would likely be very useful if I could convert an XML structure into an equivalent relational structure using HIERARCHYID. Here is what I came up with:
&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;DECLARE&lt;/span&gt; @x &lt;span&gt;XML&lt;/span&gt;
			&lt;span&gt;=&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;'&amp;lt;A id="1"&amp;gt;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;    &amp;lt;B id="2"&amp;gt;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;        &amp;lt;C id="3"/&amp;gt;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;        &amp;lt;D id="4"/&amp;gt;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;    &amp;lt;/B&amp;gt;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;    &amp;lt;E id="5"/&amp;gt;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;    &amp;lt;F id="6"/&amp;gt;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;&amp;lt;/A&amp;gt;'&lt;/span&gt;&lt;span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;WITH&lt;/span&gt; Folders &lt;span&gt;AS
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;(
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;SELECT&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;    t&lt;span&gt;.&lt;/span&gt;c&lt;span&gt;.&lt;/span&gt;value&lt;span&gt;(&lt;/span&gt;&lt;span&gt;'@id'&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;
			&lt;span&gt;'int'&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;
			&lt;span&gt;AS&lt;/span&gt; ID
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;
			&lt;span&gt;,&lt;/span&gt;
			&lt;span&gt;NULLIF&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;t&lt;span&gt;.&lt;/span&gt;c&lt;span&gt;.&lt;/span&gt;value&lt;span&gt;(&lt;/span&gt;&lt;span&gt;'../@id'&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;
			&lt;span&gt;'nvarchar(50)'&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;
			&lt;span&gt;''&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;
			&lt;span&gt;AS&lt;/span&gt; ParentID
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;
			&lt;span&gt;,&lt;/span&gt; t&lt;span&gt;.&lt;/span&gt;c&lt;span&gt;.&lt;/span&gt;value&lt;span&gt;(&lt;/span&gt;&lt;span&gt;'local-name(.)'&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;
			&lt;span&gt;'nvarchar(50)'&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;
			&lt;span&gt;AS&lt;/span&gt;
			&lt;span&gt;Description
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;
			&lt;span&gt;,&lt;/span&gt; t&lt;span&gt;.&lt;/span&gt;c&lt;span&gt;.&lt;/span&gt;value&lt;span&gt;(&lt;/span&gt;&lt;span&gt;'for $s in . return count(../*[. &amp;lt;&amp;lt; $s]) + 1'&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;
			&lt;span&gt;'int'&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;
			&lt;span&gt;AS&lt;/span&gt; RowNum
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;FROM&lt;/span&gt; @x&lt;span&gt;.&lt;/span&gt;nodes&lt;span&gt;(&lt;/span&gt;&lt;span&gt;'//*'&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;
			&lt;span&gt;AS&lt;/span&gt; t&lt;span&gt;(&lt;/span&gt;c&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt; FolderTree &lt;span&gt;AS
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;(
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;
			&lt;span&gt;SELECT&lt;/span&gt; ID&lt;span&gt;,&lt;/span&gt; ParentID&lt;span&gt;,&lt;/span&gt;
			&lt;span&gt;Description&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; RowNum&lt;span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;        HIERARCHYID&lt;span&gt;::&lt;/span&gt;GetRoot&lt;span&gt;()&lt;/span&gt;
			&lt;span&gt;AS&lt;/span&gt; FolderNode
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;
			&lt;span&gt;FROM&lt;/span&gt; Folders
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;
			&lt;span&gt;WHERE&lt;/span&gt; ParentID &lt;span&gt;IS&lt;/span&gt;
			&lt;span&gt;NULL
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;    
 &lt;/p&gt;&lt;p&gt;&lt;span&gt;
			&lt;span&gt;UNION ALL
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;    
 &lt;/p&gt;&lt;p&gt;&lt;span&gt;
			&lt;span&gt;SELECT&lt;/span&gt; F&lt;span&gt;.&lt;/span&gt;ID&lt;span&gt;,&lt;/span&gt; F&lt;span&gt;.&lt;/span&gt;ParentID&lt;span&gt;,&lt;/span&gt; F&lt;span&gt;.&lt;/span&gt;Description&lt;span&gt;,&lt;/span&gt; F&lt;span&gt;.&lt;/span&gt;RowNum&lt;span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;
			&lt;span&gt;CAST&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;FT&lt;span&gt;.&lt;/span&gt;FolderNode&lt;span&gt;.&lt;/span&gt;ToString&lt;span&gt;()&lt;/span&gt;
			&lt;span&gt;+&lt;/span&gt;
			&lt;span&gt;CAST&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;F&lt;span&gt;.&lt;/span&gt;RowNum &lt;span&gt;AS&lt;/span&gt;
			&lt;span&gt;varchar&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;50&lt;span&gt;))&lt;/span&gt;
			&lt;span&gt;+&lt;/span&gt;
			&lt;span&gt;'/'&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;
			&lt;span&gt;AS&lt;/span&gt; HIERARCHYID&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;
			&lt;span&gt;FROM&lt;/span&gt; Folders &lt;span&gt;AS&lt;/span&gt; F
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;
			&lt;span&gt;INNER&lt;/span&gt;
			&lt;span&gt;JOIN&lt;/span&gt; FolderTree &lt;span&gt;AS&lt;/span&gt; FT &lt;span&gt;ON&lt;/span&gt; F&lt;span&gt;.&lt;/span&gt;ParentID &lt;span&gt;=&lt;/span&gt; FT&lt;span&gt;.&lt;/span&gt;ID
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;SELECT&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;    ID&lt;span&gt;,&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;    ParentID&lt;span&gt;,&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;
			&lt;span&gt;Description&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;    FolderNode&lt;span&gt;,&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;    FolderNode&lt;span&gt;.&lt;/span&gt;ToString&lt;span&gt;()&lt;/span&gt; AS Path&lt;span&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;FROM&lt;/span&gt; FolderTree
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;ORDER&lt;/span&gt;
			&lt;span&gt;BY&lt;/span&gt; FolderNode&lt;span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;Which results in:
&lt;/p&gt;&lt;div&gt;&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;ID&lt;/strong&gt; &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;ParentID&lt;/strong&gt; &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt; &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;FolderNode&lt;/strong&gt; &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;Path&lt;/strong&gt; &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;1 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;NULL &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;A &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;0x &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;/ &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;2 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;1 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;B &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;0x58 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;/1/ &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;3 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;2 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;C &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;0x5AC0&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;/1/1/ &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;4 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;2 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;D &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;0x5B40 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;/1/2/ &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;5 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;1 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;E &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;0x68 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;/2/ &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;6 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;1 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;F &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;0x78 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;/3/ &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;The basis of this is the same as if converting an existing adjacency model to use HIERARCHYID – use a combination of a recursive CTE and row numbers partitioned by parent to generate the new path of the node and then cast that path to the HIERARCHYID data type. The parent path is retrieved using the &lt;span&gt;ToString&lt;/span&gt; method of the parent node, and this is concatenated with the &lt;em&gt;RowNum&lt;/em&gt; value and a forward slash (/) to result in the path for the current node. And finally, the newly generated path is then cast to HIERARCHYID, which uses its static &lt;span&gt;Parse&lt;/span&gt; method behind the scenes to create a new instance of HIERARCHYID. This table shows the additional detail and should reveal how the new path is created.
&lt;/p&gt;&lt;div&gt;&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;ID&lt;/strong&gt; &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;ParentID&lt;/strong&gt; &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt; &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;FolderNode&lt;/strong&gt; &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;Path&lt;/strong&gt; &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;Parent Path&lt;/strong&gt; &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;RowNum&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;1 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;NULL &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;A &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;0x &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;/ &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;N/A&lt;/em&gt;&lt;/strong&gt; &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;1&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;2 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;1 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;B &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;0x58 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;/1/ &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;/&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;1&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;3 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;2 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;C &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;0x5AC0&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;/1/1/ &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;/1/&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;1&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;4 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;2 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;D &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;0x5B40 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;/1/2/ &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;/1/&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;2&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;5 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;1 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;E &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;0x68 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;/2/ &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;/&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;2&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;6 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;1 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;F &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;0x78 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;/3/ &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;/&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;3&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;On the XML side of things, I generated a partitioned row number by using the nodes method to return all nodes in the XML structure, as shown here:&lt;span&gt;&lt;span&gt; FROM&lt;/span&gt; @x&lt;span&gt;.&lt;/span&gt;nodes&lt;span&gt;(&lt;/span&gt;&lt;span&gt;'//*'&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;
			&lt;span&gt;AS&lt;/span&gt; t&lt;span&gt;(&lt;/span&gt;c&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;.  The double forward slash (//) translates to "relative path" and the asterisk means any node, so this returns all nodes at all levels. Then, to return the row number, I use one of my favorite XQuery examples:
&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span&gt;t&lt;span&gt;.&lt;/span&gt;c&lt;span&gt;.&lt;/span&gt;value&lt;span&gt;(&lt;/span&gt;&lt;span&gt;'for $s in . return count(../*[. &amp;lt;&amp;lt; $s]) + 1'&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;
			&lt;span&gt;'int'&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;
			&lt;span&gt;AS&lt;/span&gt; RowNum
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;This translates to "count the number of immediate child nodes of my parent node that are positioned before me." Now that I have all the nodes, and a partitioned row number for these nodes, I can construct the new path of the node.
&lt;/p&gt;&lt;p&gt;I will post more as I continue writing about and exploring SQL Server 2008.
&lt;/p&gt;&lt;p&gt;Enjoy!&lt;/p&gt;
&lt;br&gt;&lt;hr&gt;&lt;br&gt;Cross-posted from SQLBlog! - &lt;a href="http://www.sqlblog.com"&gt;http://www.sqlblog.com&lt;/a&gt;&lt;br&gt;&lt;hr&gt;&lt;br&gt;&lt;img src="http://www.sqljunkies.com/WebLog/aggbug.aspx?PostID=99119" width="1" height="1"&gt;</content><slash:comments>2</slash:comments></entry><entry><title>Row Constructor or Table-Valued Parameter</title><link rel="alternate" type="text/html" href="http://www.sqljunkies.com/WebLog/peter_debetta/archive/2007/12/06/98170.aspx" /><id>d2584c15-f6ef-46f7-a2d4-24fc0e143e76:98170</id><created>2007-12-06T18:15:10Z</created><content type="text/html" mode="escaped">&lt;p&gt;Denis posted a follow-up to the posts by both Louis and me. However, I have to say that there is a better way to pass a bunch of data to a procedure. The following code is amended to include the table-valued parameter feature. 
&lt;/p&gt;&lt;p&gt;&lt;span&gt;--The Movie Table
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;CREATE&lt;/span&gt;
			&lt;span&gt;TABLE&lt;/span&gt; Movie
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;    MovieID &lt;span&gt;INT&lt;/span&gt;
			&lt;span&gt;IDENTITY&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;1&lt;span&gt;,&lt;/span&gt; 1&lt;span&gt;),&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;    MovieRatingId &lt;span&gt;INT&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;    Title &lt;span&gt;VARCHAR&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;200&lt;span&gt;)&lt;/span&gt;
			&lt;span&gt;NOT&lt;/span&gt;
			&lt;span&gt;NULL&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;);&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;GO
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;INSERT&lt;/span&gt;
			&lt;span&gt;INTO&lt;/span&gt; Movie &lt;span&gt;(&lt;/span&gt;MovieRatingId&lt;span&gt;,&lt;/span&gt; Title&lt;span&gt;)&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;VALUES&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;
			&lt;span&gt;(&lt;/span&gt;3&lt;span&gt;,&lt;/span&gt;
			&lt;span&gt;'SQL the Movie'&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;
			&lt;span&gt;(&lt;/span&gt;4&lt;span&gt;,&lt;/span&gt;
			&lt;span&gt;'SQL Massacre'&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;
			&lt;span&gt;(&lt;/span&gt;1&lt;span&gt;,&lt;/span&gt;
			&lt;span&gt;'SQL for Everyone'&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;
			&lt;span&gt;(&lt;/span&gt;4&lt;span&gt;,&lt;/span&gt;
			&lt;span&gt;'SQL Massacre 2 - The Oracle Returns'&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span&gt;--Create a new table type in the database
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;CREATE&lt;/span&gt;
			&lt;span&gt;TYPE&lt;/span&gt; MovieRating &lt;span&gt;AS
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;TABLE&lt;/span&gt;
			&lt;span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;       MovieRatingId        &lt;span&gt;int&lt;/span&gt;
			&lt;span&gt;NOT&lt;/span&gt;
			&lt;span&gt;NULL,
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;       Code                 &lt;span&gt;varchar&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;20&lt;span&gt;)&lt;/span&gt;
			&lt;span&gt;NOT&lt;/span&gt;
			&lt;span&gt;NULL,
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;
			&lt;span&gt;Description&lt;/span&gt;
			&lt;span&gt;varchar&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;200&lt;span&gt;)&lt;/span&gt;
			&lt;span&gt;NULL,
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;       AllowYouthRentalFlag &lt;span&gt;bit&lt;/span&gt;
			&lt;span&gt;NOT&lt;/span&gt;
			&lt;span&gt;NULL
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;GO
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span&gt;--Create a new proc that accepts a table as a parameter
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;CREATE&lt;/span&gt;
			&lt;span&gt;PROC&lt;/span&gt; prMoviesByRating 
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;(
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;    @MovieRatings MovieRating &lt;span&gt;READONLY
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;AS
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;BEGIN
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;--and join to that table-valued parameter&lt;/span&gt;&lt;span&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;    &lt;span&gt;SELECT&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;        M&lt;span&gt;.&lt;/span&gt;Title&lt;span&gt;,&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;        MR&lt;span&gt;.&lt;/span&gt;Code &lt;span&gt;AS&lt;/span&gt; RatingCode&lt;span&gt;,&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;        MR&lt;span&gt;.&lt;/span&gt;Description &lt;span&gt;AS&lt;/span&gt; RatingDescription 
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;    &lt;span&gt;FROM&lt;/span&gt; Movie &lt;span&gt;AS&lt;/span&gt; M 
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;        &lt;span&gt;INNER&lt;/span&gt;
			&lt;span&gt;JOIN&lt;/span&gt; @MovieRatings &lt;span&gt;AS&lt;/span&gt; MR 
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;            &lt;span&gt;ON&lt;/span&gt; M&lt;span&gt;.&lt;/span&gt;MovieRatingId &lt;span&gt;=&lt;/span&gt; MR&lt;span&gt;.&lt;/span&gt;MovieRatingId&lt;span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;END
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;GO
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span&gt;--Declare a variable using our table type 
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;DECLARE&lt;/span&gt; @MovieRatings MovieRating 
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;--and insert data into it (again, using a row constructor)
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;INSERT&lt;/span&gt;
			&lt;span&gt;INTO&lt;/span&gt; @MovieRatings
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;VALUES&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;
			&lt;span&gt;(&lt;/span&gt;0&lt;span&gt;,&lt;/span&gt;
			&lt;span&gt;'UR'&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;'Unrated'&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;1&lt;span&gt;),&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;
			&lt;span&gt;(&lt;/span&gt;1&lt;span&gt;,&lt;/span&gt;
			&lt;span&gt;'G'&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;'General Audiences'&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;1&lt;span&gt;),&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;
			&lt;span&gt;(&lt;/span&gt;2&lt;span&gt;,&lt;/span&gt;
			&lt;span&gt;'PG'&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;'Parental Guidance'&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;1&lt;span&gt;),&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;
			&lt;span&gt;(&lt;/span&gt;3&lt;span&gt;,&lt;/span&gt;
			&lt;span&gt;'PG-13'&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;'Parental Guidance for Children Under 13'&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;1&lt;span&gt;),&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;
			&lt;span&gt;(&lt;/span&gt;4&lt;span&gt;,&lt;/span&gt;
			&lt;span&gt;'R'&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;'Restricted, No Children Under 17 without Parent'&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;0&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;--and pass the table as parameter to the proc...&lt;/span&gt;&lt;span&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;EXEC&lt;/span&gt; prMoviesByRating @MovieRatings&lt;span&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;So when I want to pass the data in, no dynamic SQL is necessary, since I can instead simply pass the table itself (with all of its data)…
&lt;/p&gt;
&lt;br&gt;&lt;hr&gt;&lt;br&gt;Cross-posted from SQLBlog! - &lt;a href="http://www.sqlblog.com"&gt;http://www.sqlblog.com&lt;/a&gt;&lt;br&gt;&lt;hr&gt;&lt;br&gt;&lt;img src="http://www.sqljunkies.com/WebLog/aggbug.aspx?PostID=98170" width="1" height="1"&gt;</content><slash:comments>0</slash:comments></entry><entry><title>2008: More Row Constructor Fun</title><link rel="alternate" type="text/html" href="http://www.sqljunkies.com/WebLog/peter_debetta/archive/2007/12/05/97835.aspx" /><id>d2584c15-f6ef-46f7-a2d4-24fc0e143e76:97835</id><created>2007-12-05T22:33:07Z</created><content type="text/html" mode="escaped">&lt;p&gt;My esteemed colleague Louis Davidson &lt;a href="http://sqljunkies.com/blogs/louis_davidson/archive/2007/12/05/2008-initializing-table-data-with-row-constructors.aspx"&gt;just wrote&lt;/a&gt; about a new feature in SQL Server 2008 known as &lt;strong&gt;row constructors&lt;/strong&gt;. I thought I'd follow up with some more fun usage of this cool feature. In addition to being used with an INSERT statement, you can also use a row constructor in a common table expression (CTE). This example uses the row constructor to insert data into one table (@Movie) and then again to join a table to another sets of constructed row:&lt;/p&gt;  &lt;p&gt;DECLARE @Movie TABLE    &lt;br /&gt;(     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; MovieID INT IDENTITY(1, 1),     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; MovieRatingId INT,     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Title VARCHAR(200) NOT NULL     &lt;br /&gt;); &lt;/p&gt;  &lt;p&gt;INSERT INTO @Movie (MovieRatingId, Title)    &lt;br /&gt;VALUES     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; (3, 'SQL the Movie'),     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; (4, 'SQL Massacre'),     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; (1, 'SQL for Everyone'),     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; (4, 'SQL Massacre 2 - The Oracle Returns');     &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;WITH MovieRatings (MovieRatingId, Code, Description, AllowYouthRentalFlag)    &lt;br /&gt;AS     &lt;br /&gt;(&amp;#160;&amp;#160;&amp;#160; SELECT *     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; FROM (VALUES     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (0, 'UR','Unrated',1),     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (1, 'G','General Audiences',1),     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (2, 'PG','Parental Guidance',1),     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (3, 'PG-13','Parental Guidance for Children Under 13',1),     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (4, 'R','Restricted, No Children Under 17 without Parent',0))     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; AS MR(MovieRatingId, Code, Description, AllowYouthRentalFlag)     &lt;br /&gt;)     &lt;br /&gt;SELECT     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; M.Title,     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; MR.Code AS RatingCode,     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; MR.Description AS RatingDescription     &lt;br /&gt;FROM @Movie AS M     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; INNER JOIN MovieRatings AS MR     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ON M.MovieRatingId = MR.MovieRatingId;&lt;/p&gt;  &lt;p&gt;Notice that when used in a CTE, the syntax is slightly different&lt;/p&gt;  &lt;p&gt;SELECT &lt;em&gt;column_list&lt;/em&gt;     &lt;br /&gt;FROM     &lt;br /&gt;(VALUES     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; (&lt;em&gt;column_1_value&lt;/em&gt; [, &lt;em&gt;column_2_value&lt;/em&gt; [, ...]])    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; (&lt;em&gt;column_1_value&lt;/em&gt; [, &lt;em&gt;column_2_value&lt;/em&gt; [, ...]])    &lt;br /&gt;) AS &lt;em&gt;TableAlias &lt;/em&gt;(&lt;em&gt;column_1_name&lt;/em&gt; [, &lt;em&gt;column_2_name &lt;/em&gt;[, ...]])&lt;/p&gt;  &lt;p&gt;When used in a CTE, you must supply a table alias, as well as column names for all columns supplied by the row constructor.&lt;/p&gt;  &lt;p&gt;Enjoy! &lt;/p&gt;
&lt;br&gt;&lt;hr&gt;&lt;br&gt;Cross-posted from SQLBlog! - &lt;a href="http://www.sqlblog.com"&gt;http://www.sqlblog.com&lt;/a&gt;&lt;br&gt;&lt;hr&gt;&lt;br&gt;&lt;img src="http://www.sqljunkies.com/WebLog/aggbug.aspx?PostID=97835" width="1" height="1"&gt;</content><slash:comments>0</slash:comments></entry><entry><title>Non-Technical: SQLblog has moved!</title><link rel="alternate" type="text/html" href="http://www.sqljunkies.com/WebLog/peter_debetta/archive/2007/11/17/89228.aspx" /><id>d2584c15-f6ef-46f7-a2d4-24fc0e143e76:89228</id><created>2007-11-17T10:50:02Z</created><content type="text/html" mode="escaped">If you are reading this post then you are being served up by &lt;A class=""&gt;SQLblog&lt;/A&gt; from its new home at &lt;A class=""&gt;MaximumASP&lt;/A&gt; hosting provider. We are very excited to be working with the people at MaximumASP in order to better serve the community and help with the continuing growth of &lt;A class=""&gt;SQLblog&lt;/A&gt;. 
&lt;br&gt;&lt;hr&gt;&lt;br&gt;Cross-posted from SQLBlog! - &lt;a href="http://www.sqlblog.com"&gt;http://www.sqlblog.com&lt;/a&gt;&lt;br&gt;&lt;hr&gt;&lt;br&gt;&lt;img src="http://www.sqljunkies.com/WebLog/aggbug.aspx?PostID=89228" width="1" height="1"&gt;</content><slash:comments>0</slash:comments></entry><entry><title>SQL Server Connection Level Parameters</title><link rel="alternate" type="text/html" href="http://www.sqljunkies.com/WebLog/peter_debetta/archive/2007/07/19/49338.aspx" /><id>d2584c15-f6ef-46f7-a2d4-24fc0e143e76:49338</id><created>2007-07-19T12:17:23Z</created><content type="text/html" mode="escaped">&lt;p&gt;Have you ever needed to pass in a value that would be used throughout the lifetime of a connection - perhaps a connection session level value that would be used by multiple procedures, views, functions, etc...?&lt;/p&gt; &lt;p&gt;Well, a colleague of mine, Jay Frysinger, had a great idea -&amp;nbsp;use the connection string itself to pass additional parameters. You can use both "Application Name" and "Workstation ID" to pass in 2 additional 128 character length strings. You can then use the APP_NAME() system function to retrieve the value of the "Application Name" or the HOST_NAME() system function to retrieve the value of "Workstation ID".&lt;/p&gt; &lt;p&gt;In this example, a GUID is created in the data client, then using ToString() of the GUID, it is added to the connection string. Then,&amp;nbsp; HOST_NAME() is used to extract that value. Since I wanted a UniqueIdentifier in SQL, I&amp;nbsp;used CAST to convert the string GUID to a UniqueIdentifier. Finally, the UniqueIdentifier is returned and displayed in the console.&lt;/p&gt; &lt;p&gt;&lt;code&gt;&lt;span&gt;using&amp;nbsp;&lt;/span&gt;&lt;span&gt;System&lt;/span&gt;&lt;span&gt;; &lt;br&gt;&lt;/span&gt;&lt;span&gt;using&amp;nbsp;&lt;/span&gt;&lt;span&gt;System.Data&lt;/span&gt;&lt;span&gt;; &lt;br&gt;&lt;/span&gt;&lt;span&gt;using&amp;nbsp;&lt;/span&gt;&lt;span&gt;System.Data.SqlClient&lt;/span&gt;&lt;span&gt;; &lt;br&gt;&lt;br&gt;&lt;/span&gt;&lt;span&gt;namespace&amp;nbsp;&lt;/span&gt;&lt;span&gt;ConnectionStringTest &lt;br&gt;{ &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;class&amp;nbsp;&lt;/span&gt;&lt;span&gt;Program &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;static&amp;nbsp;void&amp;nbsp;&lt;/span&gt;&lt;span&gt;Main&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;[]&amp;nbsp;args&lt;/span&gt;&lt;span&gt;) &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;{ &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Guid&amp;nbsp;guid&amp;nbsp;&lt;/span&gt;&lt;span&gt;=&amp;nbsp;new&amp;nbsp;&lt;/span&gt;&lt;span&gt;Guid&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;"BCAEF7EA-7BD3-4CC8-8288-9B2C8F6BCF28"&lt;/span&gt;&lt;span&gt;); &lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;using&amp;nbsp;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;SqlConnection&amp;nbsp;c&amp;nbsp;&lt;/span&gt;&lt;span&gt;=&amp;nbsp;new&amp;nbsp;&lt;/span&gt;&lt;span&gt;SqlConnection&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;.Format&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;@"Data&amp;nbsp;Source=YourServer;Initial&amp;nbsp;Catalog=YourDatabase;Persist&amp;nbsp;Security&amp;nbsp;Info=True;Trusted_Connection=True;Workstation&amp;nbsp;ID={0}"&lt;/span&gt;&lt;span&gt;,&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;guid.ToString&lt;/span&gt;&lt;span&gt;()))) &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;{ &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;using&amp;nbsp;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;SqlCommand&amp;nbsp;cmd&amp;nbsp;&lt;/span&gt;&lt;span&gt;=&amp;nbsp;new&amp;nbsp;&lt;/span&gt;&lt;span&gt;SqlCommand&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;"SELECT&amp;nbsp;CAST(HOST_NAME()&amp;nbsp;as&amp;nbsp;uniqueidentifier)"&lt;/span&gt;&lt;span&gt;,&amp;nbsp;&lt;/span&gt;&lt;span&gt;c&lt;/span&gt;&lt;span&gt;)) &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;{ &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cmd.CommandType&amp;nbsp;&lt;/span&gt;&lt;span&gt;=&amp;nbsp;&lt;/span&gt;&lt;span&gt;CommandType.Text&lt;/span&gt;&lt;span&gt;; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;c.Open&lt;/span&gt;&lt;span&gt;(); &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;SqlDataReader&amp;nbsp;dr&amp;nbsp;&lt;/span&gt;&lt;span&gt;=&amp;nbsp;&lt;/span&gt;&lt;span&gt;cmd.ExecuteReader&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;CommandBehavior.CloseConnection&lt;/span&gt;&lt;span&gt;); &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;while&amp;nbsp;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;dr.Read&lt;/span&gt;&lt;span&gt;()) &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;{ &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;dr.GetSqlGuid&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;.ToString&lt;/span&gt;&lt;span&gt;()); &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;} &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dr.Close&lt;/span&gt;&lt;span&gt;(); &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;} &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c.Close&lt;/span&gt;&lt;span&gt;(); &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;} &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.ReadLine&lt;/span&gt;&lt;span&gt;(); &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;} &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br&gt;} &lt;br&gt;&lt;/p&gt;&lt;/span&gt;&lt;/code&gt;
&lt;br&gt;&lt;hr&gt;&lt;br&gt;Cross-posted from SQLBlog! - &lt;a href="http://www.sqlblog.com"&gt;http://www.sqlblog.com&lt;/a&gt;&lt;br&gt;&lt;hr&gt;&lt;br&gt;&lt;img src="http://www.sqljunkies.com/WebLog/aggbug.aspx?PostID=49338" width="1" height="1"&gt;</content><slash:comments>0</slash:comments></entry><entry><title>Manage Visual Studio Auto Connect to Team Foundation Server</title><link rel="alternate" type="text/html" href="http://www.sqljunkies.com/WebLog/peter_debetta/archive/2007/07/19/49332.aspx" /><id>d2584c15-f6ef-46f7-a2d4-24fc0e143e76:49332</id><created>2007-07-19T11:42:17Z</created><content type="text/html" mode="escaped">&lt;p&gt;I've been on a project where we are using Team Foundation Server (TFS). As you may already be aware, Visual Studio (VS) automatically tries to connect to TFS. When I am onsite, this is great, but when I am offsite and not VPN-ed into the client site, VS takes a long time to time out on its attempt to connect to their TFS. When going in and out of VS throughout the day, I felt as if I was wasting a lot of time waiting for VS to time out. So I found this little nugget that showed how to modify the registry to turn off the auto connect feature:&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.conchango.com/merrickchaffer/archive/2007/01/09/Prevent-Visual-Studio-Team-Explorer-from-connecting-to-Team-Foundation-Server-at-startup.aspx"&gt;http://blogs.conchango.com/merrickchaffer/archive/2007/01/09/Prevent-Visual-Studio-Team-Explorer-from-connecting-to-Team-Foundation-Server-at-startup.aspx&lt;/a&gt;&lt;/p&gt; &lt;p&gt;But I decided that I wanted to quickly be able to change the setting without having to plow through the registry each time, and so I wrote a quickie VBScript for WSH that would allow you to easily change the registry setting. Here is that script:&amp;nbsp;&lt;/p&gt;&lt;code&gt;&lt;span&gt;'&amp;nbsp;VBScript &lt;br&gt;'&amp;nbsp;The&amp;nbsp;script&amp;nbsp;creates&amp;nbsp;and/or&amp;nbsp;updates&amp;nbsp;the&amp;nbsp;TFS&amp;nbsp;AutoLoadServer&amp;nbsp;feature&amp;nbsp;for&amp;nbsp;Visual&amp;nbsp;Studio &lt;br&gt;'&amp;nbsp;By&amp;nbsp;default,&amp;nbsp;Visual&amp;nbsp;Studio&amp;nbsp;will&amp;nbsp;attempt&amp;nbsp;to&amp;nbsp;reconnect&amp;nbsp;to&amp;nbsp;all&amp;nbsp;Team&amp;nbsp;Foundation&amp;nbsp;Servers &lt;br&gt;'&amp;nbsp; &lt;br&gt;'&amp;nbsp;Creating&amp;nbsp;a&amp;nbsp;REG_DWORD&amp;nbsp;value&amp;nbsp;named&amp;nbsp;AutoLoadServer&amp;nbsp;at&amp;nbsp; &lt;br&gt;'&amp;nbsp;HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\8.0\TeamFoundation\ &lt;br&gt;'&amp;nbsp;you&amp;nbsp;can&amp;nbsp;manually&amp;nbsp;control&amp;nbsp;whether&amp;nbsp;or&amp;nbsp;not&amp;nbsp;VS&amp;nbsp;will&amp;nbsp;automatically&amp;nbsp;connect&amp;nbsp;to&amp;nbsp;TFS&amp;nbsp;server(s)&amp;nbsp; &lt;br&gt;'&amp;nbsp;0&amp;nbsp;means&amp;nbsp;do&amp;nbsp;not&amp;nbsp;automatically&amp;nbsp;connect&amp;nbsp; &lt;br&gt;'&amp;nbsp;1&amp;nbsp;means&amp;nbsp;automatically&amp;nbsp;connect&amp;nbsp;(default&amp;nbsp;behavior&amp;nbsp;when&amp;nbsp;value&amp;nbsp;is&amp;nbsp;not&amp;nbsp;present) &lt;br&gt;' &lt;br&gt;'&amp;nbsp;Peter&amp;nbsp;DeBetta,&amp;nbsp;2007 &lt;br&gt;&lt;br&gt;'&amp;nbsp;Some&amp;nbsp;variables &lt;br&gt;&lt;/span&gt;&lt;span&gt;Dim&amp;nbsp;&lt;/span&gt;&lt;span&gt;objShell&lt;/span&gt;&lt;span&gt;,&amp;nbsp;&lt;/span&gt;&lt;span&gt;RegLocation &lt;br&gt;&lt;br&gt;&lt;/span&gt;&lt;span&gt;'&amp;nbsp;Instantiate&amp;nbsp;the&amp;nbsp;WSH&amp;nbsp;Shell &lt;br&gt;&lt;/span&gt;&lt;span&gt;Set&amp;nbsp;&lt;/span&gt;&lt;span&gt;objShell&amp;nbsp;&lt;/span&gt;&lt;span&gt;=&amp;nbsp;&lt;/span&gt;&lt;span&gt;WScript.CreateObject&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;"WScript.Shell"&lt;/span&gt;&lt;span&gt;) &lt;br&gt;&lt;br&gt;&lt;/span&gt;&lt;span&gt;'&amp;nbsp;This&amp;nbsp;is&amp;nbsp;the&amp;nbsp;value&amp;nbsp;that&amp;nbsp;affects&amp;nbsp;the&amp;nbsp;auto&amp;nbsp;connect&amp;nbsp;feature &lt;br&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;RegLocation&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&amp;nbsp;&lt;/span&gt;&lt;span&gt;"HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\8.0\TeamFoundation\AutoLoadServer" &lt;br&gt;&lt;br&gt;&lt;/span&gt;&lt;span&gt;'&amp;nbsp;Ask&amp;nbsp;for&amp;nbsp;the&amp;nbsp;new&amp;nbsp;value&amp;nbsp;(default&amp;nbsp;to&amp;nbsp;"1") &lt;br&gt;&lt;/span&gt;&lt;span&gt;id&amp;nbsp;&lt;/span&gt;&lt;span&gt;=&amp;nbsp;&lt;/span&gt;&lt;span&gt;inputbox&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;"Type&amp;nbsp;1&amp;nbsp;to&amp;nbsp;turn&amp;nbsp;on,&amp;nbsp;0&amp;nbsp;to&amp;nbsp;turn&amp;nbsp;off"&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;"VS&amp;nbsp;TFS&amp;nbsp;AutoLoadServer"&lt;/span&gt;&lt;span&gt;,&amp;nbsp;&lt;/span&gt;&lt;span&gt;"1"&lt;/span&gt;&lt;span&gt;) &lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/span&gt;&lt;span&gt;If&amp;nbsp;&lt;/span&gt;&lt;span&gt;id&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;lt;&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;"0"&amp;nbsp;&lt;/span&gt;&lt;span&gt;And&amp;nbsp;&lt;/span&gt;&lt;span&gt;id&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;lt;&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;"1"&amp;nbsp;&lt;/span&gt;&lt;span&gt;Then &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;'&amp;nbsp;Did&amp;nbsp;we&amp;nbsp;get&amp;nbsp;a&amp;nbsp;valid&amp;nbsp;value?&amp;nbsp;No?&amp;nbsp;Then&amp;nbsp;let&amp;nbsp;the&amp;nbsp;user&amp;nbsp;know &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;objshell.popup&amp;nbsp;&lt;/span&gt;&lt;span&gt;"Invalid&amp;nbsp;input:&amp;nbsp;Only&amp;nbsp;0&amp;nbsp;or&amp;nbsp;1&amp;nbsp;are&amp;nbsp;allowed"&amp;nbsp;&lt;/span&gt;&lt;span&gt;,,&lt;/span&gt;&lt;span&gt;"INPUT&amp;nbsp;ERROR!"&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;48 &lt;br&gt;&lt;/span&gt;&lt;span&gt;Else &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;'&amp;nbsp;Otherwise,&amp;nbsp;update&amp;nbsp;the&amp;nbsp;Registry&amp;nbsp;Value &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;objShell.RegWrite&amp;nbsp;&lt;span&gt;RegLocation&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&amp;nbsp;&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;,&amp;nbsp;&lt;/span&gt;&lt;span&gt;"REG_DWORD" &lt;br&gt;&lt;/span&gt;&lt;span&gt;End&amp;nbsp;If &lt;br&gt;&lt;br&gt;&lt;/span&gt;&lt;span&gt;'&amp;nbsp;Exit&amp;nbsp;Gracefully &lt;br&gt;&lt;/span&gt;&lt;span&gt;WScript.Quit&amp;nbsp;&lt;/span&gt;&lt;/code&gt;
&lt;br&gt;&lt;hr&gt;&lt;br&gt;Cross-posted from SQLBlog! - &lt;a href="http://www.sqlblog.com"&gt;http://www.sqlblog.com&lt;/a&gt;&lt;br&gt;&lt;hr&gt;&lt;br&gt;&lt;img src="http://www.sqljunkies.com/WebLog/aggbug.aspx?PostID=49332" width="1" height="1"&gt;</content><slash:comments>0</slash:comments></entry><entry><title>DevTeach Code Samples</title><link rel="alternate" type="text/html" href="http://www.sqljunkies.com/WebLog/peter_debetta/archive/2007/06/07/35626.aspx" /><id>d2584c15-f6ef-46f7-a2d4-24fc0e143e76:35626</id><created>2007-06-07T13:06:42Z</created><content type="text/html" mode="escaped">&lt;P&gt;A little overdue, here are my code samples from my sessions at DevTeach Montreal 2007. &lt;/P&gt;
&lt;br&gt;&lt;hr&gt;&lt;br&gt;Cross-posted from SQLBlog! - &lt;a href="http://www.sqlblog.com"&gt;http://www.sqlblog.com&lt;/a&gt;&lt;br&gt;&lt;hr&gt;&lt;br&gt;&lt;img src="http://www.sqljunkies.com/WebLog/aggbug.aspx?PostID=35626" width="1" height="1"&gt;</content><slash:comments>0</slash:comments></entry><entry><title>News: DevTeach, TechEd, and SQLblog Sundries...</title><link rel="alternate" type="text/html" href="http://www.sqljunkies.com/WebLog/peter_debetta/archive/2007/05/18/33703.aspx" /><id>d2584c15-f6ef-46f7-a2d4-24fc0e143e76:33703</id><created>2007-05-18T12:57:24Z</created><content type="text/html" mode="escaped">&lt;P&gt;I know I have been a slacker when it comes to posting lately, but I have been on the road quite a bit of late and will finally have some time at home over the next 2 weeks and have some new topics that I should be posting about during that time.&lt;/P&gt;
&lt;P&gt;As for DevTeach, SQLblog had a great presence at the SQLTeach part of the conference here in Montreal, including (in no particular order): Adam Machanic, Kevin Kline, Rick Heiges, Paul Nielsen, Roman Rehak (who was the SQLTeach Tech Chair), and yours truly, and soon to be blogging at SQLblog, James Luetkehoelter. I heard great things about my fellow SQLbloggers and was glad to get some time to catch up with them and a few other folks at the conference. &lt;/P&gt;
&lt;P&gt;As for TechEd. I will be off to TechEd this year (June 4 - 8), and even doing a breakout session on XML in SQL Server 2005. I'll also be co-hosting an SQL Server 2005 XML Q&amp;amp;A session with Michael Rys from Microsoft. Very exciting!&lt;/P&gt;
&lt;P&gt;Finally, I will be looking into migrating SQLblog to the latest version of CommunityServer (CS2007) in the coming months. With the change, we are also hoping to add some new features to the site. Some of the features we have been contemplating are&amp;nbsp;articles, book reviews, and voting forums. No promises; but when my current project ends, I hope to have time to implement some of these features (assuming CS2007 makes it easy to do so).&lt;/P&gt;
&lt;br&gt;&lt;hr&gt;&lt;br&gt;Cross-posted from SQLBlog! - &lt;a href="http://www.sqlblog.com"&gt;http://www.sqlblog.com&lt;/a&gt;&lt;br&gt;&lt;hr&gt;&lt;br&gt;&lt;img src="http://www.sqljunkies.com/WebLog/aggbug.aspx?PostID=33703" width="1" height="1"&gt;</content><slash:comments>0</slash:comments></entry><entry><title>T-SQL Convert Hex String to Varbinary</title><link rel="alternate" type="text/html" href="http://www.sqljunkies.com/WebLog/peter_debetta/archive/2007/03/09/28991.aspx" /><id>d2584c15-f6ef-46f7-a2d4-24fc0e143e76:28991</id><created>2007-03-09T16:39:00Z</created><content type="text/html" mode="escaped">&lt;p&gt;&lt;span&gt;One last post before I go on vacation next week...
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;SQL Server 2005 includes an undocumented function, sys.fn_varbintohexstr, that converts a hex value to a string representation of that hex value (0x3a becomes '0x3a'), but there is no function to go back from a hex string to a hex value. Now there is &lt;/span&gt;&lt;span&gt;J&lt;/span&gt;&lt;span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;CREATE&lt;/span&gt;
			&lt;span&gt;FUNCTION&lt;/span&gt; dbo&lt;span&gt;.&lt;/span&gt;HexStrToVarBin&lt;span&gt;(&lt;/span&gt;@hexstr &lt;span&gt;varchar&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;8000&lt;span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;RETURNS&lt;/span&gt;
			&lt;span&gt;varbinary&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;8000&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;AS
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;BEGIN
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;    &lt;span&gt;DECLARE&lt;/span&gt; @hex &lt;span&gt;char&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;2&lt;span&gt;),&lt;/span&gt; @i &lt;span&gt;int&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; @count &lt;span&gt;int&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; @b &lt;span&gt;varbinary&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;8000&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span&gt;    &lt;span&gt;SET&lt;/span&gt; @count &lt;span&gt;=&lt;/span&gt;
			&lt;span&gt;LEN&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;@hexstr&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;    &lt;span&gt;SET&lt;/span&gt; @b &lt;span&gt;=&lt;/span&gt;
			&lt;span&gt;CAST&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;''&lt;/span&gt;
			&lt;span&gt;as&lt;/span&gt;
			&lt;span&gt;varbinary&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;1&lt;span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;    &lt;span&gt;IF&lt;/span&gt;
			&lt;span&gt;SUBSTRING&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;@hexstr&lt;span&gt;,&lt;/span&gt; 1&lt;span&gt;,&lt;/span&gt; 2&lt;span&gt;)&lt;/span&gt;
			&lt;span&gt;=&lt;/span&gt;
			&lt;span&gt;'0x'
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;        &lt;span&gt;SET&lt;/span&gt; @i &lt;span&gt;=&lt;/span&gt; 3
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;    &lt;span&gt;ELSE
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;        &lt;span&gt;SET&lt;/span&gt; @i &lt;span&gt;=&lt;/span&gt; 1
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span&gt;    &lt;span&gt;WHILE&lt;/span&gt;
			&lt;span&gt;(&lt;/span&gt;@i &lt;span&gt;&amp;lt;=&lt;/span&gt; @count&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;     &lt;span&gt;BEGIN
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;        &lt;span&gt;SET&lt;/span&gt; @hex &lt;span&gt;=&lt;/span&gt;
			&lt;span&gt;SUBSTRING&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;@hexstr&lt;span&gt;,&lt;/span&gt; @i&lt;span&gt;,&lt;/span&gt; 2&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;        &lt;span&gt;SET&lt;/span&gt; @b &lt;span&gt;=&lt;/span&gt; @b &lt;span&gt;+&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;                &lt;span&gt;CAST&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;CASE&lt;/span&gt;
			&lt;span&gt;WHEN&lt;/span&gt;
			&lt;span&gt;SUBSTRING&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;@hex&lt;span&gt;,&lt;/span&gt; 1&lt;span&gt;,&lt;/span&gt; 1&lt;span&gt;)&lt;/span&gt;
			&lt;span&gt;LIKE&lt;/span&gt;
			&lt;span&gt;'[0-9]'&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;                    &lt;span&gt;THEN&lt;/span&gt;
			&lt;span&gt;CAST&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;SUBSTRING&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;@hex&lt;span&gt;,&lt;/span&gt; 1&lt;span&gt;,&lt;/span&gt; 1&lt;span&gt;)&lt;/span&gt;
			&lt;span&gt;as&lt;/span&gt;
			&lt;span&gt;int&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;                    &lt;span&gt;ELSE&lt;/span&gt;
			&lt;span&gt;CAST&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;ASCII&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;UPPER&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;SUBSTRING&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;@hex&lt;span&gt;,&lt;/span&gt; 1&lt;span&gt;,&lt;/span&gt; 1&lt;span&gt;)))-&lt;/span&gt;55 &lt;span&gt;as&lt;/span&gt;
			&lt;span&gt;int&lt;/span&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;                &lt;span&gt;END&lt;/span&gt;
			&lt;span&gt;*&lt;/span&gt; 16 &lt;span&gt;+
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;                &lt;span&gt;CASE&lt;/span&gt;
			&lt;span&gt;WHEN&lt;/span&gt;
			&lt;span&gt;SUBSTRING&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;@hex&lt;span&gt;,&lt;/span&gt; 2&lt;span&gt;,&lt;/span&gt; 1&lt;span&gt;)&lt;/span&gt;
			&lt;span&gt;LIKE&lt;/span&gt;
			&lt;span&gt;'[0-9]'&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;                    &lt;span&gt;THEN&lt;/span&gt;
			&lt;span&gt;CAST&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;SUBSTRING&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;@hex&lt;span&gt;,&lt;/span&gt; 2&lt;span&gt;,&lt;/span&gt; 1&lt;span&gt;)&lt;/span&gt;
			&lt;span&gt;as&lt;/span&gt;
			&lt;span&gt;int&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;                    &lt;span&gt;ELSE&lt;/span&gt;
			&lt;span&gt;CAST&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;ASCII&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;UPPER&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;SUBSTRING&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;@hex&lt;span&gt;,&lt;/span&gt; 2&lt;span&gt;,&lt;/span&gt; 1&lt;span&gt;)))-&lt;/span&gt;55 &lt;span&gt;as&lt;/span&gt;
			&lt;span&gt;int&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;                &lt;span&gt;END&lt;/span&gt;
			&lt;span&gt;as&lt;/span&gt;
			&lt;span&gt;binary&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;1&lt;span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;        &lt;span&gt;SET&lt;/span&gt; @i &lt;span&gt;=&lt;/span&gt; @i &lt;span&gt;+&lt;/span&gt; 2
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;     &lt;span&gt;END
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;    &lt;span&gt;RETURN&lt;/span&gt; @b
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;END
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;GO&lt;/span&gt;
	&lt;/p&gt;
&lt;br&gt;&lt;hr&gt;&lt;br&gt;Cross-posted from SQLBlog! - &lt;a href="http://www.sqlblog.com"&gt;http://www.sqlblog.com&lt;/a&gt;&lt;br&gt;&lt;hr&gt;&lt;br&gt;&lt;img src="http://www.sqljunkies.com/WebLog/aggbug.aspx?PostID=28991" width="1" height="1"&gt;</content><slash:comments>4530</slash:comments></entry><entry><title>T-SQL UrlDecode</title><link rel="alternate" type="text/html" href="http://www.sqljunkies.com/WebLog/peter_debetta/archive/2007/03/09/28990.aspx" /><id>d2584c15-f6ef-46f7-a2d4-24fc0e143e76:28990</id><created>2007-03-09T16:12:28Z</created><content type="text/html" mode="escaped">&lt;p&gt;While I'm at it, here is the counterpart to the UrlEncode function – UrlDecode:
&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;CREATE&lt;/span&gt;
			&lt;span&gt;FUNCTION&lt;/span&gt; dbo&lt;span&gt;.&lt;/span&gt;UrlDecode&lt;span&gt;(&lt;/span&gt;@url &lt;span&gt;varchar&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;3072&lt;span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;RETURNS&lt;/span&gt;
			&lt;span&gt;varchar&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;3072&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;AS
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;
			&lt;span&gt;BEGIN
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;    &lt;span&gt;DECLARE&lt;/span&gt; @count &lt;span&gt;int&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; @c &lt;span&gt;char&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;1&lt;span&gt;),&lt;/span&gt; @cenc &lt;span&gt;char&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;2&lt;span&gt;),&lt;/span&gt; @i &lt;span&gt;int&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; @urlReturn &lt;span&gt;varchar&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;3072&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;    &lt;span&gt;SET&lt;/span&gt; @count &lt;span&gt;=&lt;/span&gt;
			&lt;span&gt;Len&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;@url&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;    &lt;span&gt;SET&lt;/span&gt; @i &lt;span&gt;=&lt;/span&gt; 1
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;    &lt;span&gt;SET&lt;/span&gt; @urlReturn &lt;span&gt;=&lt;/span&gt;
			&lt;span&gt;''
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;    &lt;span&gt;WHILE&lt;/span&gt;
			&lt;span&gt;(&lt;/span&gt;@i &lt;span&gt;&amp;lt;=&lt;/span&gt; @count&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;     &lt;span&gt;BEGIN
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;        &lt;span&gt;SET&lt;/span&gt; @c &lt;span&gt;=&lt;/span&gt;
			&lt;span&gt;substring&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;@url&lt;span&gt;,&lt;/span&gt; @i&lt;span&gt;,&lt;/span&gt; 1&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;        &lt;span&gt;IF&lt;/span&gt; @c &lt;span&gt;LIKE&lt;/span&gt;
			&lt;span&gt;'[!%]'&lt;/span&gt;
			&lt;span&gt;ESCAPE&lt;/span&gt;
			&lt;span&gt;'!'
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;         &lt;span&gt;BEGIN
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;            &lt;span&gt;SET&lt;/span&gt; @cenc &lt;span&gt;=&lt;/span&gt;
			&lt;span&gt;substring&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;@url&lt;span&gt;,&lt;/span&gt; @i &lt;span&gt;+&lt;/span&gt; 1&lt;span&gt;,&lt;/span&gt; 2&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;            &lt;span&gt;SET&lt;/span&gt; @c &lt;span&gt;=&lt;/span&gt;
			&lt;span&gt;CHAR&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;CASE&lt;/span&gt;
			&lt;span&gt;WHEN&lt;/span&gt;
			&lt;span&gt;SUBSTRING&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;@cenc&lt;span&gt;,&lt;/span&gt; 1&lt;span&gt;,&lt;/span&gt; 1&lt;span&gt;)&lt;/span&gt;
			&lt;span&gt;LIKE&lt;/span&gt;
			&lt;span&gt;'[0-9]'&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;                                &lt;span&gt;THEN&lt;/span&gt;
			&lt;span&gt;CAST&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;SUBSTRING&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;@cenc&lt;span&gt;,&lt;/span&gt; 1&lt;span&gt;,&lt;/span&gt; 1&lt;span&gt;)&lt;/span&gt;
			&lt;span&gt;as&lt;/span&gt;
			&lt;span&gt;int&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;                                &lt;span&gt;ELSE&lt;/span&gt;
			&lt;span&gt;CAST&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;ASCII&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;UPPER&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;SUBSTRING&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;@cenc&lt;span&gt;,&lt;/span&gt; 1&lt;span&gt;,&lt;/span&gt; 1&lt;span&gt;)))-&lt;/span&gt;55 &lt;span&gt;as&lt;/span&gt;
			&lt;span&gt;int&lt;/span&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;                            &lt;span&gt;END&lt;/span&gt;
			&lt;span&gt;*&lt;/span&gt; 16 &lt;span&gt;+
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;                            &lt;span&gt;CASE&lt;/span&gt;
			&lt;span&gt;WHEN&lt;/span&gt;
			&lt;span&gt;SUBSTRING&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;@cenc&lt;span&gt;,&lt;/span&gt; 2&lt;span&gt;,&lt;/span&gt; 1&lt;span&gt;)&lt;/span&gt;
			&lt;span&gt;LIKE&lt;/span&gt;
			&lt;span&gt;'[0-9]'&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;                                &lt;span&gt;THEN&lt;/span&gt;
			&lt;span&gt;CAST&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;SUBSTRING&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;@cenc&lt;span&gt;,&lt;/span&gt; 2&lt;span&gt;,&lt;/span&gt; 1&lt;span&gt;)&lt;/span&gt;
			&lt;span&gt;as&lt;/span&gt;
			&lt;span&gt;int&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;                                &lt;span&gt;ELSE&lt;/span&gt;
			&lt;span&gt;CAST&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;ASCII&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;UPPER&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;SUBSTRING&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;@cenc&lt;span&gt;,&lt;/span&gt; 2&lt;span&gt;,&lt;/span&gt; 1&lt;span&gt;)))-&lt;/span&gt;55 &lt;span&gt;as&lt;/span&gt;
			&lt;span&gt;int&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;                            &lt;span&gt;END&lt;/span&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;            &lt;span&gt;SET&lt;/span&gt; @urlReturn &lt;span&gt;=&lt;/span&gt; @urlReturn &lt;span&gt;+&lt;/span&gt; @c
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;            &lt;span&gt;SET&lt;/span&gt; @i &lt;span&gt;=&lt;/span&gt; @i &lt;span&gt;+&lt;/span&gt; 2
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;         &lt;span&gt;END
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;        &lt;span&gt;ELSE&lt;/span&gt;
		&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;         &lt;span&gt;BEGIN
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;            &lt;span&gt;SET&lt;/span&gt; @urlReturn &lt;span&gt;=&lt;/span&gt; @urlReturn &lt;span&gt;+&lt;/span&gt; @c
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;         &lt;span&gt;END
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;        &lt;span&gt;SET&lt;/span&gt; @i &lt;span&gt;=&lt;/span&gt; @i &lt;span&gt;+&lt;/span&gt;1
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;     &lt;span&gt;END
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span&gt;    &lt;span&gt;RETURN&lt;/span&gt; @urlReturn
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;
			&lt;span&gt;END
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;GO&lt;/span&gt;&lt;/p&gt;
&lt;br&gt;&lt;hr&gt;&lt;br&gt;Cross-posted from SQLBlog! - &lt;a href="http://www.sqlblog.com"&gt;http://www.sqlblog.com&lt;/a&gt;&lt;br&gt;&lt;hr&gt;&lt;br&gt;&lt;img src="http://www.sqljunkies.com/WebLog/aggbug.aspx?PostID=28990" width="1" height="1"&gt;</content><slash:comments>8</slash:comments></entry><entry><title>T-SQL UrlEncode</title><link rel="alternate" type="text/html" href="http://www.sqljunkies.com/WebLog/peter_debetta/archive/2007/03/09/28987.aspx" /><id>d2584c15-f6ef-46f7-a2d4-24fc0e143e76:28987</id><created>2007-03-09T13:08:45Z</created><content type="text/html" mode="escaped">&lt;p&gt;I was perusing the newsgroups when I came across a request in the &lt;em&gt;microsoft.public.sqlserver.clr&lt;/em&gt; newsgroup to see if there was a way to use &lt;a href="http://msdn2.microsoft.com/en-us/library/system.web.httputility.urlencode.aspx"&gt;System.Web.HttpUtility.UrlEncode&lt;/a&gt; in T-SQL. I know using the CLR is an option, but I decided to write a T-SQL equivalent. I reflected the code to figure out the exact rules for UrlEncoding. Then, I discovered much to my delight, a new system function in SQL Server 2005 that converts a string to its hexadecimal equivalent as a string– &lt;em&gt;sys.fn_varbintohexstr&lt;/em&gt;. I knew there was an extended stored procedure in prior versions of SQL Server to do this conversion, but this function made writing this UrlEncode function even easier.
&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;CREATE&lt;/span&gt;
				&lt;span&gt;FUNCTION&lt;/span&gt; dbo&lt;span&gt;.&lt;/span&gt;UrlEncode&lt;span&gt;(&lt;/span&gt;@url &lt;span&gt;varchar&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;1024&lt;span&gt;))
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;RETURNS&lt;/span&gt;
				&lt;span&gt;varchar&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;3072&lt;span&gt;)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;AS
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;
				&lt;span&gt;BEGIN
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;    &lt;span&gt;DECLARE&lt;/span&gt; @count &lt;span&gt;int&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; @c &lt;span&gt;char&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;1&lt;span&gt;),&lt;/span&gt; @i &lt;span&gt;int&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; @urlReturn &lt;span&gt;varchar&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;3072&lt;span&gt;)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;    &lt;span&gt;SET&lt;/span&gt; @count &lt;span&gt;=&lt;/span&gt;
				&lt;span&gt;Len&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;@url&lt;span&gt;)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;    &lt;span&gt;SET&lt;/span&gt; @i &lt;span&gt;=&lt;/span&gt; 1
&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;    &lt;span&gt;SET&lt;/span&gt; @urlReturn &lt;span&gt;=&lt;/span&gt;
				&lt;span&gt;''
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;    &lt;span&gt;WHILE&lt;/span&gt;
				&lt;span&gt;(&lt;/span&gt;@i &lt;span&gt;&amp;lt;=&lt;/span&gt; @count&lt;span&gt;)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;     &lt;span&gt;BEGIN
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;        &lt;span&gt;SET&lt;/span&gt; @c &lt;span&gt;=&lt;/span&gt;
				&lt;span&gt;substring&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;@url&lt;span&gt;,&lt;/span&gt; @i&lt;span&gt;,&lt;/span&gt; 1&lt;span&gt;)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;        &lt;span&gt;IF&lt;/span&gt; @c &lt;span&gt;LIKE&lt;/span&gt;
				&lt;span&gt;'[A-Za-z0-9()''*-._! ]'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;         &lt;span&gt;BEGIN
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;            &lt;span&gt;SET&lt;/span&gt; @urlReturn &lt;span&gt;=&lt;/span&gt; @urlReturn &lt;span&gt;+&lt;/span&gt; @c
&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;         &lt;span&gt;END
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;        &lt;span&gt;ELSE
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;         &lt;span&gt;BEGIN
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;            &lt;span&gt;SET&lt;/span&gt; @urlReturn &lt;span&gt;=&lt;/span&gt;
			&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;                @urlReturn &lt;span&gt;+&lt;/span&gt;
			&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;                &lt;span&gt;'%'&lt;/span&gt;
				&lt;span&gt;+&lt;/span&gt;
			&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;                SUBSTRING&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;sys.fn_varbintohexstr&lt;span&gt;(&lt;/span&gt;&lt;span&gt;CAST&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;@c &lt;span&gt;as&lt;/span&gt;
				&lt;span&gt;varbinary&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;max&lt;/span&gt;&lt;span&gt;))),&lt;/span&gt;3&lt;span&gt;,&lt;/span&gt;2&lt;span&gt;)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;         &lt;span&gt;END
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;        &lt;span&gt;SET&lt;/span&gt; @i &lt;span&gt;=&lt;/span&gt; @i &lt;span&gt;+&lt;/span&gt;1
&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;     &lt;span&gt;END
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;    &lt;span&gt;RETURN&lt;/span&gt; @urlReturn
&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;
				&lt;span&gt;END
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;GO
&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;This function works in a very similar fashion to the UrlEncodeBytesToBytesInternal found in the .NET Framework (in &lt;em&gt;System.Web.HttpUtility&lt;/em&gt;) except that the function I wrote does not convert the URL to a byte array. If you have the latest version of Reflector, you can view the reflected code for UrlEncodeBytesToBytesInternal &lt;a href="code://System.Web:2.0.0.0:b03f5f7f11d50a3a/System.Web.HttpUtility/UrlEncodeBytesToBytesInternal(Byte%5b%5d,Int32,Int32,Boolean):Byte%5b%5d"&gt;here&lt;/a&gt;.
&lt;/p&gt;&lt;p&gt;And speaking of Reflector – if you have the latest version, you can copy a URL link to a method, class, property, and so on by select the item and pressing Ctrl-Alt-C (which is how I put that link in this post).&lt;/p&gt;
&lt;br&gt;&lt;hr&gt;&lt;br&gt;Cross-posted from SQLBlog! - &lt;a href="http://www.sqlblog.com"&gt;http://www.sqlblog.com&lt;/a&gt;&lt;br&gt;&lt;hr&gt;&lt;br&gt;&lt;img src="http://www.sqljunkies.com/WebLog/aggbug.aspx?PostID=28987" width="1" height="1"&gt;</content><slash:comments>1</slash:comments></entry><entry><title>DevWeek Downloads</title><link rel="alternate" type="text/html" href="http://www.sqljunkies.com/WebLog/peter_debetta/archive/2007/03/09/28986.aspx" /><id>d2584c15-f6ef-46f7-a2d4-24fc0e143e76:28986</id><created>2007-03-09T12:48:13Z</created><content type="text/html" mode="escaped">&lt;P&gt;For all those who attemeded any of my talks at DevWeek In London last week, I have included any changed slide decks&amp;nbsp;and code samples in the attached zip file (at bottom of post).&lt;/P&gt;
&lt;P&gt;Enjoy!&lt;/P&gt;
&lt;br&gt;&lt;hr&gt;&lt;br&gt;Cross-posted from SQLBlog! - &lt;a href="http://www.sqlblog.com"&gt;http://www.sqlblog.com&lt;/a&gt;&lt;br&gt;&lt;hr&gt;&lt;br&gt;&lt;img src="http://www.sqljunkies.com/WebLog/aggbug.aspx?PostID=28986" width="1" height="1"&gt;</content><slash:comments>1</slash:comments></entry><entry><title>Multiple-Valued Parameters</title><link rel="alternate" type="text/html" href="http://www.sqljunkies.com/WebLog/peter_debetta/archive/2007/02/12/28159.aspx" /><id>d2584c15-f6ef-46f7-a2d4-24fc0e143e76:28159</id><created>2007-02-12T17:44:02Z</created><content type="text/html" mode="escaped">&lt;p&gt;&lt;span&gt;So I was doing some research on which is the best way to pass multiple-valued parameters into a stored procedure or user-defined function when I found some interesting results. I had always used a string-based user-defined function to parse a delimited list of values and I knew I could use XML to do the same thing, yet I had never compared the two side-by-side to see which is a better choice.
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;So which was faster? Well, using one of many available string-based UDFs, I had unexpected results. I thought that the XML version would be equivalent if not slower, but alas, I was wrong. The XML-based UDF consistently performed about 35% faster than the string-based inline table-valued UDF and about 65% faster than string-based table-valued UDF I tested. 
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;I will be following-up this post soon with a post about various XML-based techniques that I tested…
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;As for now, here are the various functions used in the tests:
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;CREATE&lt;/span&gt;
			&lt;span&gt;FUNCTION&lt;/span&gt; dbo&lt;span&gt;.&lt;/span&gt;fnString2IntList&lt;span&gt;(&lt;/span&gt;@sData &lt;span&gt;varchar&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;8000&lt;span&gt;),&lt;/span&gt; @sDelim &lt;span&gt;char&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;1&lt;span&gt;))&lt;/span&gt;
			&lt;br /&gt;&lt;span&gt;RETURNS&lt;/span&gt; @tList &lt;span&gt;TABLE&lt;/span&gt;
			&lt;span&gt;(&lt;/span&gt;ListValue &lt;span&gt;int&lt;/span&gt;&lt;span&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span&gt;AS&lt;/span&gt;
			&lt;br /&gt;&lt;span&gt;BEGIN&lt;br /&gt;&lt;/span&gt;    &lt;span&gt;DECLARE&lt;/span&gt; @sTemp &lt;span&gt;int&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; @nPos &lt;span&gt;int&lt;/span&gt;&lt;span&gt;,&lt;/span&gt; @nPos2 &lt;span&gt;int&lt;br /&gt;&lt;/span&gt;    &lt;span&gt;IF&lt;/span&gt;
			&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Len&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;RTrim&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;LTrim&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;@sData&lt;span&gt;)))&lt;/span&gt;
			&lt;span&gt;=&lt;/span&gt; 0&lt;span&gt;)&lt;/span&gt;
			&lt;span&gt;RETURN&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span&gt;SET&lt;/span&gt; @nPos &lt;span&gt;=&lt;/span&gt;
			&lt;span&gt;CharIndex&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;@sDelim&lt;span&gt;,&lt;/span&gt; @sData&lt;span&gt;,&lt;/span&gt; 1&lt;span&gt;)&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span&gt;IF&lt;/span&gt; @nPos &lt;span&gt;=&lt;/span&gt; 0 &lt;span&gt;OR&lt;/span&gt; @nPos &lt;span&gt;=&lt;/span&gt;
			&lt;span&gt;Len&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;@sData&lt;span&gt;)&lt;br /&gt;&lt;/span&gt;     &lt;span&gt;BEGIN&lt;br /&gt;&lt;/span&gt;        &lt;span&gt;SET&lt;/span&gt; @sTemp &lt;span&gt;=&lt;/span&gt;
			&lt;span&gt;CAST&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;SubString&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;@sData&lt;span&gt;,&lt;/span&gt; 1&lt;span&gt;,&lt;/span&gt;
			&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Len&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;@sData&lt;span&gt;)&lt;/span&gt;
			&lt;span&gt;-&lt;/span&gt;
			&lt;span&gt;Sign&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;@nPos&lt;span&gt;)))&lt;/span&gt;
			&lt;span&gt;as&lt;/span&gt;
			&lt;span&gt;int&lt;/span&gt;&lt;span&gt;)&lt;br /&gt;&lt;/span&gt;        &lt;span&gt;INSERT&lt;/span&gt;
			&lt;span&gt;INTO&lt;/span&gt; @tList &lt;span&gt;VALUES&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;@sTemp&lt;span&gt;)&lt;br /&gt;&lt;/span&gt;        &lt;span&gt;RETURN&lt;br /&gt;&lt;/span&gt;     &lt;span&gt;END&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span&gt;SET&lt;/span&gt; @sTemp &lt;span&gt;=&lt;/span&gt;
			&lt;span&gt;CAST&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;SubString&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;@sData&lt;span&gt;,&lt;/span&gt; 1&lt;span&gt;,&lt;/span&gt; @nPos &lt;span&gt;-&lt;/span&gt; 1&lt;span&gt;)&lt;/span&gt;
			&lt;span&gt;as&lt;/span&gt;
			&lt;span&gt;int&lt;/span&gt;&lt;span&gt;)&lt;br /&gt;&lt;/span&gt;    &lt;span&gt;INSERT&lt;/span&gt;
			&lt;span&gt;INTO&lt;/span&gt; @tList &lt;span&gt;VALUES&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;@sTemp&lt;span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span&gt;WHILE&lt;/span&gt; @nPos &lt;span&gt;&amp;gt;&lt;/span&gt; 0&lt;br /&gt;     &lt;span&gt;BEGIN&lt;/span&gt;    &lt;br /&gt;        &lt;span&gt;SET&lt;/span&gt; @nPos2 &lt;span&gt;=&lt;/span&gt;
			&lt;span&gt;CharIndex&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;@sDelim&lt;span&gt;,&lt;/span&gt; @sData&lt;span&gt;,&lt;/span&gt; @nPos &lt;span&gt;+&lt;/span&gt; 1&lt;span&gt;)&lt;br /&gt;&lt;/span&gt;        &lt;span&gt;IF&lt;/span&gt;
			&lt;span&gt;(&lt;/span&gt;@nPos2 &lt;span&gt;=&lt;/span&gt; 0&lt;span&gt;)&lt;/span&gt;
			&lt;span&gt;SET&lt;/span&gt; @sTemp &lt;span&gt;=&lt;/span&gt;
			&lt;span&gt;CAST&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;SubString&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;@sData&lt;span&gt;,&lt;/span&gt; @nPos &lt;span&gt;+&lt;/span&gt; 1&lt;span&gt;,&lt;/span&gt;
			&lt;span&gt;Len&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;@sData&lt;span&gt;))&lt;/span&gt;
			&lt;span&gt;as&lt;/span&gt;
			&lt;span&gt;int&lt;/span&gt;&lt;span&gt;)&lt;br /&gt;&lt;/span&gt;        &lt;span&gt;ELSE&lt;/span&gt;
			&lt;span&gt;SET&lt;/span&gt; @sTemp &lt;span&gt;=&lt;/span&gt;
			&lt;span&gt;CAST&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;SubString&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;@sData&lt;span&gt;,&lt;/span&gt; @nPos &lt;span&gt;+&lt;/span&gt; 1&lt;span&gt;,&lt;/span&gt;
			&lt;span&gt;ABS&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;@nPos2 &lt;span&gt;-&lt;/span&gt; @nPos &lt;span&gt;-&lt;/span&gt; 1&lt;span&gt;))&lt;/span&gt;
			&lt;span&gt;as&lt;/span&gt;
			&lt;span&gt;int&lt;/span&gt;&lt;span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span&gt;INSERT&lt;/span&gt;
			&lt;span&gt;INTO&lt;/span&gt; @tList &lt;span&gt;VALUES&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;@sTemp&lt;span&gt;)&lt;br /&gt;&lt;/span&gt;        &lt;span&gt;SET&lt;/span&gt; @nPos &lt;span&gt;=&lt;/span&gt;
			&lt;span&gt;CharIndex&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;@sDelim&lt;span&gt;,&lt;/span&gt; @sData&lt;span&gt;,&lt;/span&gt; @nPos &lt;span&gt;+&lt;/span&gt; 1&lt;span&gt;)&lt;br /&gt;&lt;/span&gt;     &lt;span&gt;END&lt;br /&gt;&lt;/span&gt;    &lt;span&gt;RETURN&lt;br /&gt;END&lt;br /&gt;&lt;/span&gt;GO
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;CREATE&lt;/span&gt;
			&lt;span&gt;FUNCTION&lt;/span&gt; dbo&lt;span&gt;.&lt;/span&gt;fnString2IntList2&lt;span&gt;(&lt;/span&gt;@sData &lt;span&gt;varchar&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;8000&lt;span&gt;),&lt;/span&gt; @sDelim &lt;span&gt;char&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;1&lt;span&gt;))&lt;/span&gt;
			&lt;br /&gt;&lt;span&gt;RETURNS&lt;/span&gt;
			&lt;span&gt;TABLE&lt;/span&gt;
			&lt;br /&gt;&lt;span&gt;AS&lt;/span&gt;
			&lt;br /&gt;    &lt;span&gt;RETURN&lt;/span&gt;
			&lt;br /&gt;    &lt;span&gt;(&lt;/span&gt;&lt;span&gt;WITH&lt;/span&gt; csvtbl&lt;span&gt;(&lt;/span&gt;i&lt;span&gt;,&lt;/span&gt;j&lt;span&gt;)&lt;br /&gt;&lt;/span&gt;    &lt;span&gt;AS&lt;br /&gt;&lt;/span&gt;    &lt;span&gt;(&lt;br /&gt;&lt;/span&gt;        &lt;span&gt;SELECT&lt;/span&gt; i &lt;span&gt;=&lt;/span&gt; 1&lt;span&gt;,&lt;/span&gt; j &lt;span&gt;=&lt;/span&gt;
			&lt;span&gt;CHARINDEX&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;@sDelim&lt;span&gt;,&lt;/span&gt; @sData &lt;span&gt;+&lt;/span&gt; @sDelim&lt;span&gt;)&lt;br /&gt;&lt;/span&gt;        &lt;span&gt;UNION&lt;/span&gt;
			&lt;span&gt;ALL&lt;br /&gt;&lt;/span&gt;        &lt;span&gt;SELECT&lt;/span&gt; i &lt;span&gt;=&lt;/span&gt; j &lt;span&gt;+&lt;/span&gt; 1&lt;span&gt;,&lt;/span&gt; j &lt;span&gt;=&lt;/span&gt;
			&lt;span&gt;CHARINDEX&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;@sDelim&lt;span&gt;,&lt;/span&gt; @sData &lt;span&gt;+&lt;/span&gt; @sDelim&lt;span&gt;,&lt;/span&gt; j &lt;span&gt;+&lt;/span&gt; 1&lt;span&gt;)&lt;/span&gt;
			&lt;br /&gt;        &lt;span&gt;FROM&lt;/span&gt; csvtbl&lt;br /&gt;           &lt;span&gt;WHERE&lt;/span&gt;
			&lt;span&gt;CHARINDEX&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;@sDelim&lt;span&gt;,&lt;/span&gt; @sData &lt;span&gt;+&lt;/span&gt; @sDelim&lt;span&gt;,&lt;/span&gt; j &lt;span&gt;+&lt;/span&gt; 1&lt;span&gt;)&lt;/span&gt;
			&lt;span&gt;&amp;lt;&amp;gt;&lt;/span&gt; 0&lt;br /&gt;    &lt;span&gt;)&lt;br /&gt;&lt;/span&gt;    &lt;span&gt;SELECT&lt;/span&gt;
			&lt;span&gt;CAST&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;SUBSTRING&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;@sData&lt;span&gt;,&lt;/span&gt; i&lt;span&gt;,&lt;/span&gt; j &lt;span&gt;-&lt;/span&gt; i&lt;span&gt;)&lt;/span&gt;
			&lt;span&gt;as&lt;/span&gt;
			&lt;span&gt;int&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;
			&lt;span&gt;AS&lt;/span&gt; ListValue&lt;br /&gt;    &lt;span&gt;FROM&lt;/span&gt; csvtbl&lt;span&gt;)&lt;br /&gt;&lt;/span&gt;GO&lt;br /&gt;&lt;span&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;/*    Assumes XML is as such&lt;br /&gt;    &amp;lt;list&amp;gt;&lt;br /&gt;        &amp;lt;i&amp;gt;1&amp;lt;/i&amp;gt;&lt;br /&gt;        &amp;lt;i&amp;gt;23&amp;lt;/i&amp;gt;&lt;br /&gt;    &amp;lt;/list&amp;gt;&lt;br /&gt;    etc...&lt;br /&gt;&lt;br /&gt;    Uses minimal xml markup to keep input size as small as possible &lt;br /&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span&gt;ALTER&lt;/span&gt;
			&lt;span&gt;FUNCTION&lt;/span&gt; dbo&lt;span&gt;.&lt;/span&gt;fnXml2IntList&lt;span&gt;(&lt;/span&gt;@xmlList &lt;span&gt;xml&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;
			&lt;br /&gt;&lt;span&gt;RETURNS&lt;/span&gt;
			&lt;span&gt;TABLE&lt;/span&gt;
			&lt;br /&gt;&lt;span&gt;AS&lt;/span&gt;
			&lt;br /&gt;    &lt;span&gt;RETURN&lt;/span&gt;
			&lt;span&gt;(&lt;/span&gt;&lt;span&gt;SELECT&lt;/span&gt; tList&lt;span&gt;.&lt;/span&gt;ListValue&lt;span&gt;.&lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;'.'&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;
			&lt;span&gt;'int'&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;
			&lt;span&gt;AS&lt;/span&gt; ListValue&lt;br /&gt;            &lt;span&gt;FROM&lt;/span&gt; @xmlList&lt;span&gt;.&lt;/span&gt;nodes&lt;span&gt;(&lt;/span&gt;&lt;span&gt;'list/i'&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;
			&lt;span&gt;AS&lt;/span&gt; tList&lt;span&gt;(&lt;/span&gt;ListValue&lt;span&gt;))&lt;br /&gt;&lt;/span&gt;GO
&lt;/span&gt;&lt;/p&gt;
&lt;br&gt;&lt;hr&gt;&lt;br&gt;Cross-posted from SQLBlog! - &lt;a href="http://www.sqlblog.com"&gt;http://www.sqlblog.com&lt;/a&gt;&lt;br&gt;&lt;hr&gt;&lt;br&gt;&lt;img src="http://www.sqljunkies.com/WebLog/aggbug.aspx?PostID=28159" width="1" height="1"&gt;</content><slash:comments>1</slash:comments></entry></feed>