<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8511988205422549424</id><updated>2011-12-02T22:14:11.202+11:00</updated><category term='Data-Mining'/><category term='ActiveDirectory'/><category term='Dimensions'/><category term='Visual Studio'/><category term='CLR'/><category term='Sharepoint 2007 (MOSS)'/><category term='SQL'/><category term='ETL'/><category term='Certification'/><category term='BIDS'/><category term='TFS'/><category term='Troubleshooting'/><category term='Visual Studio Db Pro (DataDude)'/><category term='Business Intelligence Designer'/><category term='Bug'/><category term='Monitoring and Analysing'/><category term='PerformancePoint'/><category term='ProClarity'/><category term='Visual Studio 2010'/><category term='Analysis Services (SSAS)'/><category term='DDL'/><category term='Microsoft Azure'/><category term='SAP'/><category term='Server Administration'/><category term='MySite'/><category term='Dynamics'/><category term='Data Integration'/><category term='Planning'/><category term='T-SQL'/><category term='Project Gemini'/><category term='Reporting Services (SSRS)'/><category term='SSIS'/><category term='Cubes'/><category term='Business Scorecard Manager (BSM)'/><category term='2008'/><category term='MDX'/><category term='Excel'/><title type='text'>BI-tch</title><subtitle type='html'>Kristen Hodges' real world Business Intelligence experiences... BI is my bitch!</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>61</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-4376983592696425289</id><published>2011-01-12T11:14:00.008+11:00</published><updated>2011-03-14T17:24:18.624+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence Designer'/><category scheme='http://www.blogger.com/atom/ns#' term='MDX'/><category scheme='http://www.blogger.com/atom/ns#' term='BIDS'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='Reporting Services (SSRS)'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><title type='text'>SSRS: Disappearing MDX Queries</title><content type='html'>The Reporting Services bug which removes the MDX you've previously typed into the query designer is not a new one. It has been well documented however for the purposes of clarity, I'll review it here too.&lt;br /&gt;&lt;br /&gt;You have a SQL 2005 report which uses an SSAS data source. Rather than using the MDX designer, you write your own MDX because you need to do more than the weak-arse SSRS MDX designer can do. All works well you save, deploy, close, whatever. Some time later you come back to it to make a change. You open your Visual Studio project and when you click on the dataset the query is no longer there - you are presented with the blank MDX designer pane as if your query never existed.&lt;br /&gt;&lt;br /&gt;It's worth noting that, your query isn't actually gone at this point. Just don't hit SAVE!&lt;br /&gt;If you close the report, right-click it in the Solution and select View Code. Do a search for a &lt;commandtext&gt;&lt;commandtext&gt;tag. You should see your MDX still there.&lt;br /&gt;&lt;br /&gt;The common answer directs you to the knowledge base and a &lt;a href="http://support.microsoft.com/kb/909535"&gt;particular hotfix &lt;/a&gt;which was included in SP1. However, as an SP3 user, I'm currently experiencing the same problem and installing the hotfix solved nothing.&lt;br /&gt;&lt;br /&gt;I believe this knowledge base item is no longer relevant because when I look at my report's code-behind by selecting View Code, there is no &lt;?xml:namespace prefix = rd /&gt;&lt;rd:mdxquery&gt;tag which that hotfix presumes exists.&lt;br /&gt;&lt;br /&gt;Googling the issue has also found suggestions like updating your version of SQL Express to the latest service pack. Well, I don't have SQL Express installed at all so it ain't that.&lt;br /&gt;&lt;br /&gt;I have had the problem before but I couldn't find a reasonable solution then, as now, either. What did I do to fix it before, you ask? The answer is unfortunately quite painful. I reinstalled BIDS.&lt;br /&gt;&lt;br /&gt;Loathe to go through that pain again, I started thinking about what changed since it stopped working this time. Well, loads obviously. But the most obvious change? Installing Visual Studio 2010 Professional.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;rd:mdxquery&gt;So here I am installing &lt;a href="http://www.microsoft.com/downloads/en/confirmation.aspx?FamilyID=11ea69cb-cf12-4842-a3d7-b32a1e5642e2&amp;amp;displaylang=en"&gt;Visual Studio 2010 SP1 Beta&lt;/a&gt;. Yep, beta. That's how desperado I am. &lt;/rd:mdxquery&gt;&lt;/p&gt;&lt;p&gt;&lt;rd:mdxquery&gt;Did it work? I'll tell you as soon as it finishes installing :)&lt;/rd:mdxquery&gt;&lt;/p&gt;&lt;p&gt;&lt;rd:mdxquery&gt;&lt;span style="color:#ff0000;"&gt;UPDATE: Can't remember what the outcome of this was because at some point I uninstalled VS2010 for some unrelated reason. Having just reinstalled it on Friday, I find that the problem is reoccuring. SP1 Beta is installed however obviously there's no fix there either. Have logged &lt;a href="https://connect.microsoft.com/SQLServer/feedback/details/651243/ssrs-2005-sp3-mdx-disappears-from-gui-after-installing-vs2010-side-by-side"&gt;Connect Feedback&lt;/a&gt;.  &lt;/span&gt;&lt;/rd:mdxquery&gt;&lt;/p&gt;&lt;p&gt;&lt;rd:mdxquery&gt;&lt;span style="color:#ff0000;"&gt;&lt;/span&gt;&lt;/rd:mdxquery&gt;&lt;/p&gt;&lt;br /&gt;&lt;/rd:mdxquery&gt;&lt;rd:mdxquery&gt;&lt;/rd:mdxquery&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-4376983592696425289?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/4376983592696425289/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=4376983592696425289' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/4376983592696425289'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/4376983592696425289'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2011/01/ssrs-disappearing-mdx-queries.html' title='SSRS: Disappearing MDX Queries'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-2774201100136028515</id><published>2010-10-14T15:48:00.003+11:00</published><updated>2011-01-12T11:03:25.019+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='T-SQL'/><category scheme='http://www.blogger.com/atom/ns#' term='DDL'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>SQL: Converting Column Datatype from DateTime to Uniqueidentifier</title><content type='html'>Another day for weird annoying things.&lt;br /&gt;&lt;br /&gt;I had a table on which I'd inadvertantly set a columns datatype to datetime when it should have been uniqueidentifier. The table was empty.&lt;br /&gt;&lt;br /&gt;Resetting the datatype via script won't work due as SQL knows it can't implicitly convert the  (nonexistant) data. So I tried using the GUI to change the datatype and I got incompatible operand errors. Tried doing an ALTER TABLE command and got the same error. Finally I tricked the little bugger by converting it to varchar first then to uniqueidentifier. Boom! Done. Sorted.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-2774201100136028515?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/2774201100136028515/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=2774201100136028515' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/2774201100136028515'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/2774201100136028515'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2010/10/sql-converting-column-datatype-from.html' title='SQL: Converting Column Datatype from DateTime to Uniqueidentifier'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-2766243992550745737</id><published>2010-10-14T13:17:00.008+11:00</published><updated>2010-10-14T15:56:22.427+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SSIS'/><category scheme='http://www.blogger.com/atom/ns#' term='ETL'/><category scheme='http://www.blogger.com/atom/ns#' term='T-SQL'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><category scheme='http://www.blogger.com/atom/ns#' term='Dimensions'/><category scheme='http://www.blogger.com/atom/ns#' term='Analysis Services (SSAS)'/><title type='text'>SSIS Doesn't Play Nice with Special Characters</title><content type='html'>Oh SSIS you cantankerous old thing, you! I spent an hour today adding cleansing tasks into several data flows to replace special characters with other values ie "" to "-" and "[" to "(" etc. Only to have the content of those dataflows disappear when I closed then reopened the saved package. When I say disappear, I mean empty. Completely. Devoid of all steps. An empty shell.&lt;br /&gt;&lt;br /&gt;Only dataflows which had the new special character cleansing step were empty - the rest were fine. This placed the blame squarely on the new steps. I should have twigged when I attempted to copy the step from one dataflow to another and got an error - something about HEX values being invalid. Stupid me, blindly continued creating them manually in each dataflow. Once done, I saved and closed. Then when I reopened, those dataflows were completely empty.&lt;br /&gt;&lt;br /&gt;Fortunately being a concientous backer-upper-er-er, I had the previous version stored elsewhere. Sans special character cleansing of course.&lt;br /&gt;&lt;br /&gt;So first, why do I need to do cleansing at all? These characters have passed through SSIS into the staging database with no problems. They have also passed through SSIS into the datamart database with no hiccups. Well the problem comes when I process the dimensions which use the datamart tables as their source. Then I get errors.&lt;br /&gt;&lt;br /&gt;So, for whatever reason, cleansing ahoy! &lt;br /&gt;But SSIS won't do it, as proven by my frustrating waste of an hour.&lt;br /&gt;I tried using them directly in my source query with the same result.  So I created udf_CleanseSpecialCharacters to handle it.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/**********************************************************************************************************************************************&lt;br /&gt;HEADER&lt;br /&gt;/***********************************************************************************************************************************************&lt;br /&gt;FN Name:  dbo.udf_CleanseSpecialCharacters&lt;br /&gt;Author:   Kristen Hodges&lt;br /&gt;Date:     14 October 2010&lt;br /&gt;&lt;br /&gt;-------------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;Purpose:&lt;br /&gt;--------------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;Return a given string, cleansed of special characters&lt;br /&gt;&lt;br /&gt;--------------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;OVERVIEW&lt;br /&gt;--------------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;--------------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;NOTES&lt;br /&gt;--------------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;--------------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;ASSUMPTIONS AND BUSINESS RULES&lt;br /&gt;--------------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;It may be desirable in certain contexts to retain some characters  whereas in others it is not&lt;br /&gt;eg comma stored in table but not as a ssas dimension member unique key&lt;br /&gt;The @iOptional_CharactersToCleanseList is an optional parameter which can be used to pass in a string of characters which should be stripped and&lt;br /&gt;any others will be retained&lt;br /&gt;&lt;br /&gt;The @iStripCharacters is a true/false flag which will strip the characters if true &lt;br /&gt;or if false, the value will be replaced with particular values eg [ becomes -&lt;br /&gt;&lt;br /&gt;--------------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;USAGE&lt;br /&gt;--------------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;Called by:&lt;br /&gt; &lt;br /&gt;Sample USage:&lt;br /&gt; select dbo.udf_CleanseSpecialCharacters('John&amp;kathy@somedomain.com.au',1,0,NULL)&lt;br /&gt; select dbo.udf_CleanseSpecialCharacters('John&amp;kathy@somedomain.com.au',1,1,NULL)&lt;br /&gt; select dbo.udf_CleanseSpecialCharacters('John&amp;kathy@somedomain.com.au',1,1,'&amp;')&lt;br /&gt;&lt;br /&gt;--------------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;CHANGE LOG&lt;br /&gt;--------------------------------------------------------------------------------------------------------------------------------------------&lt;br /&gt;AUTHOR  DATE  CHANGE&lt;br /&gt;KHODGES  2010-10-14 Created&lt;br /&gt;&lt;br /&gt;************************************************************************************************************************************************/&lt;br /&gt;&lt;br /&gt;************************************************************************/&lt;br /&gt;&lt;br /&gt;ALTER FUNCTION [dbo].[udf_CleanseSpecialCharacters](&lt;br /&gt;  @iStringToCleanse varchar(500)&lt;br /&gt; ,@iStripCharacters bit&lt;br /&gt; ,@iStripAllSpaces bit&lt;br /&gt; ,@iOptional_CharactersToCleanseList varchar(50)&lt;br /&gt;)&lt;br /&gt;RETURNS  varchar(500) AS BEGIN&lt;br /&gt;&lt;br /&gt;DECLARE @return varchar(500), @CurrentChar char(1), @CurrentReplacement varchar(10), @posn int&lt;br /&gt;&lt;br /&gt;SET @return = @iStringToCleanse&lt;br /&gt;&lt;br /&gt;set @CurrentChar = CHAR(5)  --  &lt;br /&gt;if @iStripCharacters = 0 set @CurrentReplacement = '' else set @CurrentReplacement = '-'&lt;br /&gt;IF PATINDEX('%'+@CurrentChar+'%',@iOptional_CharactersToCleanseList) &gt;= 1 OR @iOptional_CharactersToCleanseList IS NULL &lt;br /&gt; SET @return = REPLACE(@return,@CurrentChar,@CurrentReplacement)&lt;br /&gt;&lt;br /&gt;set @CurrentChar = CHAR(58) -- :&lt;br /&gt;if @iStripCharacters = 0 set @CurrentReplacement = '' else set @CurrentReplacement = '-'&lt;br /&gt;IF PATINDEX('%'+@CurrentChar+'%',@iOptional_CharactersToCleanseList) &gt;= 1 OR @iOptional_CharactersToCleanseList IS NULL &lt;br /&gt; SET @return = REPLACE(@return,@CurrentChar,@CurrentReplacement)&lt;br /&gt;&lt;br /&gt;set @CurrentChar = CHAR(59) -- ;&lt;br /&gt;if @iStripCharacters = 0 set @CurrentReplacement = '' else set @CurrentReplacement = '-'&lt;br /&gt;IF PATINDEX('%'+@CurrentChar+'%',@iOptional_CharactersToCleanseList) &gt;= 1 OR @iOptional_CharactersToCleanseList IS NULL &lt;br /&gt; SET @return = REPLACE(@return,@CurrentChar,@CurrentReplacement)&lt;br /&gt;&lt;br /&gt;set @CurrentChar = CHAR(91) -- [&lt;br /&gt;if @iStripCharacters = 0 set @CurrentReplacement = '' else set @CurrentReplacement = '-'&lt;br /&gt;IF PATINDEX('%'+@CurrentChar+'%',@iOptional_CharactersToCleanseList) &gt;= 1 OR @iOptional_CharactersToCleanseList IS NULL &lt;br /&gt; SET @return = REPLACE(@return,@CurrentChar,@CurrentReplacement)&lt;br /&gt;&lt;br /&gt;set @CurrentChar = CHAR(93) -- ]&lt;br /&gt;set @CurrentReplacement = ''&lt;br /&gt;IF PATINDEX('%'+@CurrentChar+'%',@iOptional_CharactersToCleanseList) &gt;= 1 OR @iOptional_CharactersToCleanseList IS NULL &lt;br /&gt; SET @return = REPLACE(@return,@CurrentChar,@CurrentReplacement)&lt;br /&gt;&lt;br /&gt;set @CurrentChar = CHAR(37) -- %&lt;br /&gt;set @CurrentReplacement = ''&lt;br /&gt;IF PATINDEX('%'+@CurrentChar+'%',@iOptional_CharactersToCleanseList) &gt;= 1 OR @iOptional_CharactersToCleanseList IS NULL &lt;br /&gt; SET @return = REPLACE(@return,@CurrentChar,@CurrentReplacement)&lt;br /&gt;&lt;br /&gt;set @CurrentChar = CHAR(38) -- &amp; &lt;br /&gt;if @iStripCharacters = 0 set @CurrentReplacement = '' else begin&lt;br /&gt;  set @CurrentReplacement = ' and '&lt;br /&gt;  IF @iStripAllSpaces = 1 set @CurrentReplacement = replace(@CurrentReplacement,' ','-')&lt;br /&gt;end&lt;br /&gt;IF PATINDEX('%'+@CurrentChar+'%',@iOptional_CharactersToCleanseList) &gt;= 1 OR @iOptional_CharactersToCleanseList IS NULL &lt;br /&gt; SET @return = REPLACE(@return,@CurrentChar,@CurrentReplacement)&lt;br /&gt;&lt;br /&gt;set @CurrentChar = CHAR(124)-- |&lt;br /&gt;&lt;br /&gt;if @iStripCharacters = 0 set @CurrentReplacement = '' else set @CurrentReplacement = '-'&lt;br /&gt;IF PATINDEX('%'+@CurrentChar+'%',@iOptional_CharactersToCleanseList) &gt;= 1 OR @iOptional_CharactersToCleanseList IS NULL &lt;br /&gt; SET @return = REPLACE(@return,@CurrentChar,@CurrentReplacement)&lt;br /&gt;&lt;br /&gt;set @CurrentChar = CHAR(44) -- ,&lt;br /&gt;if @iStripCharacters = 0 set @CurrentReplacement = '' else set @CurrentReplacement = SPACE(1)&lt;br /&gt;IF PATINDEX('%'+@CurrentChar+'%',@iOptional_CharactersToCleanseList) &gt;= 1 OR @iOptional_CharactersToCleanseList IS NULL &lt;br /&gt; SET @return = REPLACE(@return,@CurrentChar,@CurrentReplacement)&lt;br /&gt;&lt;br /&gt;set @CurrentChar = CHAR(36) -- $&lt;br /&gt;set @CurrentReplacement = ''&lt;br /&gt;IF PATINDEX('%'+@CurrentChar+'%',@iOptional_CharactersToCleanseList) &gt;= 1 OR @iOptional_CharactersToCleanseList IS NULL &lt;br /&gt; SET @return = REPLACE(@return,@CurrentChar,@CurrentReplacement)&lt;br /&gt;&lt;br /&gt;set @CurrentChar = CHAR(35) -- #&lt;br /&gt;if @iStripCharacters = 0 set @CurrentReplacement = '' else set @CurrentReplacement = 'No.'&lt;br /&gt;IF PATINDEX('%'+@CurrentChar+'%',@iOptional_CharactersToCleanseList) &gt;= 1 OR @iOptional_CharactersToCleanseList IS NULL &lt;br /&gt; SET @return = REPLACE(@return,@CurrentChar,@CurrentReplacement)&lt;br /&gt;&lt;br /&gt;set @CurrentChar = CHAR(35) -- #&lt;br /&gt;if @iStripCharacters = 0 set @CurrentReplacement = '' else set @CurrentReplacement = 'No.'&lt;br /&gt;IF PATINDEX('%'+@CurrentChar+'%',@iOptional_CharactersToCleanseList) &gt;= 1 OR @iOptional_CharactersToCleanseList IS NULL &lt;br /&gt; SET @return = REPLACE(@return,@CurrentChar,@CurrentReplacement)&lt;br /&gt;&lt;br /&gt;set @CurrentChar = CHAR(64) -- @&lt;br /&gt;if @iStripCharacters = 0 set @CurrentReplacement = '' else begin&lt;br /&gt;  set @CurrentReplacement = ' at '&lt;br /&gt;  IF @iStripAllSpaces = 1 set @CurrentReplacement = replace(@CurrentReplacement,' ','-')&lt;br /&gt;end&lt;br /&gt;IF PATINDEX('%'+@CurrentChar+'%',@iOptional_CharactersToCleanseList) &gt;= 1 OR @iOptional_CharactersToCleanseList IS NULL &lt;br /&gt; SET @return = REPLACE(@return,@CurrentChar,@CurrentReplacement)&lt;br /&gt;&lt;br /&gt;set @CurrentChar = CHAR(46) -- .&lt;br /&gt;if @iStripCharacters = 0 set @CurrentReplacement = '' else begin&lt;br /&gt;  set @CurrentReplacement = ' dot '&lt;br /&gt;  IF @iStripAllSpaces = 1 set @CurrentReplacement = replace(@CurrentReplacement,' ','-')&lt;br /&gt;end&lt;br /&gt;IF PATINDEX('%'+@CurrentChar+'%',@iOptional_CharactersToCleanseList) &gt;= 1 OR @iOptional_CharactersToCleanseList IS NULL &lt;br /&gt; SET @return = REPLACE(@return,@CurrentChar,@CurrentReplacement)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;IF @iStripAllSpaces = 1 SET @return = REPLACE(@return,' ','')&lt;br /&gt;&lt;br /&gt;RETURN @return&lt;br /&gt;END&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-2766243992550745737?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/2766243992550745737/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=2766243992550745737' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/2766243992550745737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/2766243992550745737'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2010/10/ssis-doesnt-play-nice-with-special.html' title='SSIS Doesn&apos;t Play Nice with Special Characters'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-7945124313205553732</id><published>2010-07-22T14:28:00.016+10:00</published><updated>2010-07-22T16:00:11.593+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MDX'/><category scheme='http://www.blogger.com/atom/ns#' term='Analysis Services (SSAS)'/><title type='text'>MDX: Calculated Measure:  Opening &amp; Closing Balance</title><content type='html'>The scenario is this:&lt;br /&gt;&lt;br /&gt;Opening Balance =&lt;br /&gt;&lt;ul&gt;&lt;li&gt;my previous closing balance&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Closing Balance = &lt;/p&gt;&lt;ul&gt;&lt;li&gt;Opening Balance &lt;/li&gt;&lt;li&gt;plus new widgets received today&lt;/li&gt;&lt;li&gt;less widgets completed today&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Note how I said that my opening balance equals my previous closing balance? In practical terms, that means:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;count of all new widgets received up to today&lt;/li&gt;&lt;li&gt;less the count of all widgets completed up to today&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_VZHMsOn3uQo/TEfZgKl3csI/AAAAAAAAAJA/7YLzvA-JMh4/s1600/opening+and+closing+balance.JPG"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 800px; DISPLAY: block; HEIGHT: 58px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5496601016851198658" border="0" alt="" src="http://1.bp.blogspot.com/_VZHMsOn3uQo/TEfZgKl3csI/AAAAAAAAAJA/7YLzvA-JMh4/s800/opening+and+closing+balance.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;In my case a widget refers to a "request", aka an application from a customer for a new credit card. I want to measure how many requests were worked on by my staff during a period of time. That "period of time" gets passed in from a report parameter or query and should always use the 'ReceivedDate' as it's point of reference because we don't want our Opening Balances changing over time (duh!).&lt;/p&gt;&lt;p&gt;My fact table contains a Received Date, a Completed Date and an ItemCount column (there are more but that's all I need for my calculated members). We have an ItemCount column because one request can be for multiple cards. If there's only one card in the request, it contains "1".&lt;br /&gt;&lt;/p&gt;&lt;p&gt;There are a multitude of ways to achieve this and here is just one...&lt;br /&gt;&lt;/p&gt;&lt;p&gt;First I want to count how many requests were completed in the period. I know what my Received Date member is because the report gives it to me... but how do I know which member of the Completed Date dimension to use? Obviously there is only one physical Date dimension but my cube refers to it multiple times - two of which are Received Date and Completed Date.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;I have a problem in that my completed date and my received date are in two different dimensions in my cube so I can't just use any of the MDX relative functions such as ancestor/cousin, sibling, parallelperiod because they aren't relatives at all! What they do have in common though is they share the same member key. &lt;/p&gt;&lt;p&gt;I know the member key from the Received Date so I can use that to find my Completed Date member.  But wait, I have multiple levels in my hierarchy; so I need to consider that too.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="color:#3333ff;"&gt;CREATE MEMBER CURRENTCUBE&lt;/span&gt;.[MEASURES].CompletedInPeriod &lt;span style="color:#3333ff;"&gt;AS &lt;/span&gt;&lt;/p&gt;&lt;p&gt;(STRTOMEMBER("[CompletedDate].[Fiscal-Year-Month-Day].[" + [ReceivedDate].[Fiscal-Year-Month-Day].&lt;span style="color:#ff0000;"&gt;CurrentMember.&lt;/span&gt;&lt;span style="color:#3333ff;"&gt;Level.Name&lt;/span&gt; + "].&amp;amp;[" + [ReceivedDate].[Fiscal-Year-Month-Day].&lt;span style="color:#ff0000;"&gt;CurrentMember&lt;/span&gt;.&lt;span style="color:#3333ff;"&gt;Member_Key&lt;/span&gt; + "]")&lt;br /&gt;,Measures.ItemCount),&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;VISIBLE&lt;/span&gt; = 1 ; &lt;/p&gt;&lt;p&gt;The above code shows a simple way to get the answer. Manufacture a string to get the completed date based on the received date and then get the item count for that completed date. It may not be elegant, but it works!&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Now I want to get my opening balance. Easy. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="color:#3333ff;"&gt;CREATE MEMBER CURRENTCUBE&lt;/span&gt;.[MEASURES].OpeningBalance &lt;span style="color:#3333ff;"&gt;AS &lt;/span&gt;&lt;/p&gt;&lt;p&gt;IIF([ReceivedDate].[Fiscal-Year-Month-Day&lt;span style="color:#ff0000;"&gt;&lt;span style="color:#000000;"&gt;].&lt;/span&gt;CurrentMember.FirstSibling&lt;/span&gt; IS [ReceivedDate].[Fiscal-Year-Month-Day].&lt;span style="color:#ff0000;"&gt;CurrentMember&lt;/span&gt;&lt;br /&gt;,([ReceivedDate].[Fiscal-Year-Month-Day].&lt;span style="color:#ff0000;"&gt;CurrentMember.Parent&lt;/span&gt;, Measures.OpeningBalance)&lt;br /&gt;,([ReceivedDate].[Fiscal-Year-Month-Day].&lt;span style="color:#ff0000;"&gt;CurrentMember.PrevMember&lt;/span&gt;, Measures.ClosingBalance)&lt;br /&gt;),&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;VISIBLE&lt;/span&gt;=1;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;What this says is, if the current member is equal to the first member (at this level) then get the Opening Balance of my parent. Otherwise get the closing balance of the previous member.  In practice that means, if I ask for June 1st, 2010 (the first day of the fiscal year) get the Opening Balance for June 2010. If I ask for June 2010 (the first month of the fiscal year) get the Opening Balance for 2010. If I ask for June 12th, 2010 then get me the Closing Balance for June 11th. If I ask for July 2010, then get me the Closing Balance for June 2010.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;And yes, it's recursive ie it's constantly looping back on itself. Don't be scared. SSAS is pretty ok with it so you should be too!&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Notice how the last portion refers to the Closing Balance of the previous member? Well I guess that means we need a Closing Balance calculation too!   This ones' easy! Remember that the calculation is opening balance + new - completed. And if you think about that a bit you'll see that the opening balance is equal to the previous closing balance. So...&lt;br /&gt;&lt;/p&gt;&lt;span style="color:#3333ff;"&gt;CREATE MEMBER CURRENTCUBE&lt;/span&gt;.[MEASURES].ClosingBalance &lt;span style="color:#3333ff;"&gt;AS&lt;br /&gt;&lt;/span&gt;([ReceivedDate].[Fiscal-Year-Month-Day].&lt;span style="color:#ff0000;"&gt;PrevMember&lt;/span&gt;,Measures.ClosingBalance)&lt;br /&gt;+ ([ReceivedDate].[Fiscal-Year-Month-Day].&lt;span style="color:#ff0000;"&gt;CurrentMember&lt;/span&gt;,Measures.ItemCount)&lt;br /&gt;- Measures.CompletedInPeriod,&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;VISIBLE&lt;/span&gt; = 1 ;&lt;br /&gt;&lt;br /&gt;It says, that the Closing Balance equals the Closing Balance of the previous member plus the ItemCount for this period less the ItemCount completed during this period (remember our first calculated member was "CompletedInPeriod".   For example, If I ask for the closing balance for June 12th 2010, it will get the Closing Balance for June 11th 2010 ie my opening balance, then add the ItemCount for June 12 and minus the ItemCount completed on June 12.&lt;br /&gt;&lt;br /&gt;And that's it. Process the cube and away you go.&lt;br /&gt;&lt;br /&gt;Next up, I'm going to use this same calculated measure on different hierarchies in the date dimension. For example, I have a Fiscal-Year-Month-Day, a Fiscal-Year-Month, a Calendar-Year-Month-Day and a Calendar-Year-Month... and many more when you look at Quarters, weeks and semesters! But that's for another day...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-7945124313205553732?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/7945124313205553732/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=7945124313205553732' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/7945124313205553732'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/7945124313205553732'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2010/07/mdx-calculated-measure-opening-closing.html' title='MDX: Calculated Measure:  Opening &amp; Closing Balance'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_VZHMsOn3uQo/TEfZgKl3csI/AAAAAAAAAJA/7YLzvA-JMh4/s72-c/opening+and+closing+balance.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-7403219046625483365</id><published>2010-05-20T15:13:00.010+10:00</published><updated>2010-05-24T09:10:20.196+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>Visual Studio 2010 Trial: SQL Project Limitation: Refactor/Rename</title><content type='html'>&lt;p&gt;Please, somebody correct me if I'm wrong...&lt;/p&gt;&lt;p&gt;&lt;span style="color:#ff0000;"&gt;** UPDATED **&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#ff0000;"&gt;Yep I'm an idiot.  Somehow I installed Professional edition not Ultimate.  And professional does not support schema compare or refactoring. Duh!&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The Visual Studio 2010 trial claims to be functionally unlimited - just time-limited (90 days). BUT - from what I can tell, object name refactoring (renaming) is unavailable.&lt;/p&gt;According to MSDN it can be done by "right-click the object in Schema view, point to Refactor, and then click Rename'.... or from the Data menu, point to Refactor etc...&lt;br /&gt;&lt;p&gt;&lt;a href="http://2.bp.blogspot.com/_VZHMsOn3uQo/S_THrMDLy_I/AAAAAAAAAIQ/81KxO2dFn1s/s1600/reqs.JPG"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 518px; DISPLAY: block; HEIGHT: 256px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5473218991944879090" border="0" alt="" src="http://2.bp.blogspot.com/_VZHMsOn3uQo/S_THrMDLy_I/AAAAAAAAAIQ/81KxO2dFn1s/s400/reqs.JPG" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;However, there is no Refactor option in either location. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://1.bp.blogspot.com/_VZHMsOn3uQo/S_TLjxrnbHI/AAAAAAAAAIo/fi6rfgzvypM/s1600/scehmaview.jpg"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 332px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5473223262654131314" border="0" alt="" src="http://1.bp.blogspot.com/_VZHMsOn3uQo/S_TLjxrnbHI/AAAAAAAAAIo/fi6rfgzvypM/s400/scehmaview.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href="http://4.bp.blogspot.com/_VZHMsOn3uQo/S_TL60EqrhI/AAAAAAAAAI4/opKY6TrkIdc/s1600/menu.jpg"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 158px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5473223658433064466" border="0" alt="" src="http://4.bp.blogspot.com/_VZHMsOn3uQo/S_TL60EqrhI/AAAAAAAAAI4/opKY6TrkIdc/s400/menu.jpg" /&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/_VZHMsOn3uQo/S_TL1nAtGFI/AAAAAAAAAIw/ZHd5xgntpeU/s1600/scehmaview.jpg"&gt;&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;MSDN does state that if there are build errors, the menu option is not available. I double-check that, and build successfully it did. &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;a href="http://1.bp.blogspot.com/_VZHMsOn3uQo/S_TIvP9iX9I/AAAAAAAAAIY/6L5YJ5spgmA/s1600/build.JPG"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 400px; DISPLAY: block; HEIGHT: 137px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5473220161226039250" border="0" alt="" src="http://1.bp.blogspot.com/_VZHMsOn3uQo/S_TIvP9iX9I/AAAAAAAAAIY/6L5YJ5spgmA/s400/build.JPG" /&gt;&lt;/a&gt; Stumped!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-7403219046625483365?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/7403219046625483365/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=7403219046625483365' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/7403219046625483365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/7403219046625483365'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2010/05/visual-studio-2010-trial-sql-project.html' title='Visual Studio 2010 Trial: SQL Project Limitation: Refactor/Rename'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_VZHMsOn3uQo/S_THrMDLy_I/AAAAAAAAAIQ/81KxO2dFn1s/s72-c/reqs.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-8587521666517725700</id><published>2010-04-27T11:29:00.007+10:00</published><updated>2010-04-27T11:56:30.369+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><category scheme='http://www.blogger.com/atom/ns#' term='CLR'/><title type='text'>Visual Studio 2010:  Enabling Older DotNet Frameworks (or how I learnt to love multi-targeting)</title><content type='html'>&lt;div&gt;I've been told that SQL 2005 doesn't support CLR functions created with DotNet Framework 4.0 - I haven't tested it cos When attempting to create a new SQL 2005 CLR project using Visual Studio 2010, I found myself at a loss to work out how to create a .NET Framework 3.0 project ie using the new and improved multi-targeting feature.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The only option available to me in the  'New Project' dialog box was a 4.0 Framework.  Plus a handy 'More Frameworks" option which took me to the download page for various dotnet frameworks.   I already had 3.0, 2.0 and 1.1 installed on the machine so the need to redownload and reinstall them seemed irritatingly redundant.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_VZHMsOn3uQo/S9ZALosSpHI/AAAAAAAAAH4/96hKoGrU_68/s1600/VS2010_DotNetFramework.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 221px;" src="http://1.bp.blogspot.com/_VZHMsOn3uQo/S9ZALosSpHI/AAAAAAAAAH4/96hKoGrU_68/s320/VS2010_DotNetFramework.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5464625766506603634" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So after much googling, I found the solution. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You have to install &lt;a href="http://msdn.microsoft.com/en-us/netframework/cc378097.aspx"&gt;.NET Framework 3.5&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ummm... that's it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Close VS, install 3.5 framework, open VS and wacko!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Contrary to the installer instructions, I did not have to reboot.&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_VZHMsOn3uQo/S9ZDv7i7mjI/AAAAAAAAAIA/N3Bm4pa2DVI/s1600/VS2010_DotNetFrameworkAll.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 221px;" src="http://3.bp.blogspot.com/_VZHMsOn3uQo/S9ZDv7i7mjI/AAAAAAAAAIA/N3Bm4pa2DVI/s320/VS2010_DotNetFrameworkAll.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5464629688577792562" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-8587521666517725700?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/8587521666517725700/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=8587521666517725700' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/8587521666517725700'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/8587521666517725700'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2010/04/visual-studio-2010-enabling-older.html' title='Visual Studio 2010:  Enabling Older DotNet Frameworks (or how I learnt to love multi-targeting)'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_VZHMsOn3uQo/S9ZALosSpHI/AAAAAAAAAH4/96hKoGrU_68/s72-c/VS2010_DotNetFramework.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-4951638888117183549</id><published>2010-01-15T15:26:00.005+11:00</published><updated>2010-01-15T15:50:15.074+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cubes'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><category scheme='http://www.blogger.com/atom/ns#' term='Analysis Services (SSAS)'/><title type='text'>SSAS: Vague Processing Errors About Connection Strings Are Not My Friend</title><content type='html'>Oh Visual Studio, you crazy cat, you! I've just spent the past hour or so going stark raving mad. courtesy of a DBA who's less than 'expert' and a teeny little Visual Studio property I neglected to set properly.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;When deploying my Analysis Services database, the processing kept failing with a vague error along the lines of "connection string is invalid" and "login timeout". Now, I know there's nothing wrong with the connection string cos it works fine in VS, right? Wrong!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;When deploying a cube to the Integration environment, my DBA told me that I couldn't just deploy it (outrageous suggestion), no I had to give them the project, they would deploy it, then I had to reimport it from the new environment into Visual Studio. WTF? Ok, I'll play. I'm new here after all so who am I to question their processes?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So when I later needed to redeploy some changes I'd since made, the DBA told me I had to do the same again. At this juncture, I put up a big red stop sign and start asking some questions. Turns out they do that so the Impersonation works correctly. Why wasn't it working as expected is the real question they neglected to ask and solve. Instead of fixing the problem, the treated a short-term workaround as the solution, and stopped there, purely because they didn't know any better.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Having rarely used impersonation before I didn't have an immediate answer. I've always just use the service account as my credentials because I'm lazy and frankly I can't really see why, on a DEV box mind you, you'd bother? Whatever, I don't care so much, if that's how they want to do it I'm easy.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So the problem is that after redeploying the project, it wouldn't reprocess. As I mentioned earlier, I was getting these vague errors about logins and connections. Turns out the solution was really freakin' simple.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://4.bp.blogspot.com/_VZHMsOn3uQo/S0_y6CYKeUI/AAAAAAAAAHs/xe6-ypOGcXs/s1600-h/properties.bmp"&gt;&lt;img id="BLOGGER_PHOTO_ID_5426823154889292098" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 415px; CURSOR: hand; HEIGHT: 255px; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_VZHMsOn3uQo/S0_y6CYKeUI/AAAAAAAAAHs/xe6-ypOGcXs/s320/properties.bmp" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;See that little "Remove Passwords" property?  Yeah that's the sucker.  That cheeky tyke was set to TRUE.  Set it to false and whaddya know?  Everything works a treat.&lt;/p&gt;&lt;p&gt;Aaaah... Friday 4pm... and time for a brewskie.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-4951638888117183549?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/4951638888117183549/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=4951638888117183549' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/4951638888117183549'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/4951638888117183549'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2010/01/ssas-vague-processing-errors-about.html' title='SSAS: Vague Processing Errors About Connection Strings Are Not My Friend'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_VZHMsOn3uQo/S0_y6CYKeUI/AAAAAAAAAHs/xe6-ypOGcXs/s72-c/properties.bmp' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-5409440193641154625</id><published>2009-10-12T15:58:00.006+11:00</published><updated>2009-10-12T16:49:06.626+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='T-SQL'/><category scheme='http://www.blogger.com/atom/ns#' term='DDL'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>TSQL: Programmatically Create DDL scripts for Foreign Keys</title><content type='html'>I'll admit it, I'm lazy... I hate typing exercises. I don't need the practice and I'm sure the person paying my somewhat exhorbitant fee doesn't want to fork out for something so mundane either. That means I'm always on the hunt for a &lt;strike&gt;shortcut or two&lt;/strike&gt;, I mean, process improvement.&lt;br /&gt;&lt;br /&gt;These two snippets will generate the DDL to create all the foreign keys in the database.&lt;br /&gt;The first will check if it exists first, the second drops it first. Use whichever suits.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;SELECT 'IF NOT EXISTS (SELECT * FROM sys.FOREIGN_KEYS WHERE name = ''' + fk.Name + ''' AND Parent_Object_Id = object_id(''['+ s.name + '].[' + t.name + ']'')) BEGIN '&lt;br /&gt;+ char(13) + char(9) + 'ALTER TABLE ' + s.name + '.' + t.name + ' WITH CHECK '&lt;br /&gt;+ char(13) + char(9) + 'ADD CONSTRAINT ['+fk.Name +'] '&lt;br /&gt;+ char(13) + char(9) + 'FOREIGN KEY(['+c.name+']) REFERENCES [' + fks.name + '].['+fkt.name+'] (['+fkc.name+']) '&lt;br /&gt;+ char(13) + 'END'&lt;br /&gt;from sys.foreign_keys fk&lt;br /&gt;inner join sys.foreign_key_columns fkcm on fkcm.constraint_object_id = fk.object_id&lt;br /&gt;inner join sys.tables t on t.object_id = fkcm.Parent_Object_Id&lt;br /&gt;inner join sys.tables fkt on fkt.object_id = fkcm.Referenced_Object_Id&lt;br /&gt;inner join sys.columns c on c.object_id = t.object_id and c.column_id = fkcm.parent_column_id&lt;br /&gt;inner join sys.columns fkc on fkc.object_id = fkt.object_id and fkc.column_id = fkcm.referenced_column_id&lt;br /&gt;inner join sys.schemas s on s.schema_id = t.schema_id&lt;br /&gt;inner join sys.schemas fks on fks.schema_id = fkt.schema_id&lt;br /&gt;ORDER BY 1&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;And the second one (ie does a drop first)...&lt;br /&gt;&lt;br /&gt;&lt;em&gt;SELECT DISTINCT 'IF EXISTS (SELECT * FROM sys.FOREIGN_KEYS WHERE name = ''' + fk.Name + ''' AND Parent_Object_Id = object_id(''['+ s.name + '].[' + t.name + ']'')) BEGIN '&lt;br /&gt;+ char(13) + char(9) + 'ALTER TABLE ' + s.name + '.' + t.Name + ' DROP CONSTRAINT ' + fk.Name&lt;br /&gt;+ char(13) + 'END'&lt;br /&gt;+ char(13) + 'ALTER TABLE ' + s.name + '.' + t.name&lt;br /&gt;+ char(13) + char(9) + 'WITH CHECK ADD CONSTRAINT ['+fk.Name +'] '&lt;br /&gt;+ char(13) + char(9) + 'FOREIGN KEY(['+c.name+']) REFERENCES [' + fks.name + '].['+fkt.name+'] (['+fkc.name+']) '&lt;br /&gt;+ char(13)&lt;br /&gt;from sys.foreign_keys fk&lt;br /&gt;inner join sys.foreign_key_columns fkcm on fkcm.constraint_object_id = fk.object_id&lt;br /&gt;inner join sys.tables t on t.object_id = fkcm.Parent_Object_Id&lt;br /&gt;inner join sys.tables fkt on fkt.object_id = fkcm.Referenced_Object_Id&lt;br /&gt;inner join sys.columns c on c.object_id = t.object_id and c.column_id = fkcm.parent_column_id&lt;br /&gt;inner join sys.columns fkc on fkc.object_id = fkt.object_id and fkc.column_id = fkcm.referenced_column_id&lt;br /&gt;inner join sys.schemas s on s.schema_id = t.schema_id&lt;br /&gt;inner join sys.schemas fks on fks.schema_id = fkt.schema_id&lt;br /&gt;ORDER BY 1&lt;br /&gt;&lt;/em&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-5409440193641154625?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/5409440193641154625/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=5409440193641154625' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/5409440193641154625'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/5409440193641154625'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2009/10/tsql-programmatically-create-ddl.html' title='TSQL: Programmatically Create DDL scripts for Foreign Keys'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-5325614089614912080</id><published>2009-10-12T10:33:00.004+11:00</published><updated>2009-10-12T10:39:03.153+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SSIS'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>Integration Services Gotcha #6631984:  The Table Variable Data Flow Affair</title><content type='html'>I encountered a teeny little SSIS glitch today that completely did my head in for a good 30 minutes.  Ok, I'll admit it, more like an hour.&lt;br /&gt;&lt;br /&gt;In my data flow, I had an OLEDB Source which declared and populated a table variable then returned some data, which included a join on my table variable.&lt;br /&gt;&lt;br /&gt;The source query worked perfectly, returning plenty of data when tested through SSMS.  As soon as I ran the data flow, it would be successful but zero data.&lt;br /&gt;&lt;br /&gt;That freakin' table variable was messin' with me.  Took it out, replaced it with a subquery and whammo!  Data.&lt;br /&gt;&lt;br /&gt;Oh SSIS, you pernickety old man, you!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-5325614089614912080?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/5325614089614912080/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=5325614089614912080' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/5325614089614912080'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/5325614089614912080'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2009/10/integration-services-gotcha-6631984.html' title='Integration Services Gotcha #6631984:  The Table Variable Data Flow Affair'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-4591450955523282029</id><published>2009-07-20T08:51:00.014+10:00</published><updated>2009-07-20T10:12:14.460+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='T-SQL'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><category scheme='http://www.blogger.com/atom/ns#' term='2008'/><title type='text'>SQL 2008:  Using MERGE to do a Type 2 Change</title><content type='html'>I'm going to do a brief overview of the SQL 2008 MERGE statement.  Primarily for my own purposes - being to document the usage for type 2 changes so I don't forget it.&lt;br /&gt;&lt;br /&gt;First let's begin with the basic type 1 usage.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_VZHMsOn3uQo/SmOyQ6CRltI/AAAAAAAAAG8/NjTLaZjJ-Tw/s1600-h/type1.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 600px;" src="http://2.bp.blogspot.com/_VZHMsOn3uQo/SmOyQ6CRltI/AAAAAAAAAG8/NjTLaZjJ-Tw/s800/type1.jpg" alt="" id="BLOGGER_PHOTO_ID_5360323985027471058" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;All fairly self-explanatory.  We have a source and a target.  We join the two tables, identify new records, changed records and deleted records.  And deal with them appropriately.&lt;br /&gt;&lt;br /&gt;So let's move onto the type 2 changes.  Here we need to:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Insert New Records&lt;/li&gt;&lt;li&gt;Disable changed records&lt;/li&gt;&lt;li&gt;Add a new record for the changed records&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;That's 2 inserts and an update.  The MERGE won't allow that so we have to nest our merge inside an insert.  Luckily this works because MERGE allows output!&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_VZHMsOn3uQo/SmOzUL7VFPI/AAAAAAAAAHE/tDiCPgpcvzo/s1600-h/type2.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 800px;" src="http://3.bp.blogspot.com/_VZHMsOn3uQo/SmOzUL7VFPI/AAAAAAAAAHE/tDiCPgpcvzo/s800/type2.jpg" alt="" id="BLOGGER_PHOTO_ID_5360325140881413362" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;Ignore the outer INSERT for the moment.  We have a MERGE statement which is very similar to our type 1 MERGE.  Compare the Source and Target, INSERT new records as required.  The difference being that when the matched record contains a change, instead of updating the changed field, we set the CurrentFlag and the EndDate so as to disable the record.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_VZHMsOn3uQo/SmOvzUWdH5I/AAAAAAAAAGk/kg3Nm4S05HM/s1600-h/merge.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 800px;" src="http://4.bp.blogspot.com/_VZHMsOn3uQo/SmOvzUWdH5I/AAAAAAAAAGk/kg3Nm4S05HM/s800/merge.jpg" alt="" id="BLOGGER_PHOTO_ID_5360321277672103826" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;Of course that means we still don't have a record which contains our updated values. So, now lets turn our attention to the OUTPUT clause.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;This will be familiar to anyone who used it in SQL 2005 in much the same context - to identify rows which have been modified/added/deleted.  Really the origin of MERGE seems to be strongly rooted in the SQL 2005 OUTPUT clause. On the upside, unlike the SQL 2005 version and UPDATE is an UPDATE and not a DELETE and an INSERT.  Small but handy!  Anyway, where were we?  Let's return the columns we need to create a new record and a special $Action column - this tells us what actually happened ie UPDATE, INSERT or DELETE.  We need this because the OUTPUT will return everything that occured in the MERGE.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_VZHMsOn3uQo/SmOwQDag_aI/AAAAAAAAAGs/WQS1FYVs7JI/s1600-h/output.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 371px; height: 106px;" src="http://2.bp.blogspot.com/_VZHMsOn3uQo/SmOwQDag_aI/AAAAAAAAAGs/WQS1FYVs7JI/s800/output.jpg" alt="" id="BLOGGER_PHOTO_ID_5360321771341938082" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Now we have a set of rows that have been actioned by the MERGE.  Still, we haven't actually done anything with them.&lt;br /&gt;&lt;br /&gt;To do that, we enclose the entire MERGE statement, including it's OUTPUT clause of course, into brackets so we can make it the FROM clause for an INSERT.  Our OUTPUT clause is return the columns we need for the INSERT remember?  So now we just add our INSERT INTO at the front, add an alias to the closed bracket of the FROM clause AND, drumroll... whack a WHERE clause on the end.  This where clause just filters the OUTPUT from the MERGE so we only insert new records for those that were updated, ignoring those that may have been inserted etc in the MERGE.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_VZHMsOn3uQo/SmOwb5S5XdI/AAAAAAAAAG0/jr_J_Myd0uw/s1600-h/WHERE.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 247px; height: 24px;" src="http://2.bp.blogspot.com/_VZHMsOn3uQo/SmOwb5S5XdI/AAAAAAAAAG0/jr_J_Myd0uw/s400/WHERE.jpg" alt="" id="BLOGGER_PHOTO_ID_5360321974784056786" border="0" /&gt;&lt;/a&gt;Easy!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-------------------------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;For the purposes of copy/paste-ability, here is a text version of the TSQL.  Images have been used above for improved readability.&lt;br /&gt;&lt;br /&gt;--A simple type 1 change&lt;br /&gt;MERGE INTO DimCustomer c&lt;br /&gt;USING StageCustomer stg ON c.CustomerId = stg.CustomerId&lt;br /&gt;WHEN NOT MATCHED BY TARGET THEN     --ie new&lt;br /&gt;   INSERT (CustomerId,CustomerName,IsActive) VALUES (&lt;br /&gt;       stg.CustomerId&lt;br /&gt;      ,stg.CustomerName&lt;br /&gt;      ,stg.IsActive&lt;br /&gt;      )&lt;br /&gt;WHEN MATCHED AND c.CustomerName &lt;&gt; stg.CustomerName THEN --ie changed&lt;br /&gt;   UPDATE SET   c.CustomerName = stg.CustomerName&lt;br /&gt;WHEN NOT MATCHED BY SOURCE THEN    --ie deleted&lt;br /&gt;   DELETE&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;--a type 2 change&lt;br /&gt;INSERT INTO dbo.DimCustomer&lt;br /&gt;SELECT CustomerId,  CustomerName, IsActive, IsCurrent, Eff_Date, End_Date&lt;br /&gt;FROM&lt;br /&gt;(    MERGE DimCustomer c&lt;br /&gt;USING StageCustomer stg ON c.CustomerId = stg.CustomerId&lt;br /&gt;WHEN NOT MATCHED THEN INSERT VALUES (&lt;br /&gt;   stg.CustomerId&lt;br /&gt;  ,stg.CustomerName&lt;br /&gt;  ,stg.IsActive&lt;br /&gt;  ,1                    --&gt; IsCurrent&lt;br /&gt;  ,GETDATE()            --&gt; Eff_Date&lt;br /&gt;  ,NULL                --&gt; End_Date&lt;br /&gt;  )&lt;br /&gt;WHEN MATCHED AND c.IsCurrent = 1 AND (c.CustomerName &lt;&gt; stg.CustomerName) THEN UPDATE SET&lt;br /&gt;        c.IsCurrent = 0&lt;br /&gt;       ,c.End_date = GETDATE()&lt;br /&gt;OUTPUT    $Action                as RowAction&lt;br /&gt;       ,stg.CustomerId&lt;br /&gt;       ,stg.CustomerName&lt;br /&gt;       ,1                    AS IsCurrent&lt;br /&gt;       ,GETDATE()            as Eff_Date&lt;br /&gt;       ,NULL                as End_Date&lt;br /&gt;) m&lt;br /&gt;WHERE m.RowAction = 'UPDATE'&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-4591450955523282029?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/4591450955523282029/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=4591450955523282029' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/4591450955523282029'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/4591450955523282029'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2009/07/im-going-to-do-brief-overview-of-sql.html' title='SQL 2008:  Using MERGE to do a Type 2 Change'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_VZHMsOn3uQo/SmOyQ6CRltI/AAAAAAAAAG8/NjTLaZjJ-Tw/s72-c/type1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-2880479441674355734</id><published>2009-07-17T10:47:00.000+10:00</published><updated>2009-07-17T10:49:10.730+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Monitoring and Analysing'/><category scheme='http://www.blogger.com/atom/ns#' term='PerformancePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='Sharepoint 2007 (MOSS)'/><title type='text'>SharePoint Magazine - Part 4 available now</title><content type='html'>&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; font-size: 13px; "&gt;My next article for SharePoint Magazine is available now.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt; &lt;a href="http://sharepointmagazine.net/technical/administration/dissecting-dashboards-part-4-of-6"&gt;Dissecting Dashboards (Part 4 of 6)&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-2880479441674355734?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/2880479441674355734/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=2880479441674355734' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/2880479441674355734'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/2880479441674355734'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2009/07/sharepoint-magazine-part-4-available.html' title='SharePoint Magazine - Part 4 available now'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-4176564299072634181</id><published>2009-06-18T12:15:00.000+10:00</published><updated>2009-06-18T12:16:24.149+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sharepoint 2007 (MOSS)'/><title type='text'>Sharepoint Saturday</title><content type='html'>&lt;div&gt;Register now for Sharepoint Saturday in Sydney on August 8th.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;http://www.sharepointsaturday.org/sydney/default.aspx&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-4176564299072634181?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/4176564299072634181/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=4176564299072634181' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/4176564299072634181'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/4176564299072634181'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2009/06/sharepoint-saturday.html' title='Sharepoint Saturday'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-3321714138396758915</id><published>2009-06-18T10:19:00.003+10:00</published><updated>2009-06-18T10:26:42.239+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Dynamics'/><category scheme='http://www.blogger.com/atom/ns#' term='Planning'/><category scheme='http://www.blogger.com/atom/ns#' term='PerformancePoint'/><title type='text'>Can Dynamics CPM pick up where PerformancePoint left off?</title><content type='html'>Can &lt;a href="https://blogs.msdn.com/dynamicscpm/default.aspx"&gt;Dynamics CPM&lt;/a&gt; pick up where PerformancePoint left off?  And how does all of this fit in with SSRS Report Builder and &lt;a href="http://blogs.msdn.com/sqlcat/archive/2008/10/06/project-gemini-building-models-and-analysing-data-from-excel.aspx"&gt;Project Gemini&lt;/a&gt;, a key part of Microsoft's self-service BI drive?  When you say things like "Microsoft Forecaster is a budgeting and planning application that allows companies to build budgets based on specific objectives", one has to wonder!&lt;br /&gt;&lt;br /&gt;And "&lt;span style="font-family:Calibri;font-size:100%;"&gt;Enterprise Reporting is designed for sophisticated group reporting and consolidation needs, and includes advanced multi-dimensional consolidations, eliminations and multicurrency capabilities.  Enterprise Reporting’s planning environment is easily customizable to fit diverse budgeting and forecasting needs across all industries and organizations.  Enterprise Reporting provides strong analytical modules to make it extremely easy to create new ad-hoc reports on the fly"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Seriously?  That's quite a bundle of tasks.  Enquiring minds want to know more!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-3321714138396758915?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/3321714138396758915/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=3321714138396758915' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/3321714138396758915'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/3321714138396758915'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2009/06/can-dynamics-cpm-pick-up-where.html' title='Can Dynamics CPM pick up where PerformancePoint left off?'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-9083047587081189976</id><published>2009-06-11T18:12:00.003+10:00</published><updated>2009-06-11T19:02:33.916+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Planning'/><category scheme='http://www.blogger.com/atom/ns#' term='PerformancePoint'/><title type='text'>PerformancePoint Planning:  Bug in the bsp_DI_ValidateLabelTable Proc</title><content type='html'>Somewhat irrelevant due to shut down of PerformancePoint Planning but it's an issue I encountered so I will record it for posterity and future generations (*snigger*).&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There is a bug in the bsp_DI_ValidateLabelTable proc which causes it to fail when you are using a specific hierarchy in the model rather than the default 'all members' set.   The problem arises when you pass in an incorrect model name. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The proc does not validate that the model name is actually valid before continuing (naughty naughty) which means you can actually cause errors if it just so happens that the value you pass in is a valid object - just not the name of the model itself.  Let me show you want I mean.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;First let's just mock up some object labels (please note these are NOT real.  I would never be so generic but for the purpose of examination...).&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;Application:  PPS&lt;/div&gt;&lt;div&gt;RootModelSite: PPS_Planning&lt;/div&gt;&lt;div&gt;Model:  PPS&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;When calling PPSCMD you often refer to PPS:PPS_Planning.&lt;/div&gt;&lt;div&gt;When executing the bsp_DI_ValidateLabelTable proc, it asks for modelname as a parameter.  In my example, I will have a scope in FK_relationships for PPS:PPS_Planning to identify the modelsite but that's not the one I need.  Nope.  I need PPS_Planning:PPS, which identifies the model.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But I'm half asleep and I've typed PPS:PPS_Planning in the past 24 hours so many times that I just don't think.  Uh oh, all of a sudden the proc fails - but not after having made a few updates already.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Silly mistake to make, no question.  Still, it does seem a bit dodgy to take an string input from a user, which is also a unique label used to identify a specific record, and not validate that it actually exists before making updates using that value!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-9083047587081189976?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/9083047587081189976/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=9083047587081189976' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/9083047587081189976'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/9083047587081189976'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2009/06/performancepoint-planning-bug-in.html' title='PerformancePoint Planning:  Bug in the bsp_DI_ValidateLabelTable Proc'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-5268983696489759258</id><published>2009-06-11T17:29:00.002+10:00</published><updated>2009-06-11T17:32:31.158+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SSIS'/><title type='text'>SSIS: Write to the Output Window from a Script Task</title><content type='html'>Want to write to the Output window during execution of a script task?  &lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;DTS.Events.FireInformation(1,"YOUR TITLE","Your Message","",0, False)&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;Really handy for debugging!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-5268983696489759258?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/5268983696489759258/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=5268983696489759258' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/5268983696489759258'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/5268983696489759258'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2009/06/ssis-write-to-output-window-from-script.html' title='SSIS: Write to the Output Window from a Script Task'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-3012402650603890117</id><published>2009-06-11T15:42:00.003+10:00</published><updated>2009-06-11T17:29:27.672+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SSIS'/><category scheme='http://www.blogger.com/atom/ns#' term='Data-Mining'/><category scheme='http://www.blogger.com/atom/ns#' term='Bug'/><category scheme='http://www.blogger.com/atom/ns#' term='Analysis Services (SSAS)'/><title type='text'>SSIS: Error when executing a data flow using the OLEDB SSAS 9.0 Provider</title><content type='html'>I found an interesting problem today.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I had an SSIS package which contained, amongst other things, a data flow which had 3 OLEDB data flow sources which later get merged into one for insert into the destination.  Each data source points to the same OLEDB connection which uses the Analysis Services 9.0 provider to connect to a mining structure.  Each data source used the SQL Command access mode and a simple DMX statement in the command text.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;When previewing the results of each query all worked fine and results were as expected.  When it came to execute time on the server I kept receiving the most frustratingly vague error.&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;"Error code = 0x80040E05, External Code = 0x00000000:."&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;Mmmm.  Yes... I know it well...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So I presumed it was somehow a permissions issue as the previews under my profile all looked fine.  Only, the perms were the same.  I made sure the connection property "RetainSameConnection" was set to FALSE.  No difference.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So then I deleted 2 of the data flow sources and tried again.  This time success.  Somehow the connections were locking each other out.  I set the RetainSameConnection to TRUE.  This time even the previews failed.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So my workaround?  I used a ForEach Loop to do them one at a time using the "SQL Command From Variable" data access mode on the data flow source.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Problem solved!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-3012402650603890117?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/3012402650603890117/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=3012402650603890117' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/3012402650603890117'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/3012402650603890117'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2009/06/ssis-error-when-executing-data-flow.html' title='SSIS: Error when executing a data flow using the OLEDB SSAS 9.0 Provider'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-8649786478664065230</id><published>2009-06-10T17:24:00.003+10:00</published><updated>2009-06-10T17:26:50.288+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SSIS'/><category scheme='http://www.blogger.com/atom/ns#' term='T-SQL'/><title type='text'>SQL SSIS:  Vote for data viewer suggestion</title><content type='html'>Vote for a feature request on Microsoft Connect for greater flexibility over when and where an SSIS data viewer is shown.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=465835"&gt;https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=465835&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-8649786478664065230?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/8649786478664065230/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=8649786478664065230' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/8649786478664065230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/8649786478664065230'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2009/06/sql-ssis-vote-for-data-viewer.html' title='SQL SSIS:  Vote for data viewer suggestion'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-6575296981396310623</id><published>2009-06-09T16:50:00.004+10:00</published><updated>2009-06-09T16:58:20.153+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SSIS'/><category scheme='http://www.blogger.com/atom/ns#' term='T-SQL'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>SQL:  Retrieving the Metadata for a Query</title><content type='html'>Sometimes you need to know what the metadata for a query looks like before runtime.  This is particularly relevant with SSIS.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I use it rarely but every time I do have a need for it, I can never remember the name of the option and it takes me an hour at least to track it down again.  So I'm hereby cementing it in stone so I don't forget it again!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;SET FMTONLY ON&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;That's the one.  It will return the columns and data types to the query engine.  Note: it does not actually run the query or return any results.  It's purely to return metadata about the query.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It's surprisingly handy from time to time.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-6575296981396310623?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/6575296981396310623/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=6575296981396310623' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/6575296981396310623'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/6575296981396310623'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2009/06/sql-retrieving-metadata-for-query.html' title='SQL:  Retrieving the Metadata for a Query'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-8851092911030474402</id><published>2009-06-03T12:30:00.003+10:00</published><updated>2009-06-10T13:09:38.301+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Monitoring and Analysing'/><category scheme='http://www.blogger.com/atom/ns#' term='PerformancePoint'/><title type='text'>SharePoint Magazine - Part 3 Out Now!</title><content type='html'>&lt;div&gt;&lt;span class="Apple-style-span"   style="  ;font-family:'Trebuchet MS';font-size:13px;"&gt;My next article for SharePoint Magazine is available now.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style=" ;font-family:'Trebuchet MS';font-size:13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;a href="http://sharepointmagazine.net/technical/administration/kpis-–-who-am-i-and-where-do-i-come-from-part-3-of-6"&gt;http://sharepointmagazine.net/technical/administration/kpis-–-who-am-i-and-where-do-i-come-from-part-3-of-6&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-8851092911030474402?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/8851092911030474402/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=8851092911030474402' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/8851092911030474402'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/8851092911030474402'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2009/06/sharepoint-magazine-part-3-out-now.html' title='SharePoint Magazine - Part 3 Out Now!'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-6716919899982312191</id><published>2009-06-03T11:21:00.005+10:00</published><updated>2009-06-03T11:29:40.029+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SSIS'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>SQL 2005: Scalar Resultsets and SSIS Variables</title><content type='html'>&lt;div&gt;Found an interesting SSIS tidbit today which I've amazingly never encountered before.  Not quite sure how I've never managed to hit this problem before - it seems surprising to me but there you go, I guess it happens from time to time.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In an ExecuteSQLTask, I was returning a scalar value to a variable.  The value returned was a bigint.  My SSIS variable was a bigint.   The step failed with an invalid type error.  What the?  Changed the type to an object.  Success this time but not much help to me down the control flow because I can't read it without a ForEach - which I really don't wanna do for a scalar value.  I mean that would just be silly.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;According to &lt;a href="http://technet.microsoft.com/en-us/library/cc280492.aspx"&gt;Technet&lt;/a&gt; "&lt;span class="Apple-style-span" style="font-family: Verdana; font-size: 11px; line-height: 15px; "&gt;With an OLE DB or Excel connection manager, the connection manager explicitly converts values of the following types, DBTYPE_NUMERIC, DBTYPE_GUID, and DBTYPE_BYTES, to strings".  &lt;span class="Apple-style-span" style="font-family: Georgia; font-size: 16px; line-height: normal; "&gt;Seems crazy to me!  I changed the SSIS variable to a string and what do you know, success.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Nuts!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-6716919899982312191?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/6716919899982312191/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=6716919899982312191' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/6716919899982312191'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/6716919899982312191'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2009/06/sql-2005-scalar-resultsets-and-ssis.html' title='SQL 2005: Scalar Resultsets and SSIS Variables'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-7330951836549157419</id><published>2009-04-24T17:56:00.002+10:00</published><updated>2009-04-24T18:07:08.560+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Bug'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><category scheme='http://www.blogger.com/atom/ns#' term='Analysis Services (SSAS)'/><category scheme='http://www.blogger.com/atom/ns#' term='2008'/><title type='text'>SQL 2008 SP1 - a must have!</title><content type='html'>Some time ago I installed SQL 2008 on a VPC which was also running MOSS and PerformancePoint.  Soon enough the VPC started to run out of memory.  I tore my hair out for a few days because nothing I did made a good dent in the problem.  &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Till I found the silver bullet.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Consistently SSAS was high on the list of memory-hungry services - plateauing around the 500Mb mark.  Yeah, that's a lot.  With only a couple of cubes and no queries running it did seem to be hugely excessive. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;What to do?  Install SP1.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;That's it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Usage dropped down to somewhere around 30-80Mb.  Much more memory friendly!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Interestingly, of the many bug fixes included, in SP1 (&lt;a href="http://support.microsoft.com/kb/96836"&gt;full list&lt;/a&gt;),  a memory leak in SSAS is not one of them! &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-7330951836549157419?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/7330951836549157419/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=7330951836549157419' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/7330951836549157419'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/7330951836549157419'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2009/04/sql-2008-sp1-must-have.html' title='SQL 2008 SP1 - a must have!'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-5507797529633568489</id><published>2009-04-09T12:29:00.004+10:00</published><updated>2009-04-09T12:56:33.636+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>TSQL:  Truncating Datetime</title><content type='html'>It crops up all the time.  You have a datetime column.  In your select, you don't care about the time, you only care about the date because you want to group all records for a particular date, for example.  So what's the quickest way to go about it?&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Well let's start with the options...&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;CONVERT&lt;/li&gt;&lt;li&gt;FLOOR&lt;/li&gt;&lt;li&gt;DATEADD/DATEDIFF&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;If you are using SQL 2008, you could add another option and CAST to DATE.  Perfect if the recipient of the data will accept it.  I'm gonna assume however, as is most likely at this point in time, that you aren't using SQL 2008 yet as that does seem to still be the case in most organisations.  I'm also going to assume that you need to return a datetime.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, to &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;option 1: CONVERT.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A popular choice because it's easily readable.  Let me give you an example.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;CAST((CONVERT(varchar(11),getdate(),120)) as DATETIME)&lt;/div&gt;&lt;div&gt;This will return 2009-04-09 00:00:00.000&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Option 2:  FLOOR&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;CAST(FLOOR(CAST(Getdate() as FLOAT)) as DATETIME)&lt;/div&gt;&lt;div&gt;Returns 2009-04-09 00:00:00.000&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Obviously faster than convert because we aren't working with any strings.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Option 3: DATEADD&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;DATEADD(dd, DATEDIFF(dd, 0 getdate()), 0)&lt;/div&gt;&lt;div&gt;Returns 2009-04-09 00:00:00.000 (shock horror!)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Guess what?  This version is even faster again because we don't have any conversion to do at all.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To what degree are these options faster?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Well, a quick test by plonking a million records into a temp table which contains only a datetime column showed my execution times to be fairly similar but my CPU times  were increasingly quicker.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;CONVERT - 1591&lt;/div&gt;&lt;div&gt;FLOOR - 434&lt;/div&gt;&lt;div&gt;DATEADD - 382&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The convert is horrible obviously and should never be considered even at the expense of readability.  Clearly there's not a vast difference between FLOOR and DATEADD but I guess I like the DATEADD method for it's lack of conversion as well as it's performance gain, however small.  It just seems cleaner to me.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-5507797529633568489?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/5507797529633568489/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=5507797529633568489' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/5507797529633568489'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/5507797529633568489'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2009/04/tsql-truncating-datetime.html' title='TSQL:  Truncating Datetime'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-4813642966903338262</id><published>2009-02-06T15:35:00.003+11:00</published><updated>2009-02-06T15:38:44.944+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SSIS'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>SQL 2005 SSIS:  Unpivot Transformation - Destination Column</title><content type='html'>Came across an interesting little bug today in SSIS... &lt;br /&gt;&lt;br /&gt;When using the Unpivot transformation, if you attempt to see the results of the Destination Column in a data viewer well, you can't... the column just isn't there.  However, when the output is sent to an actual data destination it is created as expected.  You just have no way of knowing that until you actually look at the destination itself.&lt;br /&gt;&lt;br /&gt;Wasted quite a bit of time on that one!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-4813642966903338262?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/4813642966903338262/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=4813642966903338262' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/4813642966903338262'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/4813642966903338262'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2009/02/sql-2005-ssis-unpivot-transformation.html' title='SQL 2005 SSIS:  Unpivot Transformation - Destination Column'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-9218664966143428700</id><published>2009-01-29T10:19:00.003+11:00</published><updated>2009-01-29T10:22:11.956+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Monitoring and Analysing'/><category scheme='http://www.blogger.com/atom/ns#' term='Planning'/><category scheme='http://www.blogger.com/atom/ns#' term='PerformancePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='Sharepoint 2007 (MOSS)'/><title type='text'>No more PPS Planning...</title><content type='html'>The news, as I'm sure everyone has now heard, is that PerformancePoint Planning is being retired.  See the official press release at:&lt;br /&gt;&lt;br /&gt;&lt;a title="blocked::http://www.microsoft.com/presspass/features/2009/jan09/01-27KurtDelbeneQA.mspx" href="http://www.microsoft.com/presspass/features/2009/jan09/01-27KurtDelbeneQA.mspx"&gt;http://www.microsoft.com/presspass/features/2009/jan09/01-27KurtDelbeneQA.mspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;PerformancePoint Monitoring will be bundled into SharePoint as part of Office 14 - and be known as PerformancePoint Services for SharePoint.  Wacko.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-9218664966143428700?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/9218664966143428700/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=9218664966143428700' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/9218664966143428700'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/9218664966143428700'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2009/01/no-more-pps-planning.html' title='No more PPS Planning...'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-4861485424605419977</id><published>2009-01-23T10:06:00.005+11:00</published><updated>2009-01-23T10:24:48.542+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SSIS'/><category scheme='http://www.blogger.com/atom/ns#' term='ETL'/><category scheme='http://www.blogger.com/atom/ns#' term='Planning'/><category scheme='http://www.blogger.com/atom/ns#' term='PerformancePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='Data Integration'/><title type='text'>PerformancePoint Planning:  Data Integration</title><content type='html'>Quick Overview of the steps required in an ETL package to load a PerformancePoint Planning application:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Sync Dimensions from App to Staging (call ppscmd) &lt;/li&gt;&lt;li&gt;Sync Models  from App to Staging (call ppscmd) &lt;/li&gt;&lt;li&gt;Stage Dimensions into Label table (data flow) &lt;/li&gt;&lt;li&gt;Load Dimensions  (call ppscmd) &lt;/li&gt;&lt;li&gt;Stage Hierarchies into Label table (data flow) &lt;/li&gt;&lt;li&gt;Load Dimensions (call ppscmd) &lt;/li&gt;&lt;li&gt;Reindex Dimension tables (sql command)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Stage Fact into Label table (data flow) &lt;/li&gt;&lt;li&gt;Load Fact  (call ppscmd) &lt;/li&gt;&lt;li&gt;Reindex MG tables&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Deploy Model  (call ppscmd) &lt;/li&gt;&lt;/ol&gt;This presumes you are using the 'Label' table approach.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-4861485424605419977?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/4861485424605419977/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=4861485424605419977' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/4861485424605419977'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/4861485424605419977'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2009/01/performancepoint-planning-data.html' title='PerformancePoint Planning:  Data Integration'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-1709674521862954868</id><published>2008-12-22T11:02:00.003+11:00</published><updated>2008-12-22T11:17:09.572+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Server Administration'/><category scheme='http://www.blogger.com/atom/ns#' term='Bug'/><category scheme='http://www.blogger.com/atom/ns#' term='Reporting Services (SSRS)'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><category scheme='http://www.blogger.com/atom/ns#' term='Sharepoint 2007 (MOSS)'/><title type='text'>SQL 2005 SP3 has landed</title><content type='html'>SP3 for SQL 2005 is now available for &lt;a href="http://blogs.technet.com/dataplatforminsider/archive/2008/12/10/sql-server-2005-sp3-now-available-for-download.aspx"&gt;download&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Included are a number of &lt;a href="http://support.microsoft.com/?kbid=955706"&gt;Bug Fixes&lt;/a&gt; , performance enhancements for using SSRS in SharePoint Integration mode, improved rendering of PDF fonts in SSRS, support for SQL 2008 Dbs with SQL 2005 Notification Services and  support for Teradata Dbs as a data source for Report Models.&lt;br /&gt;&lt;br /&gt;This Service Pack is cumulative and can be run on any version of SQL 2005.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-1709674521862954868?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/1709674521862954868/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=1709674521862954868' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/1709674521862954868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/1709674521862954868'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2008/12/sql-2005-sp3-has-landed.html' title='SQL 2005 SP3 has landed'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-587046367486707000</id><published>2008-12-17T15:22:00.016+11:00</published><updated>2008-12-18T09:12:53.939+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Planning'/><category scheme='http://www.blogger.com/atom/ns#' term='PerformancePoint'/><title type='text'>PPS-P: Where, oh where, does my data go?</title><content type='html'>&lt;div  style="color: rgb(0, 0, 0);font-family:arial;"&gt;&lt;span style="font-size:100%;"&gt;A user enters a value into a PerformancePoint Planning form... so what happens next? And why are we the least bit interested?&lt;br /&gt;&lt;/span&gt;&lt;p&gt;Firstly, to answer the why do we care question, ask yourself this...&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;When do your extracts from PPS run (presuming you run it more regularly than say once overnight)?&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Do users eg approvers expect to see updates immediately - particularly at certain times of the cycle ie month end?&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;What data do reviewers, approvers and report consumers expect to see? Approved? Currency Converted?&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="color: rgb(0, 0, 0);font-size:100%;" &gt;&lt;span style="font-family:arial;"&gt;So we do care after all.  So now to what actually happens.  In fact, there are a few things that can happen. Let's examine each separately. &lt;/span&gt;&lt;/span&gt;&lt;p  style="font-weight: bold; color: rgb(0, 0, 0);font-family:arial;"&gt;&lt;span style="font-size:100%;"&gt;(1) The user selects the Save Privately action&lt;/span&gt;&lt;/p&gt;&lt;ul  style="color: rgb(0, 0, 0);font-family:arial;"&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;The data is stored on the local file system - known as the Offline Cache. This location is usually C:\Documents and Settings\%username%\Local Settings\Application Data\Microsoft\PerformancePoint\OfflineCache&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;In the Offline Cache, the Catalog.xml file stores a list of all assignments stored locally&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;In the Offline Cache, each assignment is stored in a .dat file. The dat file an xml file which contains binaries.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Data is NOT sent to the SQL server or the cube&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;The status of the assignment is still 'started'&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div  style="color: rgb(0, 0, 0);font-family:arial;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-weight: bold;"&gt;(2) The user selects the Submit Draft action&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;ul  style="color: rgb(0, 0, 0);font-family:arial;"&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;The data is stored in the SQL table called MG_ModelName_Default_Partition &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;The resulting values from Definition Rules are stored in the MG table also however they're linked to the 'No Assignment' assigment&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Once the pre-configured polling period has passed, the cube called &lt;application&gt;&lt;em&gt;ApplicationLabel_ModelSiteLabel &lt;/em&gt;will be refreshed &lt;/application&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;The status of the assignment is 'Partial'&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div  style="font-weight: bold; color: rgb(0, 0, 0);font-family:arial;"&gt;&lt;span style="font-size:100%;"&gt;(3) The user selects the Submit Final action.&lt;/span&gt;&lt;/div&gt;&lt;ul  style="color: rgb(0, 0, 0);font-family:arial;"&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;The data is stored in the SQL table called MG_&lt;em&gt;ModelName&lt;/em&gt;&lt;modelname&gt;_Default_Partition &lt;/modelname&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;The resulting values from Definition Rules are stored in the MG table also however they are linked to the 'No Assignment' assigment&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Once the pre-configured polling period has passed, the cube called &lt;em&gt;ApplicationLabel&lt;application&gt;_ModelSiteLabel&lt;/application&gt;&lt;/em&gt;&lt;modelsite&gt; will be refreshed &lt;/modelsite&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;The status of the assignment is 'Submitted'&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p  style="font-weight: bold; color: rgb(0, 0, 0);font-family:arial;"&gt;&lt;span style="font-size:100%;"&gt;(4) A data movement job occurs&lt;/span&gt;&lt;/p&gt;&lt;ul  style="color: rgb(0, 0, 0);font-family:arial;"&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;The data is copied from the source SQL table called  MG_&lt;em&gt;ModelName&lt;/em&gt;_Default_Partition to the destination table called  MG_&lt;em&gt;ModelName&lt;/em&gt;_Default_Partition &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Data is aggregated when the scope of a dimension (in the data association) has been set to "All" on the source model.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;All data is copied: Partial, Submitted, Approved&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="color: rgb(0, 0, 0);font-size:100%;" &gt;&lt;span style="font-family:arial;"&gt;Then of course the question is, how long does all this take? Sadly, there's no simple answer to that question, as so aptly discussed by &lt;/span&gt;&lt;a style="font-family: arial;" href="http://blogs.msdn.com/petereb/archive/2008/05/14/when-will-data-appear-in-the-cube-after-a-submit-from-the-pps-planning-business-client.aspx"&gt;Peter Ebley&lt;/a&gt;&lt;span style="font-family:arial;"&gt;. To paraphrase Peter, there are a few steps that occur:&lt;/span&gt;&lt;/span&gt;&lt;ol  style="color: rgb(0, 0, 0);font-family:arial;"&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Send it to the server (Status = Pending)&lt;br /&gt;Depends on the size of the submission (How many rows? Is the workbook attached? How many dimensions?) and network bandwidth.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Process the Queue (Status = WaitProcess)&lt;br /&gt;Depends on the Planning Process Poll Interval (recommendation is 1 minute) and how many items are in the queue and of course, how long it takes to validate the submission.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Cube Processes&lt;br /&gt;Depends on the OLAP Cube Refresh Interval property in the Workflow tab of PAC.&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p style="font-family: arial; color: rgb(0, 0, 0);"&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-587046367486707000?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/587046367486707000/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=587046367486707000' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/587046367486707000'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/587046367486707000'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2008/12/pps-p-when-and-where-does-backend-get.html' title='PPS-P: Where, oh where, does my data go?'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-3103013361252084413</id><published>2008-12-17T09:26:00.003+11:00</published><updated>2008-12-17T10:12:35.894+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Project Gemini'/><category scheme='http://www.blogger.com/atom/ns#' term='Cubes'/><category scheme='http://www.blogger.com/atom/ns#' term='ProClarity'/><category scheme='http://www.blogger.com/atom/ns#' term='Excel'/><title type='text'>Weighing in on Project Gemini</title><content type='html'>My reception to &lt;a href="http://blogs.msdn.com/sqlcat/archive/2008/10/06/project-gemini-building-models-and-analysing-data-from-excel.aspx"&gt;Project Gemini&lt;/a&gt; to date has been lukewarm.  Sure, self-service cubes in Excel sounds sexy and looks sexy... but... we don't let our users have free reign with data for a reason.  These controls didn't just happen because we want to keep ourselves in a job (I hope!).&lt;br /&gt;&lt;br /&gt;I'm gonna take a stab and suggest that every BI pro has walked into a job and found an environment where there are 2000 reports on a single system and some of them consume all the machine resources and take 10 minutes to execute.  That sort of malarky.  So we did the hard slog, got the BA's back up and whipped everyone back into line.  The users were happier because the reports execute quickly and were easy to find, you were happier because there are far fewer reports to maintain, the server team are happier because the box didn't have to be rebooted every day and the BA's are happier because everyone else is happy (one hopes!).&lt;br /&gt;&lt;br /&gt;This is why we put controls in place.&lt;br /&gt;&lt;br /&gt;So.  Doesn't this leave Project Gemini dead in the water in the real world?&lt;br /&gt;&lt;br /&gt;Well, I &lt;a href="http://blogs.adatis.co.uk/blogs/timkent/archive/2008/10/08/bi-conference-day-2.aspx"&gt;read&lt;/a&gt; an interesting perspective from &lt;a href="http://bimvp.com/blogs/bsm/default.aspx"&gt;Patrick Husting &lt;/a&gt;which made me re-think my thoughts (non-pun intended).&lt;br /&gt;&lt;br /&gt;"People are always going to do self service reporting in some way whether we like it or not, no matter how good the underlying data is, so why not do it in a controlled manner where everything is audited and logged and the IT team has full visibility of what is going"&lt;br /&gt;&lt;br /&gt;Ok so, to quote from a really crappy movie I saw recently "just because it is, doesn't mean it should be".  But I think he might actually be right.  To a point.&lt;br /&gt;&lt;br /&gt;I really do hate to be a naysayer.  And I'm not just saying that.  But, I have a big BUT (please no jokes!).&lt;br /&gt;&lt;br /&gt;Where is all this magical data that is being analysed coming from in the first place?  From systems.  Well guess, what, we don't let users have hollus bollus access to our databases to avoid the suituations caused by our predecessors.&lt;br /&gt;&lt;br /&gt;Actually that's not my only issue... users do NOT have a big picture view of the world.  They don't care what other parts of the business are doing and they are not interested in how data aggregates upwards beyond their little fish pond.  They are not interested in whether there is a single source of truth or if their version of the truth is different to someone else's.  They are not interested in network bandwidth or performance at other sites. &lt;br /&gt;&lt;br /&gt;Nor should they care about this stuff, that's not their job.  It's ours.&lt;br /&gt;&lt;br /&gt;It's all very well to say "everything is audited and logged" but aren't we supposed to operate preventatively not reactively?&lt;br /&gt;&lt;br /&gt;So I have to ask, isn't that what something like ProClarity is for?  To allow users to slice and dice data however they choose while ensuring that the structures and models have been put in place to consider the big picture?&lt;br /&gt;&lt;br /&gt;You know what, I think I've just talked myself back to my original stance.  It's sexy and I like it but I can't envision practical applications in the real world yet.&lt;br /&gt;&lt;br /&gt;That said, I'm always happy to be proven wrong.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-3103013361252084413?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/3103013361252084413/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=3103013361252084413' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/3103013361252084413'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/3103013361252084413'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2008/12/weighing-in-on-project-gemini.html' title='Weighing in on Project Gemini'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-5934862410659198536</id><published>2008-11-18T15:21:00.003+11:00</published><updated>2008-11-18T15:23:20.177+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Planning'/><category scheme='http://www.blogger.com/atom/ns#' term='PerformancePoint'/><title type='text'>PerformancePoint Planning - Enable/Disable Spreading</title><content type='html'>Contrary to the &lt;a href="http://office.microsoft.com/en-us/performancepoint/HA102684361033.aspx?pid=CH102586651033&amp;amp;ac=1&amp;amp;uc=1&amp;amp;WT.mc_id=45#comments"&gt;incorrect instructions &lt;/a&gt;on Office Online, to enable and disable spreading on a matrix you must do the following:&lt;br /&gt;&lt;br /&gt;From the Advanced group on the PPS ribbon, you select Options and the SpreadingType drop-down allows you to enable/disable spreading.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-5934862410659198536?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/5934862410659198536/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=5934862410659198536' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/5934862410659198536'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/5934862410659198536'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2008/11/performancepoint-planning-enabledisable.html' title='PerformancePoint Planning - Enable/Disable Spreading'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-2925059215236430878</id><published>2008-11-11T10:00:00.005+11:00</published><updated>2008-11-18T15:33:53.194+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SAP'/><category scheme='http://www.blogger.com/atom/ns#' term='PerformancePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='Sharepoint 2007 (MOSS)'/><title type='text'>Using SAP as a Data Source</title><content type='html'>I was recently asked a question which I thought might be of value to everyone.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;Can you please let me know...&lt;br /&gt;1. Is share Point and Performance Point can be used in SAP BI or is it strictly Integrated with MircoSoft Technologies!!&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;So my response was...&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;I’m assuming you mean “can you use SAP as a data source?” &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;Firstly, SharePoint isn’t a BI technology as such. It’s a collaboration, portal &amp;amp; document management tool. However it does have the ability to create lists and simple KPIs which you could use SAP data as a source for if you wanted to. &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;That said, I’m sure your SAP operations team would never allow you to link directly to SAP – you would need to extract into a database first. &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;Secondly, you can certainly use SAP as a data source for both PerformancePoint modules - Planning and Monitoring &amp;amp; Analyzing. However you would never link directly to the system from PerformancePoint. You would almost always extract from your transactional system into a datawarehouse and that would be your data source (there may be exceptions from time to time but generally it's is wise to separate your reporting engine and your transactional engine.  There are numerous gains in doing so - security, performance, aggregation, modelling).&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;The other key consideration is licensing. SAP is pretty strict about licensing when it comes to extracting data so you would need to take that into consideration also. &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;Hope that answers your question!&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-2925059215236430878?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/2925059215236430878/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=2925059215236430878' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/2925059215236430878'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/2925059215236430878'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2008/11/i-was-recently-asked-question-which-i.html' title='Using SAP as a Data Source'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-995689918487657660</id><published>2008-11-05T14:55:00.003+11:00</published><updated>2008-11-05T14:59:55.389+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Planning'/><category scheme='http://www.blogger.com/atom/ns#' term='PerformancePoint'/><title type='text'>PerformancePoint Planning - Impersonate a Contributor during Form Development</title><content type='html'>It was be absolutely invaluable to have the ability to impersonate a 'contributor' during form development.&lt;br /&gt;&lt;br /&gt;Currently, when developing a form, I have 2 sesssions of Excel open - one as me and one as a contributor. This means I need to create a cycle and an assignment also and republish every time I make a change to the form I'm working on. Merely to validate that I am getting 'yellow cells' as expected (which is by no means a sure thang!).&lt;br /&gt;&lt;br /&gt;A feature, similar to Analysis Services where I can impersonate a particular user/role would eliminate the need for all that extra effort - republishing, regenerating etc.&lt;br /&gt;&lt;br /&gt;If you too would value this functionality, please vote for it at &lt;a href="https://connect.microsoft.com/feedback/ViewFeedback.aspx?FeedbackID=380070&amp;amp;SiteID=181"&gt;https://connect.microsoft.com/feedback/ViewFeedback.aspx?FeedbackID=380070&amp;amp;SiteID=181&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-995689918487657660?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/995689918487657660/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=995689918487657660' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/995689918487657660'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/995689918487657660'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2008/11/performancepoint-planning-impersonate.html' title='PerformancePoint Planning - Impersonate a Contributor during Form Development'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-2117731985434673754</id><published>2008-11-05T13:32:00.004+11:00</published><updated>2008-11-05T13:36:34.278+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Planning'/><category scheme='http://www.blogger.com/atom/ns#' term='PerformancePoint'/><title type='text'>PerformancePoint Planning - Object Names</title><content type='html'>Just a quick FYI....&lt;br /&gt;&lt;br /&gt;In PerformancePoint Planning, objects are named as follows:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Cubes:  ApplicationLabel_ModelSiteLabel&lt;/li&gt;&lt;li&gt;Databases:  As specified in PAC during create&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Application Label must be unique and cannot be changed&lt;/li&gt;&lt;li&gt;When connecting to an application, the Application Name is displayed&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-2117731985434673754?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/2117731985434673754/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=2117731985434673754' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/2117731985434673754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/2117731985434673754'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2008/11/performancepoint-planning-object-names.html' title='PerformancePoint Planning - Object Names'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-5694011919010548784</id><published>2008-11-04T09:01:00.003+11:00</published><updated>2008-11-04T10:41:06.758+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft Azure'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>Microsoft Azure.... the blue loo</title><content type='html'>Microsoft announced it's &lt;a href="http://www.microsoft.com/azure/default.mspx"&gt;Azure&lt;/a&gt; service last week.  In their words Azure is a tool that allows you to "Build new applications in the cloud - or use interoperable services that run on Microsoft infrastructure to extend and enhance your existing applications".  From our, the BI developers',  perspective Azure is hosting not just data but also Visual Studio solutions ie developing and deployment within the cloud. &lt;br /&gt;&lt;br /&gt;Not that it's limited to Microsoft tools and environments of course.&lt;br /&gt;&lt;br /&gt;So I immediately joined the CTP for SQL Services.  I've downloaded the SQL Data Services SDK and have been placed on a waitlist for access to the cloud. &lt;br /&gt;&lt;br /&gt;From what I can tell so far, you can use REST or SOAP for CRUD operations and LINQ for queries.  Interestingly, there is no 'schema' as such - new properties can be added to entities as required - no need to add a new 'column'.  What that means in practical terms I'm yet to find out.  I suppose it will become apparent once I can access the cloud.&lt;br /&gt;&lt;br /&gt;More info will follow shortly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-5694011919010548784?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/5694011919010548784/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=5694011919010548784' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/5694011919010548784'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/5694011919010548784'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2008/11/microsoft-azure-blue-loo.html' title='Microsoft Azure.... the blue loo'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-7429680616199435419</id><published>2008-10-28T15:01:00.003+11:00</published><updated>2008-11-01T13:58:37.208+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>What’s New in SQL 2008 – Part 3 – Table Type</title><content type='html'>&lt;span xmlns=""&gt;&lt;p&gt;The new Table type allows you to save a table definition in the database which can be reused later to define table variables, stored procedure parameters and functions. To create a Type, we use the CREATE TYPE clause, for example:&lt;br /&gt;&lt;/p&gt;&lt;p style="MARGIN-LEFT: 36pt"&gt;&lt;pre&gt;&lt;code&gt;&lt;span style="color:black;"&gt;CREATE TYPE dbo.ProductList as TABLE (&lt;br /&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="MARGIN-LEFT: 45pt"&gt;&lt;pre&gt;&lt;code&gt;&lt;span style="color:black;"&gt;    ProductName varchar(200) NULL,&lt;br /&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="MARGIN-LEFT: 45pt"&gt;&lt;pre&gt;&lt;code&gt;&lt;span style="color:black;"&gt;    ProductCategory varchar(200) NOT NULL)&lt;br /&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;&lt;span style="font-family:Calibri;color:black;"&gt;&lt;strong&gt;Important Notes:&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;pre&gt;&lt;code&gt;&lt;span style="font-family:Calibri;color:black;"&gt;The metadata is visible using sys.table_types&lt;br /&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;pre&gt;&lt;code&gt;&lt;span style="font-family:Calibri;color:black;"&gt;Variables/parameters cannot be set to NULL – if no table is supplied, an empty table is generated&lt;br /&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;pre&gt;&lt;code&gt;&lt;span style="font-family:Calibri;color:black;"&gt;Not affected by transaction rollbacks&lt;br /&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;pre&gt;&lt;code&gt;&lt;span style="font-family:Calibri;color:black;"&gt;Do not cause recompilations&lt;br /&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Examples&lt;br /&gt;&lt;table style="BORDER-COLLAPSE: collapse" border="0"&gt;&lt;colgroup&gt;&lt;col style="WIDTH: 131px"&gt;&lt;col style="WIDTH: 508px"&gt;&lt;/colgroup&gt;&lt;tbody valign="top"&gt;&lt;tr style="BACKGROUND: #4f81bd"&gt;&lt;td style="BORDER-RIGHT: medium none; PADDING-RIGHT: 7px; BORDER-TOP: 2.25pt solid; PADDING-LEFT: 7px; BORDER-LEFT: medium none; BORDER-BOTTOM: 2.25pt solid"&gt;&lt;/td&gt;&lt;td style="BORDER-RIGHT: medium none; PADDING-RIGHT: 7px; BORDER-TOP: 2.25pt solid; PADDING-LEFT: 7px; BORDER-LEFT: medium none; BORDER-BOTTOM: 2.25pt solid"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="PADDING-RIGHT: 7px; PADDING-LEFT: 7px; BACKGROUND: #4f81bd; BORDER-LEFT: medium none"&gt;&lt;p&gt;&lt;span style="color:white;"&gt;Create Table-Type Variables&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-RIGHT: 7px; PADDING-LEFT: 7px; BACKGROUND: #d8d8d8"&gt;&lt;p&gt;DECLARE @t as dbo.ProductList;&lt;br /&gt;INSERT INTO @t VALUES&lt;br /&gt;('Grey Slate Paver 10x10','Paver'),&lt;br /&gt;('Blue Slate Paver 10x10','Paver'),&lt;br /&gt;('Heritage Blue 12x6','Brick')&lt;br /&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="PADDING-RIGHT: 7px; PADDING-LEFT: 7px; BACKGROUND: #4f81bd; BORDER-LEFT: medium none"&gt;&lt;p&gt;&lt;span style="color:white;"&gt;Creating a Stored Procedure with a Table-typed Parameter&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-RIGHT: 7px; PADDING-LEFT: 7px"&gt;&lt;p&gt;CREATE PROC dbo.uspGetOrdersforProduct (&lt;br /&gt;@t as dbo.ProductList READONLY,&lt;br /&gt;@StartDate as Date,&lt;br /&gt;@EndDate as Date&lt;br /&gt;) AS&lt;br /&gt;SELECT o.OrderId,&lt;br /&gt;     o.OrderDate,&lt;br /&gt;     o.CustomerId,&lt;br /&gt;     o.ProductId,&lt;br /&gt;     o.Amount,&lt;br /&gt;     o.Qty&lt;br /&gt;FROM tOrder as o&lt;br /&gt;INNER JOIN tProduct t on t.ProductId = o.ProductId&lt;br /&gt;INNER JOIN @t as f on f.ProductCategory = t.ProductCategory and (t.ProductName is NULL or t.ProductName = f.ProductName)&lt;br /&gt;WHERE o.OrderDate between @StartDate and @EndDate&lt;br /&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="PADDING-RIGHT: 7px; PADDING-LEFT: 7px; BACKGROUND: #4f81bd; BORDER-LEFT: medium none; BORDER-BOTTOM: 2.25pt solid"&gt;&lt;p&gt;&lt;span style="color:white;"&gt;Passing Table-parameters into Stored Procedures&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-RIGHT: 7px; PADDING-LEFT: 7px; BACKGROUND: #d8d8d8; BORDER-BOTTOM: 2.25pt solid"&gt;&lt;p&gt;DECLARE @t as dbo.ProductList;&lt;br /&gt;INSERT INTO @t VALUES&lt;br /&gt;     (NULL,'Paver'),&lt;br /&gt;     (NULL,'Brick')&lt;br /&gt;&lt;/p&gt;&lt;p&gt;EXEC dbo.uspGetOrdersforProduct @t&lt;br /&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-7429680616199435419?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/7429680616199435419/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=7429680616199435419' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/7429680616199435419'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/7429680616199435419'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2008/10/whats-new-in-sql-2008-part-3-table-type.html' title='What’s New in SQL 2008 – Part 3 – Table Type'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-1802759012527083083</id><published>2008-10-28T14:52:00.000+11:00</published><updated>2008-11-01T14:01:09.209+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>What’s New in SQL 2008 – Part 2 – Data Types</title><content type='html'>&lt;span xmlns=""&gt;&lt;p&gt;&lt;span style="font-family:Georgia;"&gt;&lt;strong&gt;Date and Time&lt;/strong&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;table style="BORDER-COLLAPSE: collapse" border="0"&gt;&lt;colgroup&gt;&lt;col style="WIDTH: 108px"&gt;&lt;col style="WIDTH: 61px"&gt;&lt;col style="WIDTH: 157px"&gt;&lt;col style="WIDTH: 155px"&gt;&lt;col style="WIDTH: 157px"&gt;&lt;/colgroup&gt;&lt;tbody valign="top"&gt;&lt;tr style="BACKGROUND: #4f81bd"&gt;&lt;td style="BORDER-RIGHT: medium none; PADDING-RIGHT: 7px; BORDER-TOP: 2.25pt solid; PADDING-LEFT: 7px; BORDER-LEFT: medium none; BORDER-BOTTOM: 2.25pt solid"&gt;&lt;p&gt;&lt;span style="color:white;"&gt;&lt;strong&gt;Data Type&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="BORDER-RIGHT: medium none; PADDING-RIGHT: 7px; BORDER-TOP: 2.25pt solid; PADDING-LEFT: 7px; BORDER-LEFT: medium none; BORDER-BOTTOM: 2.25pt solid"&gt;&lt;p&gt;&lt;span style="color:white;"&gt;&lt;strong&gt;Size (bytes)&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="BORDER-RIGHT: medium none; PADDING-RIGHT: 7px; BORDER-TOP: 2.25pt solid; PADDING-LEFT: 7px; BORDER-LEFT: medium none; BORDER-BOTTOM: 2.25pt solid"&gt;&lt;p&gt;&lt;span style="color:white;"&gt;&lt;strong&gt;Example&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="BORDER-RIGHT: medium none; PADDING-RIGHT: 7px; BORDER-TOP: 2.25pt solid; PADDING-LEFT: 7px; BORDER-LEFT: medium none; BORDER-BOTTOM: 2.25pt solid"&gt;&lt;p&gt;&lt;span style="color:white;"&gt;&lt;strong&gt;Notes&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="BORDER-RIGHT: medium none; PADDING-RIGHT: 7px; BORDER-TOP: 2.25pt solid; PADDING-LEFT: 7px; BORDER-LEFT: medium none; BORDER-BOTTOM: 2.25pt solid"&gt;&lt;p&gt;&lt;span style="color:white;"&gt;&lt;strong&gt;Client Providers&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="PADDING-RIGHT: 7px; PADDING-LEFT: 7px; BACKGROUND: #4f81bd; BORDER-LEFT: medium none"&gt;&lt;p&gt;&lt;span style="color:white;"&gt;&lt;strong&gt;DATE&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-RIGHT: 7px; PADDING-LEFT: 7px; BACKGROUND: #d8d8d8"&gt;&lt;p&gt;3&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-RIGHT: 7px; PADDING-LEFT: 7px; BACKGROUND: #d8d8d8"&gt;&lt;p&gt;'2009-10-01'&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-RIGHT: 7px; PADDING-LEFT: 7px; BACKGROUND: #d8d8d8"&gt;&lt;/td&gt;&lt;td style="PADDING-RIGHT: 7px; PADDING-LEFT: 7px; BACKGROUND: #d8d8d8"&gt;&lt;p&gt;&lt;em&gt;OLEDB: &lt;/em&gt;DBTYPE_DBDATE&lt;br /&gt;&lt;em&gt;ADO.Net: &lt;/em&gt;DateTime&lt;br /&gt;&lt;em&gt;ODBC: &lt;/em&gt;SQL_DATE&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="PADDING-RIGHT: 7px; PADDING-LEFT: 7px; BACKGROUND: #4f81bd; BORDER-LEFT: medium none"&gt;&lt;p&gt;&lt;span style="color:white;"&gt;&lt;strong&gt;TIME&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-RIGHT: 7px; PADDING-LEFT: 7px"&gt;&lt;p&gt;3-5&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-RIGHT: 7px; PADDING-LEFT: 7px"&gt;&lt;p&gt;'13:12:00.1234567'&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-RIGHT: 7px; PADDING-LEFT: 7px"&gt;&lt;p&gt;Accurate to 100 nanoseconds&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-RIGHT: 7px; PADDING-LEFT: 7px"&gt;&lt;p&gt;&lt;em&gt;OLEDB: &lt;/em&gt;DBTYPE_DBTIME&lt;br /&gt;&lt;em&gt;ADO.Net: &lt;/em&gt;TimeSpan&lt;br /&gt;&lt;em&gt;ODBC: &lt;/em&gt;SQL_TIME&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="PADDING-RIGHT: 7px; PADDING-LEFT: 7px; BACKGROUND: #4f81bd; BORDER-LEFT: medium none"&gt;&lt;p&gt;&lt;span style="color:white;"&gt;&lt;strong&gt;DATETIME2&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-RIGHT: 7px; PADDING-LEFT: 7px; BACKGROUND: #d8d8d8"&gt;&lt;p&gt;6-8&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-RIGHT: 7px; PADDING-LEFT: 7px; BACKGROUND: #d8d8d8"&gt;&lt;p&gt;'2009-10-01 13:12:00.1234567'&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-RIGHT: 7px; PADDING-LEFT: 7px; BACKGROUND: #d8d8d8"&gt;&lt;p&gt;Accurate to 100 nanoseconds&lt;br /&gt;Can specify precision ie decimal places eg DATETIME(3)&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-RIGHT: 7px; PADDING-LEFT: 7px; BACKGROUND: #d8d8d8"&gt;&lt;p&gt;&lt;em&gt;OLEDB: &lt;/em&gt;DBTYPE_DBTIMESTAMP&lt;br /&gt;&lt;em&gt;ADO.Net: &lt;/em&gt;DateTime&lt;br /&gt;&lt;em&gt;ODBC: &lt;/em&gt;SQL_TIMESTAMP&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="PADDING-RIGHT: 7px; PADDING-LEFT: 7px; BACKGROUND: #4f81bd; BORDER-LEFT: medium none; BORDER-BOTTOM: 2.25pt solid"&gt;&lt;p&gt;&lt;span style="color:white;"&gt;&lt;strong&gt;DATETIMEOFFSET&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-RIGHT: 7px; PADDING-LEFT: 7px; BORDER-BOTTOM: 2.25pt solid"&gt;&lt;p&gt;8-10&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-RIGHT: 7px; PADDING-LEFT: 7px; BORDER-BOTTOM: 2.25pt solid"&gt;&lt;p&gt;'2009-10-01 13:12:00.1234567+02:00'&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-RIGHT: 7px; PADDING-LEFT: 7px; BORDER-BOTTOM: 2.25pt solid"&gt;&lt;p&gt;Accurate to 100 nanoseconds&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-RIGHT: 7px; PADDING-LEFT: 7px; BORDER-BOTTOM: 2.25pt solid"&gt;&lt;p&gt;&lt;em&gt;OLEDB: &lt;/em&gt;DBTYPE_DBTIMESTAMP&lt;br /&gt;&lt;em&gt;ADO.Net: &lt;/em&gt;DateTime&lt;br /&gt;&lt;em&gt;ODBC: &lt;/em&gt;SQL_TIMESTAMP&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;There are a number of new functions which can also be used with these new datatypes including:&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;SYSDATETIME (returns DATETIME2), SYSUTCDATETIME, SYSDATETIMEOFFSET (includes time zone in return value) – Current Date and Time&lt;br /&gt;&lt;/li&gt;&lt;li&gt;SWITCHOFFSET – to change the timezone for a DATETIMEOFFSET value&lt;br /&gt;&lt;/li&gt;&lt;li&gt;TODATETIMEOFFSET – convert non-timezone-aware values to time-zone-aware&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style="font-family:Georgia;"&gt;&lt;strong&gt;Other&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;table style="BORDER-COLLAPSE: collapse" border="0"&gt;&lt;colgroup&gt;&lt;col style="WIDTH: 86px"&gt;&lt;col style="WIDTH: 73px"&gt;&lt;col style="WIDTH: 164px"&gt;&lt;col style="WIDTH: 63px"&gt;&lt;col style="WIDTH: 252px"&gt;&lt;/colgroup&gt;&lt;tbody valign="top"&gt;&lt;tr style="BACKGROUND: #4f81bd"&gt;&lt;td style="BORDER-RIGHT: medium none; PADDING-RIGHT: 7px; BORDER-TOP: 2.25pt solid; PADDING-LEFT: 7px; BORDER-LEFT: medium none; BORDER-BOTTOM: 2.25pt solid"&gt;&lt;p&gt;&lt;span style="color:white;"&gt;&lt;strong&gt;Data Type&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="BORDER-RIGHT: medium none; PADDING-RIGHT: 7px; BORDER-TOP: 2.25pt solid; PADDING-LEFT: 7px; BORDER-LEFT: medium none; BORDER-BOTTOM: 2.25pt solid"&gt;&lt;p&gt;&lt;span style="color:white;"&gt;&lt;strong&gt;Size (bytes)&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="BORDER-RIGHT: medium none; PADDING-RIGHT: 7px; BORDER-TOP: 2.25pt solid; PADDING-LEFT: 7px; BORDER-LEFT: medium none; BORDER-BOTTOM: 2.25pt solid"&gt;&lt;p&gt;&lt;span style="color:white;"&gt;&lt;strong&gt;Useage&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="BORDER-RIGHT: medium none; PADDING-RIGHT: 7px; BORDER-TOP: 2.25pt solid; PADDING-LEFT: 7px; BORDER-LEFT: medium none; BORDER-BOTTOM: 2.25pt solid"&gt;&lt;p&gt;&lt;span style="color:white;"&gt;&lt;strong&gt;Returns&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="BORDER-RIGHT: medium none; PADDING-RIGHT: 7px; BORDER-TOP: 2.25pt solid; PADDING-LEFT: 7px; BORDER-LEFT: medium none; BORDER-BOTTOM: 2.25pt solid"&gt;&lt;p&gt;&lt;span style="color:white;"&gt;&lt;strong&gt;Notes&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="PADDING-RIGHT: 7px; PADDING-LEFT: 7px; BACKGROUND: #4f81bd; BORDER-LEFT: medium none; BORDER-BOTTOM: 2.25pt solid"&gt;&lt;p&gt;&lt;span style="color:white;"&gt;&lt;strong&gt;HIERARCHYID&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-RIGHT: 7px; PADDING-LEFT: 7px; BACKGROUND: #d8d8d8; BORDER-BOTTOM: 2.25pt solid"&gt;&lt;p&gt;VARBINARY&lt;br /&gt;eg 5 bytes for 100k records at 6-Levels&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-RIGHT: 7px; PADDING-LEFT: 7px; BACKGROUND: #d8d8d8; BORDER-BOTTOM: 2.25pt solid"&gt;&lt;p&gt;&lt;span style="color:black;"&gt;DECLARE @h hierarchyid = hierarchyid::GetRoot()&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:black;"&gt;DECLARE @c hierarchyid&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;&lt;span style="font-family:Calibri;color:black;"&gt;SET @c = @h.GetDescendant(NULL, NULL)&lt;br /&gt;SELECT @c.ToString()&lt;br /&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-RIGHT: 7px; PADDING-LEFT: 7px; BACKGROUND: #d8d8d8; BORDER-BOTTOM: 2.25pt solid"&gt;&lt;p&gt;'&lt;span style="color:black;"&gt;/1/&lt;/span&gt;'&lt;span style="color:black;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-RIGHT: 7px; PADDING-LEFT: 7px; BACKGROUND: #d8d8d8; BORDER-BOTTOM: 2.25pt solid"&gt;&lt;p&gt;Represents position in a hierarchy&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Actually a CLR function with several methods eg&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;GetDescendant/IsDescendantOf&lt;br /&gt;&lt;/li&gt;&lt;li&gt;GetLevel/GetRoot&lt;br /&gt;&lt;/li&gt;&lt;li&gt;GetReParentedValue&lt;br /&gt;&lt;/li&gt;&lt;li&gt;ToString/Read/Write (CLR)&lt;/li&gt;&lt;/ul&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-1802759012527083083?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/1802759012527083083/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=1802759012527083083' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/1802759012527083083'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/1802759012527083083'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2008/10/whats-new-in-sql-2008.html' title='What’s New in SQL 2008 – Part 2 – Data Types'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-5754489763515971836</id><published>2008-10-28T14:50:00.004+11:00</published><updated>2008-11-01T13:56:43.698+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>What's New in SQL 2008 - Part 1 - Functionality</title><content type='html'>&lt;span xmlns=""&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div&gt;&lt;table style="BORDER-COLLAPSE: collapse" border="0"&gt;&lt;colgroup&gt;&lt;col style="WIDTH: 86px"&gt;&lt;col style="WIDTH: 300px"&gt;&lt;col style="WIDTH: 253px"&gt;&lt;/colgroup&gt;&lt;tbody valign="top"&gt;&lt;tr style="BACKGROUND: #4f81bd"&gt;&lt;td style="BORDER-RIGHT: medium none; PADDING-RIGHT: 7px; BORDER-TOP: 2.25pt solid; PADDING-LEFT: 7px; BORDER-LEFT: medium none; BORDER-BOTTOM: 2.25pt solid"&gt;&lt;p&gt;&lt;span style="color:white;"&gt;&lt;strong&gt;Function&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="BORDER-RIGHT: medium none; PADDING-RIGHT: 7px; BORDER-TOP: 2.25pt solid; PADDING-LEFT: 7px; BORDER-LEFT: medium none; BORDER-BOTTOM: 2.25pt solid"&gt;&lt;p&gt;&lt;span style="color:white;"&gt;&lt;strong&gt;Usage Example&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="BORDER-RIGHT: medium none; PADDING-RIGHT: 7px; BORDER-TOP: 2.25pt solid; PADDING-LEFT: 7px; BORDER-LEFT: medium none; BORDER-BOTTOM: 2.25pt solid"&gt;&lt;p&gt;&lt;span style="color:white;"&gt;&lt;strong&gt;Notes&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="PADDING-RIGHT: 7px; PADDING-LEFT: 7px; BACKGROUND: #4f81bd; BORDER-LEFT: medium none"&gt;&lt;p&gt;&lt;span style="color:white;"&gt;Declare &amp;amp; Initialise&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-RIGHT: 7px; PADDING-LEFT: 7px; BACKGROUND: #d8d8d8"&gt;&lt;p&gt;DECLARE @iValue as integer = 100;&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-RIGHT: 7px; PADDING-LEFT: 7px; BACKGROUND: #d8d8d8"&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="PADDING-RIGHT: 7px; PADDING-LEFT: 7px; BACKGROUND: #4f81bd; BORDER-LEFT: medium none"&gt;&lt;p&gt;&lt;span style="color:white;"&gt;Compound Assignments&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-RIGHT: 7px; PADDING-LEFT: 7px"&gt;&lt;p&gt;SET @iValue -= 50&lt;br /&gt;&lt;br /&gt;UPDATE dimCustomer SET Balance += 200&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-RIGHT: 7px; PADDING-LEFT: 7px"&gt;&lt;p&gt;+=&lt;br /&gt;&lt;/p&gt;&lt;p&gt;-=&lt;br /&gt;&lt;/p&gt;&lt;p&gt;*=&lt;br /&gt;&lt;/p&gt;&lt;p&gt;/=&lt;br /&gt;&lt;/p&gt;&lt;p&gt;%=&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="PADDING-RIGHT: 7px; PADDING-LEFT: 7px; BACKGROUND: #4f81bd; BORDER-LEFT: medium none"&gt;&lt;p&gt;&lt;span style="color:white;"&gt;Multi-Row Inserts Using VALUES&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-RIGHT: 7px; PADDING-LEFT: 7px; BACKGROUND: #d8d8d8"&gt;&lt;p&gt;INSERT INTO dimProduct (Label, BusinessKey,LastUpdatedBy,LastUpdatedDate) VALUES&lt;br /&gt;     ('Grey Slate Paver 10x10',1111,'dbo','20091001 13:12:00'),&lt;br /&gt;     ('Blue Slate Paver 10x10',1112,'dbo','20091001 13:12:00'),&lt;br /&gt;     ('Black Slate Paver 10x10',1113,'dbo','20091001 13:12:00')&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-RIGHT: 7px; PADDING-LEFT: 7px; BACKGROUND: #d8d8d8"&gt;&lt;p&gt;The insert is executed as a single transaction.&lt;br /&gt;&lt;br /&gt;Interestingly, it can also be used like this:&lt;br /&gt;&lt;br /&gt;SELECT * FROM (VALUES&lt;br /&gt;     ('Grey Slate Paver 10x10',1111,'dbo','20091001 13:12:00')&lt;br /&gt;     ('Blue Slate Paver 10x10',1112,'dbo','20091001 13:12:00')&lt;br /&gt;     ('Black Slate Paver 10x10',1113,'dbo','20091001 13:12:00')&lt;br /&gt;) as p (Label, BusinessKey,LastUpdatedBy,LastUpdatedDate)&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="PADDING-RIGHT: 7px; PADDING-LEFT: 7px; BACKGROUND: #4f81bd; BORDER-LEFT: medium none"&gt;&lt;p&gt;&lt;span style="color:white;"&gt;MERGE&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-RIGHT: 7px; PADDING-LEFT: 7px"&gt;&lt;p&gt;MERGE INTO dbo.dimProduct as d&lt;br /&gt;USING dbo.dimProductStage as s ON d.ProductKey = s.ProductId&lt;br /&gt;WHEN MATCHED THEN&lt;br /&gt;     UPDATE SET&lt;br /&gt;          d.ProductName = s.ProductName,&lt;br /&gt;          d.ProductCategory = s.ProductCategory&lt;br /&gt;WHEN NOT MATCHED THEN&lt;br /&gt;&lt;/p&gt;&lt;p&gt;     INSERT (ProductName,ProductCategory)&lt;br /&gt;&lt;/p&gt;&lt;p&gt;     VALUES (s.ProductName, s.ProductCategory)&lt;br /&gt;&lt;/p&gt;&lt;p&gt;WHEN NOT MATCHED BY SOURCE THEN           DELETE&lt;br /&gt;OUTPUT $action,&lt;br /&gt;deleted.ProductId as DeletedId,&lt;br /&gt;inserted.ProductId as InsertedId;&lt;br /&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-RIGHT: 7px; PADDING-LEFT: 7px"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="PADDING-RIGHT: 7px; PADDING-LEFT: 7px; BACKGROUND: #4f81bd; BORDER-LEFT: medium none"&gt;&lt;p&gt;&lt;span style="color:white;"&gt;Grouping Sets&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-RIGHT: 7px; PADDING-LEFT: 7px; BACKGROUND: #d8d8d8"&gt;&lt;p&gt;SELECT Year(OrderDate) as OrderYear,&lt;br /&gt;     SalespersonId,&lt;br /&gt;     OrderType,&lt;br /&gt;     count(OrderId) as OrderCount,&lt;br /&gt;     sum(Amount) as OrderAmount&lt;br /&gt;FROM factOrders&lt;br /&gt;GROUP BY GROUPING SETS (&lt;br /&gt;(OrderType, Year(OrderDate)),&lt;br /&gt;(SalespersonId,OrderType, Year(OrderDate)),&lt;br /&gt;(SalespersonId, Year(OrderDate)),&lt;br /&gt;(Year(OrderDate)),&lt;br /&gt;&lt;/p&gt;&lt;p&gt;());&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-RIGHT: 7px; PADDING-LEFT: 7px; BACKGROUND: #d8d8d8"&gt;&lt;p&gt;() empty brackets represents an 'ALL' grouping&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="PADDING-RIGHT: 7px; PADDING-LEFT: 7px; BACKGROUND: #4f81bd; BORDER-LEFT: medium none"&gt;&lt;p&gt;&lt;span style="color:white;"&gt;Filtered Indexes&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-RIGHT: 7px; PADDING-LEFT: 7px"&gt;&lt;p&gt;CREATE NONCLUSTERED INDEX idxOrders_Product&lt;br /&gt;ON factOrders(OrderId,ProductId)&lt;br /&gt;WHERE CreditFlag IS NULL&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-RIGHT: 7px; PADDING-LEFT: 7px"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="PADDING-RIGHT: 7px; PADDING-LEFT: 7px; BACKGROUND: #4f81bd; BORDER-LEFT: medium none; BORDER-BOTTOM: 2.25pt solid"&gt;&lt;p&gt;&lt;span style="color:white;"&gt;Change Data Capture&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-RIGHT: 7px; PADDING-LEFT: 7px; BACKGROUND: #d8d8d8; BORDER-BOTTOM: 2.25pt solid"&gt;&lt;p&gt;&lt;em&gt;&lt;br /&gt;** to be discussed in further detail in an upcoming post **&lt;/em&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="PADDING-RIGHT: 7px; PADDING-LEFT: 7px; BACKGROUND: #d8d8d8; BORDER-BOTTOM: 2.25pt solid"&gt;&lt;p&gt;Tracks data changes into a table.&lt;br /&gt;Enabled using sys.sp_cdc_enable_db or sys.sp_cdc_enable_table&lt;br /&gt;Disabled using sys.sp_cdc_disable_db or sys.sp_cdc_disable_table&lt;br /&gt;Uses SQL Agent&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-5754489763515971836?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/5754489763515971836/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=5754489763515971836' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/5754489763515971836'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/5754489763515971836'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2008/10/what-new-in-sql-2008-part-1.html' title='What&amp;#39;s New in SQL 2008 - Part 1 - Functionality'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-4179203545116140744</id><published>2008-10-28T11:12:00.001+11:00</published><updated>2008-10-28T11:16:42.480+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Monitoring and Analysing'/><category scheme='http://www.blogger.com/atom/ns#' term='PerformancePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='Sharepoint 2007 (MOSS)'/><title type='text'>SharePoint Magazine - Part 2 available now</title><content type='html'>My next article for SharePoint Magazine is available now.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://sharepointmagazine.net/technical/administration/sell-sell-sell-why-build-a-dashboard-anyway-part-2-of-6"&gt;http://sharepointmagazine.net/technical/administration/sell-sell-sell-why-build-a-dashboard-anyway-part-2-of-6&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-4179203545116140744?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/4179203545116140744/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=4179203545116140744' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/4179203545116140744'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/4179203545116140744'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2008/10/sharepoint-magazine-part-2-available.html' title='SharePoint Magazine - Part 2 available now'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-7212662218546073744</id><published>2008-10-14T12:14:00.006+11:00</published><updated>2008-10-14T12:27:08.313+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Bug'/><category scheme='http://www.blogger.com/atom/ns#' term='Planning'/><category scheme='http://www.blogger.com/atom/ns#' term='PerformancePoint'/><title type='text'>PerformancePoint Planning:  Error When Deleting Members of a Member Set</title><content type='html'>&lt;span xmlns=""&gt;&lt;p&gt;Unfortunately I discovered a problem in PPS Planning today which caused me a few headaches... thought I would pass it on to you!! The issue occurs when editing/creating a dimension member set... a save will fail if you do an outdent and a delete member immediately afterwards. Let me demonstrate.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Let's presume you have a structure something like this:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="color:#0070c0;"&gt;--- Expenses&lt;br /&gt;--- --- Salaries &amp;amp; Related&lt;br /&gt;--- --- --- Salaries&lt;br /&gt;--- --- --- --- Base Salary&lt;br /&gt;--- --- --- --- Bonuses&lt;br /&gt;--- --- --- --- Allowances&lt;br /&gt;--- --- --- Tax Expense&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;But you want to remove the Salaries level and end up with a structure that looks like this:&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="color:#0070c0;"&gt;--- Expenses&lt;br /&gt;--- --- Salaries &amp;amp; Related&lt;br /&gt;--- --- --- Base Salary&lt;br /&gt;--- --- --- Bonuses&lt;br /&gt;--- --- --- Allowances&lt;br /&gt;--- --- Tax Expense&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;If you do this: &lt;/p&gt;&lt;ol&gt;&lt;li&gt;Outdent the 3 leaf level members &lt;/li&gt;&lt;li&gt;Remove the Salary level member &lt;/li&gt;&lt;li&gt;Save &lt;/li&gt;&lt;/ol&gt;&lt;p&gt;You will get an error when you save similar to the following:&lt;/p&gt;&lt;p&gt;&lt;a href="http://4.bp.blogspot.com/_VZHMsOn3uQo/SPP0oaO163I/AAAAAAAAAEA/e3DSxWex3Ms/s1600-h/Untitled.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5256814165145021298" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 471px; CURSOR: hand; HEIGHT: 137px; TEXT-ALIGN: center" height="108" alt="" src="http://4.bp.blogspot.com/_VZHMsOn3uQo/SPP0oaO163I/AAAAAAAAAEA/e3DSxWex3Ms/s400/Untitled.jpg" width="437" border="0" /&gt;&lt;/a&gt; &lt;div&gt;&lt;p&gt;In order for it to work correctly, you MUST (in this order): &lt;/p&gt;&lt;ol&gt;&lt;li&gt;Outdent the 3 leaf level members &lt;/li&gt;&lt;li&gt;Save &lt;/li&gt;&lt;li&gt;Remove the Salary level member &lt;/li&gt;&lt;li&gt;Save&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;I have logged this problem on Microsoft Connect. Please feel free to vote! &lt;a href="https://connect.microsoft.com/feedback/ViewFeedback.aspx?FeedbackID=375153&amp;amp;SiteID=181"&gt;https://connect.microsoft.com/feedback/ViewFeedback.aspx?FeedbackID=375153&amp;amp;SiteID=181&lt;/a&gt;&lt;span style="color:#1f497d;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-7212662218546073744?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/7212662218546073744/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=7212662218546073744' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/7212662218546073744'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/7212662218546073744'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2008/10/performancepoint-planning-error-when.html' title='PerformancePoint Planning:  Error When Deleting Members of a Member Set'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_VZHMsOn3uQo/SPP0oaO163I/AAAAAAAAAEA/e3DSxWex3Ms/s72-c/Untitled.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-1004424673346700247</id><published>2008-09-18T10:07:00.004+10:00</published><updated>2008-09-18T10:11:00.026+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PerformancePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='Sharepoint 2007 (MOSS)'/><title type='text'>SharePoint Magazine - Part 1 Out Now!</title><content type='html'>I've commenced a 6-part series on building PerformancePoint dashboards in SharePoint which you can read at &lt;a href="http://sharepointmagazine.net/technical/administration/getting-to-know-you-intro-to-sharepoint-bi-part-1-of-6"&gt;SharePoint Magazine&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I'll be releasing a new part each week for the next 6 weeks covering the various aspects of building dashboards - including why bother at all!&lt;br /&gt;&lt;br /&gt;Have a read if you're interested.  Feedback so far has been excellent.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-1004424673346700247?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/1004424673346700247/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=1004424673346700247' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/1004424673346700247'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/1004424673346700247'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2008/09/sharepoint-magazine-part-1-out-now.html' title='SharePoint Magazine - Part 1 Out Now!'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-3659004845254313280</id><published>2008-08-25T11:57:00.001+10:00</published><updated>2008-08-25T11:58:39.011+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>Interesting Read</title><content type='html'>Great article comparing the PIVOT (SQL 2005+) function with doing it the old-fashioned way!  Take a read...&lt;br /&gt;&lt;br /&gt;http://www.sqlservercentral.com/articles/T-SQL/63681/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-3659004845254313280?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/3659004845254313280/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=3659004845254313280' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/3659004845254313280'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/3659004845254313280'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2008/08/interesting-read.html' title='Interesting Read'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-3937369267421569383</id><published>2008-07-03T16:36:00.014+10:00</published><updated>2008-07-04T09:07:52.429+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>SQL:  Concatenating Rows into a Scalar Value</title><content type='html'>This is an issue which pops up from time to time, often when passing values back to .Net applications.  &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;The Problem&lt;/strong&gt;&lt;br /&gt;Taking values in rows and creating a single string value containing a delimited list of all those values.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;The Old Solution&lt;/strong&gt;&lt;br /&gt;The method I have used in the past is to use the FOR XML clause and build a string that way.  It works.&lt;br /&gt;&lt;br /&gt;&lt;TABLE cellSpacing=0 cellPadding=4 width="100%" border=1&gt;&lt;TR&gt;&lt;TD&gt;&lt;CODE style="FONT-SIZE: 12px"&gt;&lt;SPAN style="COLOR: blue"&gt;DECLARE&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #434343"&gt;@DepartmentName&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;VARCHAR&lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;1000&lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;)&lt;/SPAN&gt;&lt;br /&gt;&lt;CODE style="FONT-SIZE: 12px  FONT-COLOR: black"&gt;&lt;FONT style="COLOR: blue"&gt;SELECT &lt;/FONT&gt;@DepartmentName = Name + &lt;FONT style="COLOR: red"&gt;'&lt;/FONT&gt;,&lt;FONT style="COLOR: red"&gt;'&lt;/FONT&gt;&lt;br /&gt;&lt;FONT style="COLOR: blue"&gt;FROM &lt;/FONT&gt;AdventureWorks.HumanResources.Department&lt;br /&gt;&lt;SPAN style="COLOR: blue"&gt;WHERE&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;GroupName&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;=&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: red"&gt;'Executive&amp;nbsp;General&amp;nbsp;and&amp;nbsp;Administration'&lt;/SPAN&gt;&lt;br /&gt;&lt;FONT style="COLOR: blue"&gt;FOR XML PATH &lt;/FONT&gt;(&lt;FONT style="COLOR: red"&gt;''&lt;/FONT&gt;)&lt;br /&gt;&lt;SPAN style="COLOR: blue"&gt;SELECT&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #434343"&gt;@DepartmentName&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;AS&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;DepartmentNames&lt;/SPAN&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TABLE&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;The Sexier Solution&lt;/strong&gt;&lt;br /&gt;This idea comes courtesy of Ken Simmons at &lt;a href="http://www.mssqltips.com/tip.asp?tip=1521"&gt;SQL Tips&lt;/a&gt;... so simple and I'm kind of annoyed that I've never tried it myself!&lt;br /&gt;&lt;br /&gt;&lt;TABLE cellSpacing=0 cellPadding=4 width="100%" border=1&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;CODE style="FONT-SIZE: 12px"&gt;&lt;SPAN style="COLOR: blue"&gt;DECLARE&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #434343"&gt;@DepartmentName&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;VARCHAR&lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;1000&lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;)&lt;/SPAN&gt;&lt;br /&gt;&lt;SPAN style="COLOR: blue"&gt;SELECT&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #434343"&gt;@DepartmentName&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;=&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: magenta"&gt;COALESCE&lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;(&lt;/SPAN&gt;&lt;SPAN style="COLOR: #434343"&gt;@DepartmentName&lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;,&lt;/SPAN&gt;&lt;SPAN style="COLOR: red"&gt;''&lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;)&amp;nbsp;+&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;Name&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: gray"&gt;+&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: red"&gt;';'&amp;nbsp; &lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;FROM&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;AdventureWorks.HumanResources.Department&lt;/SPAN&gt;&lt;br /&gt;&lt;SPAN style="COLOR: blue"&gt;WHERE&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;GroupName&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;=&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: red"&gt;'Executive&amp;nbsp;General&amp;nbsp;and&amp;nbsp;Administration'&lt;/SPAN&gt;&lt;br /&gt;&lt;SPAN style="COLOR: blue"&gt;SELECT&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #434343"&gt;@DepartmentName&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;AS&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="COLOR: black"&gt;DepartmentNames&lt;/SPAN&gt;&lt;/CODE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;What Were the Actual Results from Testing?&lt;/strong&gt;&lt;br /&gt;Sadly, the sexier solution under-performs in comparison to the FOR XML solution.&lt;br /&gt;&lt;br /&gt;&lt;Table border = 1&gt;&lt;TR&gt;&lt;TD&gt;Method&lt;td&gt;Milliseconds&lt;TD&gt;BytesReceived&lt;td&gt;Rows Returned&lt;br /&gt;&lt;TR&gt;&lt;TD&gt;FOR XML&lt;td&gt;78&lt;TD&gt;9891&lt;td&gt;3&lt;br /&gt;&lt;TR&gt;&lt;TD&gt;COALESCE&lt;td&gt;265&lt;TD&gt;10505&lt;td&gt;60921&lt;/TABLE&gt;&lt;br /&gt;&lt;br /&gt;Obviously this lag is due to the number of rows which are returned to the client.  Based on the stats, the FOR XML does all it's aggregation and concatenation server-side whereas the COALESCE method does it client-side.&lt;br /&gt;&lt;br /&gt;So I guess that means the old way is still the best.  Or is it?  I wonder in what other circumstances COALESCE could be used?  Ok so it under-performed in this instance but I suspect there are other uses which could be of great value.  Got any ideas?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-3937369267421569383?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/3937369267421569383/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=3937369267421569383' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/3937369267421569383'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/3937369267421569383'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2008/07/sql-concatenating-rows-into-scalar.html' title='SQL:  Concatenating Rows into a Scalar Value'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-2662576577361641395</id><published>2008-05-20T10:49:00.018+10:00</published><updated>2008-05-20T11:24:30.672+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Reporting Services (SSRS)'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>Reporting Services:  Passing MultiValue Parameters</title><content type='html'>I recently came across an &lt;a href="http://www.sqlservercentral.com/articles/Reporting+Services/62731/"&gt;article&lt;/a&gt; by Wayne Sheffield on SQL Server Central which contained a very neat idea for passing multi-value parameters from SSRS to a SQL stored proc by using XML. &lt;br /&gt;&lt;br /&gt;Because SQL stored procs can't handle arrays, it can't handle parameters with multiple values.  There are a few ugly ways around this of course by using delimiters and manipulating strings but that just isn't pretty at all.  Wayne's idea is to use XML string parameters.&lt;br /&gt;&lt;br /&gt;So SSRS would send a string in the following format:&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#000066;"&gt;&lt;br /&gt;&amp;lt;root&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;node&amp;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;lt;element&amp;gt;element data&amp;lt;/element&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/node&amp;gt;&lt;br /&gt;&amp;lt;/root&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It would look something like this:&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#000066;"&gt;&lt;br /&gt;&amp;lt;customers&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;customer&amp;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;lt;customerid&amp;gt;1234&amp;lt;/customerid&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/customer&amp;gt;&lt;br /&gt;&amp;lt;/customers&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Wayne has written a bit of code which you can add to your report or create a DLL for which can then be referenced by your report.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#000066;"&gt;&lt;br /&gt;Function ReturnXML(ByVal MultiValueList As Object, ByVal Root As String, ByVal Node As String&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;Returns an XML string by using the specified values.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;       Parameters:MultiValueList - a multi value list from SSRS&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;       Root, Node, Element - String to use in building the XML string&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;       Dim ReturnString = ""&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;       Dim sParamItem As Object&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;       ReturnString = "&lt;" &amp;amp; Root &amp;amp; "&gt;"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;       For Each sParamItem In MultiValueList&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;              ReturnString &amp;amp;= "&lt;" &amp;amp; Node &amp;amp; "&gt;&lt;" &amp;amp; Element &amp;amp; "&gt;" &amp;amp; Replace(Replace(sParamItem,"&amp;amp;","&amp;amp;"),"&lt;", "&amp;lt;") &amp;amp; "&lt;/" &amp;amp; Element &amp;amp; "&gt;&lt;/" &amp;amp; Node &amp;amp; "&gt;"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Next&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ReturnString &amp;amp;= "&lt;/" &amp;amp; Root &amp;amp; "&gt;"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Return (ReturnString)&lt;br /&gt;End Function &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This code would be referenced in your Reporting Services parameter like: &lt;br /&gt;&lt;br /&gt;&lt;span style="color:#000066;"&gt;ReturnXML(Parameters!MultiValue.Value, "Customers", "Customer", "CustomerId")&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;To then use your XML parameter within the stored proc:&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#000066;"&gt;Select CustomerId, CustomerName, ActiveFlag &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000066;"&gt;From tCustomer a &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000066;"&gt;INNER JOIN @ipCustomerList.nodes('/Customers/Customer') AS x(item) ON a.CustomerId = x.item.value('CustomerId[1]', 'integer')&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Pretty handy no?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-2662576577361641395?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/2662576577361641395/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=2662576577361641395' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/2662576577361641395'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/2662576577361641395'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2008/05/reporting-services-passing-multivalue.html' title='Reporting Services:  Passing MultiValue Parameters'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-8986017692498694111</id><published>2008-05-08T10:42:00.007+10:00</published><updated>2008-05-08T11:42:50.146+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Data-Mining'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>Datamining Part II - Terminology</title><content type='html'>Datamining, like all other IT subjects has it's own lingo. This quick blog post will explain them.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Datamining&lt;br /&gt;&lt;/strong&gt;Datamining attempts to deduce knowledge by examining existing data&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Case&lt;br /&gt;&lt;/strong&gt;A case is a unit of measure.  &lt;br /&gt;It equates to a single appearance of an entity.  In relational terms that would mean one row in a table.  A case includes all the information relating to an entity.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Variable&lt;/strong&gt;&lt;br /&gt;The attributes of a case.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Model&lt;/strong&gt;&lt;br /&gt;A model stores information about variables, the algorithms used and their parameters and extracted knowledge.  A model can be descriptive or predictive - it's behaviour is driven by the algorithm which was used to derive it.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Structure&lt;/strong&gt;&lt;br /&gt;A structure stores models.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Algorithm&lt;br /&gt;&lt;/strong&gt;My definition here is from the perspective of datamining rather than a general definition.  An algorithm is a method of mining data.  Some methods are predictive (forecasting) and some are relative (showing relationships).  7 algorithms are included with SQL Server 2005.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Neural Network&lt;/strong&gt;&lt;br /&gt;An algorithm designed to predict in a non-linear fashion, like a human neuron.  Often used to predict outcomes based on previous behaviour.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Decision Tree&lt;/strong&gt;&lt;br /&gt;An algorithm which provides tree-like output showing paths or rules to reach an end point or value.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Naive Bayes&lt;/strong&gt;&lt;br /&gt;An algorithm often used for classifying text documents, it shows probability based on independant data.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Clustering&lt;/strong&gt;&lt;br /&gt;An algorithm which groups cases based on similar characteristics.  Often used to identify anomalies or outliers.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Association&lt;/strong&gt;&lt;br /&gt;An algorithm describes how often events have occured together.  Defines an 'itemset' from a single transaction.  Often used to detect cross-selling opportunities.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Sequence&lt;/strong&gt;&lt;br /&gt;An algorithm which is every similar to the association algorithm except that it also includes time.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Time Series&lt;/strong&gt;&lt;br /&gt;An algorithm used to forecast future values of a time series based on past values.  Also known as Auto Regression Trees (ART).&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Cluster&lt;br /&gt;&lt;/strong&gt;A cluster is a grouping of related data.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Discrete&lt;/strong&gt;&lt;br /&gt;This is more a statistical term than a strictly datamining term however it is used frequently - hence it's inclusion here.  Discrete refers to values which are not sequential and have a finite set of values eg true/false&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Continuous&lt;/strong&gt;&lt;br /&gt;Continuous data can have any value in an interval of real numbers. That is, the value does not have to be an integer. Continuous is the opposite of discrete.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Outlier&lt;/strong&gt;&lt;br /&gt;Data that falls well outside the statistical norms of other data.  An outlier is data that should be closely examined.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Antecedent&lt;/strong&gt;&lt;br /&gt;When an association between two variables is defined, the first item (or left-hand side) is called the antecedent. For example, in the relationship "When a prospector buys a pick, he buys a shovel 14% of the time," "buys a pick" is the antecedent. &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Leaf&lt;/strong&gt;&lt;br /&gt;A node at it's lowest level - it has no more splits.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Mean&lt;/strong&gt;&lt;br /&gt;The arithmetic average of a dataset&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Median&lt;/strong&gt;&lt;br /&gt;The arithmetic middle value of a dataset&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Standard Deviation&lt;br /&gt;&lt;/strong&gt;Measures the spread of the values in the data set around the median.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Skew&lt;/strong&gt;&lt;br /&gt;Measures the symmetry of the data set ie is it skewed in a particular direction on either side of the median&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Kurtosis&lt;/strong&gt;&lt;br /&gt;Measures whether the data set has lots of peaks or is flat in relation to a normal distribution&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-8986017692498694111?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/8986017692498694111/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=8986017692498694111' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/8986017692498694111'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/8986017692498694111'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2008/05/datamining-part-ii-terminology.html' title='Datamining Part II - Terminology'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-5135965866014817602</id><published>2008-05-05T09:04:00.005+10:00</published><updated>2008-05-05T09:25:38.881+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Server Administration'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>SQL Server Releases</title><content type='html'>Microsoft have announced that they are changing their approach to releases for SQL Server. This is interesting because SQL Server releases can be a touchy subject for businesses, particularly those with big server farms. Inevitably the development team wants the Service Pack to be installed ASAP whereas the server team is keen to protect their stable server and pretend service packs don't exist. This means a lot of pushing and shoving.&lt;br /&gt;&lt;br /&gt;This new approach should help to alleviate the pressure a little but I'm not altogether convinced.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;· Smaller Service Packs which will be easier to deploy&lt;/strong&gt;&lt;br /&gt;&lt;em&gt;I suspect smaller service packs will make server teams less inclined to come to the party because less inclusions on a per service pack basis inherently implies more service packs.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;· Higher quality of Service Pack releases due to reduced change introduced&lt;/strong&gt;&lt;br /&gt;&lt;em&gt;It's all very well to say that the quality is better but that's a very airy fairy 'benefit' which I can't imagine will go down very effectively with server teams as an argument for implementation. It's just not very quantitative which means server teams are likely to ignore it.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;· Predictable Service Pack scheduling to allow for better customer test scheduling and deployment planning.&lt;/strong&gt;&lt;br /&gt;&lt;em&gt;On this point, I demure. This can have a huge impact on getting releases implemented. Presuming of course that you can get your server team to operate on a scheduled release process themselves. It's all very well for the vendor to do it but if the server team doesn't ALSO do it, there's no gain. That said, I believe that such a process SHOULD be followed. I just don't see it as terribly likely. I fervently hope to be disproven.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;It's really easy to be cynical about this approach and say 'my organisation will never do this'. Which is the trap I've fallen into here I realise, but the fact of the matter is, good on Microsoft for considering these issues and attempting to find ways to improve them. The approach is right and a positive move. Now the onus is on us to follow in their footsteps. This should be a wakeup call to server and development teams to find more common ground, to develop processes which satisfy everyone's needs and to communicate with each other better.&lt;br /&gt;&lt;br /&gt;For more details:&lt;br /&gt;&lt;a href="http://blogs.msdn.com/sqlreleaseservices/archive/2008/04/27/a-changed-approach-to-service-packs.aspx"&gt;http://blogs.msdn.com/sqlreleaseservices/archive/2008/04/27/a-changed-approach-to-service-packs.aspx&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-5135965866014817602?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/5135965866014817602/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=5135965866014817602' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/5135965866014817602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/5135965866014817602'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2008/05/sql-server-releases.html' title='SQL Server Releases'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-8677734580197015674</id><published>2008-04-15T09:36:00.008+10:00</published><updated>2008-04-15T11:05:37.570+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Data-Mining'/><category scheme='http://www.blogger.com/atom/ns#' term='Certification'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>Datamining – Reviewing the Data Source</title><content type='html'>&lt;span xmlns=""&gt;&lt;p&gt;I'm currently going through the Training Kit for Exam 40-445 – the MCTS SQL BI exam. And data-mining, joy of joys, an area where I'm not exactly at expert level, is the focus of my study. And of course, by all reports, data-mining makes up a large chunk of the exam.&lt;/p&gt;&lt;p&gt;In the book, they provide sample code for the 4 moments of a particular attribute which can be used to validate test vs training data in reviewing source data for a data mining project. &lt;/p&gt;&lt;p&gt;&lt;strong&gt;The Four Moments&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;Moments are individual measures or parameters of the moment method. The moment method estimates and equates samples of data. The moments most commonly used in data mining are:&lt;/p&gt;&lt;p&gt;Mean – the centre point of the data set&lt;br /&gt;Standard Deviation – measures the spread of the values in the data set around the centre point&lt;br /&gt;Skew – measures the symmetry of the data set ie is it skewed in a particular direction on either side of the centre point&lt;br /&gt;Kurtosis – measures whether the data set has lots of peaks or is flat in relation to a normal distribution &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Datasets&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;In reviewing source data, you need a training data set (to teach the patterns) and a test data set to validate whether that which was learnt is in fact correct!&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;In the code below, we are returned 2 rows – a row for each dataset - showing the 4 moments for both. If the values are fairly similar in both rows then we know the sampling is valid. &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Sample Code&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;This example uses, from the AdventureWorksDW database: &lt;/p&gt;&lt;ul style="MARGIN-LEFT: 38pt"&gt;&lt;li&gt;the 'CustomerKey' column in order to identify records for sampling &lt;/li&gt;&lt;br /&gt;&lt;li&gt;the 'Age' column as the attribute which we are measuring the 4 moments against&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;--populate testing data&lt;br /&gt;Select * into TK445_Ch09_TestSet&lt;br /&gt;from vTargetMail&lt;br /&gt;where rand(checksum(newid())%1000000000+CustomerKey) &lt;.2&lt;br /&gt;&lt;br /&gt;-- populate training data&lt;br /&gt;Select * into TK445_Ch09_TrainingSet&lt;br /&gt;from vTargetMail&lt;br /&gt;where rand(checksum(newid())%1000000000+CustomerKey) &lt;.2&lt;br /&gt;except select * from TK445_Ch09_TestSet&lt;br /&gt;&lt;br /&gt;--can be used to validate that datasets have been populated&lt;br /&gt;--select 1,* from TK445_Ch09_TrainingSet union all select 2,* from TK445_Ch09_TestSet&lt;br /&gt;&lt;br /&gt;SELECT&lt;br /&gt;Mean = MIN(m.mean),&lt;br /&gt;StdDev = Min(m.StdDev),&lt;br /&gt;Skew = SUM(((Age*1.0-m.mean)/m.StdDev)*((Age*1.0-m.mean)/m.StdDev)*((Age*1.0-m.mean)/m.StdDev))*MIN(m.corrfact1),&lt;br /&gt;Kurt = sum(square(square(((Age*1.0-m.mean)/m.StdDev)))) * MIN(m.corrfact2) - min(m.subfact)&lt;br /&gt;FROM TK445_Ch09_TrainingSet v&lt;br /&gt;CROSS JOIN (SELECT&lt;br /&gt;mean = AVG(age*1.0),&lt;br /&gt;stddev = STDEV(Age),&lt;br /&gt;corrfact1 = count(*)*1.0 / (Count(*)-1) / (count(*)-2),&lt;br /&gt;corrfact2 = count(*)*1.0 * (Count(*)+1) / (count(*)-1) / COUNT(*)-2 / COUNT(*)-3,&lt;br /&gt;subfact = 3.0 * SQUARE((COUNT(*)-1)) / (COUNT(*)-2) / (COUNT(*)-3)&lt;br /&gt;FROM TK445_Ch09_TrainingSet) m&lt;br /&gt;&lt;br /&gt;UNION&lt;br /&gt;&lt;br /&gt;SELECT&lt;br /&gt;Mean = MIN(m.mean),&lt;br /&gt;StdDev = Min(m.StdDev),&lt;br /&gt;Skew = SUM(((Age*1.0-m.mean)/m.StdDev)*((Age*1.0-m.mean)/m.StdDev)*((Age*1.0-m.mean)/m.StdDev))*MIN(m.corrfact1),&lt;br /&gt;Kurt = sum(square(square(((Age*1.0-m.mean)/m.StdDev)))) * MIN(m.corrfact2) - min(m.subfact)&lt;br /&gt;FROM TK445_Ch09_TestSet v&lt;br /&gt;CROSS JOIN (SELECT&lt;br /&gt;mean = AVG(age*1.0),&lt;br /&gt;stddev = STDEV(Age),&lt;br /&gt;corrfact1 = count(*)*1.0 / (Count(*)-1) / (count(*)-2),&lt;br /&gt;corrfact2 = count(*)*1.0 * (Count(*)+1) / (count(*)-1) / COUNT(*)-2 / COUNT(*)-3,&lt;br /&gt;subfact = 3.0 * SQUARE((COUNT(*)-1)) / (COUNT(*)-2) / (COUNT(*)-3)&lt;br /&gt;FROM TK445_Ch09_TrainingSet) m &lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-8677734580197015674?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/8677734580197015674/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=8677734580197015674' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/8677734580197015674'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/8677734580197015674'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2008/04/datamining-reviewing-data-source.html' title='Datamining – Reviewing the Data Source'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-2334196799662329451</id><published>2008-03-13T18:07:00.006+11:00</published><updated>2008-08-08T11:08:28.307+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PerformancePoint'/><category scheme='http://www.blogger.com/atom/ns#' term='Certification'/><title type='text'>Microsoft 70-556 Exam - MCTS Performance Point</title><content type='html'>Last week I completed and successfully passed the 70-556 exam - which gives me an MCTS PerformancePoint certification.&lt;br /&gt;&lt;br /&gt;The exam was relatively simple - I scored highly in all areas but one.  Obviously a weak point there on my part... my success in the other areas was due to a week and a bit of study using the Rational Guides to PerformancePoint (authored by my esteemed colleagues Adrian Downes and Nick Barclay) - the &lt;a href="http://www.amazon.com/Rational-Planning-Microsoft-Office-PerformancePoint/dp/1932577424"&gt;Planning&lt;/a&gt; volume and the &lt;a href="http://www.amazon.com/Rational-Monitoring-Analyzing-Microsoft-PerformancePoint/dp/1932577416/ref=pd_bxgy_b_img_b"&gt;Monitoring &amp; Analyzing&lt;/a&gt; Volume.  Much thanks to them!&lt;br /&gt;&lt;br /&gt;The exam is strongly skewed towards Planning - only a few questions on Monitoring &amp;amp; Analysing - and the M&amp;amp;A questions were very simple.  There are quite a few questions on Business Rules and Configuring Models &amp;amp; Dimensions - and these are complex areas so spend time on them in your study.&lt;br /&gt;&lt;br /&gt;If you are doing the exam and using the Rational Guide books, don't ignore the Bonus chapters - you'll need them!&lt;br /&gt;&lt;br /&gt;Next up is the 70-445 (MCTS SQL BI) which is much harder... I'm currently spending a lot of time with the &lt;a href="http://www.amazon.com/gp/product/0735623414"&gt;Microsoft Training kit&lt;/a&gt;.  Wish me luck...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-2334196799662329451?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/2334196799662329451/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=2334196799662329451' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/2334196799662329451'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/2334196799662329451'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2008/03/microsoft-70-556-exam-mcts-performance.html' title='Microsoft 70-556 Exam - MCTS Performance Point'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-7131892088179685950</id><published>2008-02-21T13:05:00.004+11:00</published><updated>2008-02-21T13:09:42.043+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ActiveDirectory'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>Using TSQL Queries for AD Authentication</title><content type='html'>&lt;span xmlns=""&gt;&lt;p&gt;Yes you can directly query AD using TSQL queries. And it's REALLY easy.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Why you ask – well, LDAP can be painfully slow if you have to trawl through groups eg if you are storing the results in a table or outputting them to screen or suchlike. I've found this method to be pretty reliable and reasonable with regards to performance.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;First things first… on a SQL server, you need to create a linked server to AD as follows:&lt;br /&gt;&lt;/p&gt;&lt;p style="MARGIN-LEFT: 72pt"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="color:blue;"&gt;EXEC&lt;/span&gt; master&lt;span style="color:gray;"&gt;.&lt;/span&gt;dbo&lt;span style="color:gray;"&gt;.&lt;/span&gt;&lt;span style="color:maroon;"&gt;sp_addlinkedserver&lt;/span&gt; @server &lt;span style="color:gray;"&gt;=&lt;/span&gt; N&lt;span style="color:red;"&gt;'ADSI'&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt; @srvproduct&lt;span style="color:gray;"&gt;=&lt;/span&gt;N&lt;span style="color:red;"&gt;'Active Directory Service &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="color:red;"&gt;Interfaces'&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt; @provider&lt;span style="color:gray;"&gt;=&lt;/span&gt;N&lt;span style="color:red;"&gt;'ADSDSOObject'&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt; @datasrc&lt;span style="color:gray;"&gt;=&lt;/span&gt;N&lt;span style="color:red;"&gt;'adsdatasource'&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Courier New;"&gt;GO&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="color:blue;"&gt;EXEC&lt;/span&gt; master&lt;span style="color:gray;"&gt;.&lt;/span&gt;dbo&lt;span style="color:gray;"&gt;.&lt;/span&gt;&lt;span style="color:maroon;"&gt;sp_serveroption&lt;/span&gt; @server&lt;span style="color:gray;"&gt;=&lt;/span&gt;N&lt;span style="color:red;"&gt;'ADSI'&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt; @optname&lt;span style="color:gray;"&gt;=&lt;/span&gt;N&lt;span style="color:red;"&gt;'collation compatible'&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt; @optvalue&lt;span style="color:gray;"&gt;=&lt;/span&gt;N&lt;span style="color:red;"&gt;'false'&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Courier New;"&gt;GO&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="color:blue;"&gt;EXEC&lt;/span&gt; master&lt;span style="color:gray;"&gt;.&lt;/span&gt;dbo&lt;span style="color:gray;"&gt;.&lt;/span&gt;&lt;span style="color:maroon;"&gt;sp_serveroption&lt;/span&gt; @server&lt;span style="color:gray;"&gt;=&lt;/span&gt;N&lt;span style="color:red;"&gt;'ADSI'&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt; @optname&lt;span style="color:gray;"&gt;=&lt;/span&gt;N&lt;span style="color:red;"&gt;'data access'&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt; @optvalue&lt;span style="color:gray;"&gt;=&lt;/span&gt;N&lt;span style="color:red;"&gt;'true'&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Courier New;"&gt;GO&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="color:blue;"&gt;EXEC&lt;/span&gt; master&lt;span style="color:gray;"&gt;.&lt;/span&gt;dbo&lt;span style="color:gray;"&gt;.&lt;/span&gt;&lt;span style="color:maroon;"&gt;sp_serveroption&lt;/span&gt; @server&lt;span style="color:gray;"&gt;=&lt;/span&gt;N&lt;span style="color:red;"&gt;'ADSI'&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt; @optname&lt;span style="color:gray;"&gt;=&lt;/span&gt;N&lt;span style="color:red;"&gt;'dist'&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt; @optvalue&lt;span style="color:gray;"&gt;=&lt;/span&gt;N&lt;span style="color:red;"&gt;'false'&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Courier New;"&gt;GO&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="color:blue;"&gt;EXEC&lt;/span&gt; master&lt;span style="color:gray;"&gt;.&lt;/span&gt;dbo&lt;span style="color:gray;"&gt;.&lt;/span&gt;&lt;span style="color:maroon;"&gt;sp_serveroption&lt;/span&gt; @server&lt;span style="color:gray;"&gt;=&lt;/span&gt;N&lt;span style="color:red;"&gt;'ADSI'&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt; @optname&lt;span style="color:gray;"&gt;=&lt;/span&gt;N&lt;span style="color:red;"&gt;'pub'&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt; @optvalue&lt;span style="color:gray;"&gt;=&lt;/span&gt;N&lt;span style="color:red;"&gt;'false'&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Courier New;"&gt;GO&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="color:blue;"&gt;EXEC&lt;/span&gt; master&lt;span style="color:gray;"&gt;.&lt;/span&gt;dbo&lt;span style="color:gray;"&gt;.&lt;/span&gt;&lt;span style="color:maroon;"&gt;sp_serveroption&lt;/span&gt; @server&lt;span style="color:gray;"&gt;=&lt;/span&gt;N&lt;span style="color:red;"&gt;'ADSI'&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt; @optname&lt;span style="color:gray;"&gt;=&lt;/span&gt;N&lt;span style="color:red;"&gt;'rpc'&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt; @optvalue&lt;span style="color:gray;"&gt;=&lt;/span&gt;N&lt;span style="color:red;"&gt;'false'&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Courier New;"&gt;GO&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="color:blue;"&gt;EXEC&lt;/span&gt; master&lt;span style="color:gray;"&gt;.&lt;/span&gt;dbo&lt;span style="color:gray;"&gt;.&lt;/span&gt;&lt;span style="color:maroon;"&gt;sp_serveroption&lt;/span&gt; @server&lt;span style="color:gray;"&gt;=&lt;/span&gt;N&lt;span style="color:red;"&gt;'ADSI'&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt; @optname&lt;span style="color:gray;"&gt;=&lt;/span&gt;N&lt;span style="color:red;"&gt;'rpc out'&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt; @optvalue&lt;span style="color:gray;"&gt;=&lt;/span&gt;N&lt;span style="color:red;"&gt;'false'&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Courier New;"&gt;GO&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="color:blue;"&gt;EXEC&lt;/span&gt; master&lt;span style="color:gray;"&gt;.&lt;/span&gt;dbo&lt;span style="color:gray;"&gt;.&lt;/span&gt;&lt;span style="color:maroon;"&gt;sp_serveroption&lt;/span&gt; @server&lt;span style="color:gray;"&gt;=&lt;/span&gt;N&lt;span style="color:red;"&gt;'ADSI'&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt; @optname&lt;span style="color:gray;"&gt;=&lt;/span&gt;N&lt;span style="color:red;"&gt;'sub'&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt; @optvalue&lt;span style="color:gray;"&gt;=&lt;/span&gt;N&lt;span style="color:red;"&gt;'false'&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Courier New;"&gt;GO&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="color:blue;"&gt;EXEC&lt;/span&gt; master&lt;span style="color:gray;"&gt;.&lt;/span&gt;dbo&lt;span style="color:gray;"&gt;.&lt;/span&gt;&lt;span style="color:maroon;"&gt;sp_serveroption&lt;/span&gt; @server&lt;span style="color:gray;"&gt;=&lt;/span&gt;N&lt;span style="color:red;"&gt;'ADSI'&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt; @optname&lt;span style="color:gray;"&gt;=&lt;/span&gt;N&lt;span style="color:red;"&gt;'connect timeout'&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt; @optvalue&lt;span style="color:gray;"&gt;=&lt;/span&gt;N&lt;span style="color:red;"&gt;'0'&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Courier New;"&gt;GO&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="color:blue;"&gt;EXEC&lt;/span&gt; master&lt;span style="color:gray;"&gt;.&lt;/span&gt;dbo&lt;span style="color:gray;"&gt;.&lt;/span&gt;&lt;span style="color:maroon;"&gt;sp_serveroption&lt;/span&gt; @server&lt;span style="color:gray;"&gt;=&lt;/span&gt;N&lt;span style="color:red;"&gt;'ADSI'&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt; @optname&lt;span style="color:gray;"&gt;=&lt;/span&gt;N&lt;span style="color:red;"&gt;'collation name'&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt; @optvalue&lt;span style="color:gray;"&gt;=null&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Courier New;"&gt;GO&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="color:blue;"&gt;EXEC&lt;/span&gt; master&lt;span style="color:gray;"&gt;.&lt;/span&gt;dbo&lt;span style="color:gray;"&gt;.&lt;/span&gt;&lt;span style="color:maroon;"&gt;sp_serveroption&lt;/span&gt; @server&lt;span style="color:gray;"&gt;=&lt;/span&gt;N&lt;span style="color:red;"&gt;'ADSI'&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt; @optname&lt;span style="color:gray;"&gt;=&lt;/span&gt;N&lt;span style="color:red;"&gt;'lazy schema validation'&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt; @optvalue&lt;span style="color:gray;"&gt;=&lt;/span&gt;N&lt;span style="color:red;"&gt;'false'&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Courier New;"&gt;GO&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="color:blue;"&gt;EXEC&lt;/span&gt; master&lt;span style="color:gray;"&gt;.&lt;/span&gt;dbo&lt;span style="color:gray;"&gt;.&lt;/span&gt;&lt;span style="color:maroon;"&gt;sp_serveroption&lt;/span&gt; @server&lt;span style="color:gray;"&gt;=&lt;/span&gt;N&lt;span style="color:red;"&gt;'ADSI'&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt; @optname&lt;span style="color:gray;"&gt;=&lt;/span&gt;N&lt;span style="color:red;"&gt;'query timeout'&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt; @optvalue&lt;span style="color:gray;"&gt;=&lt;/span&gt;N&lt;span style="color:red;"&gt;'0'&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Courier New;"&gt;GO&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="color:blue;"&gt;EXEC&lt;/span&gt; master&lt;span style="color:gray;"&gt;.&lt;/span&gt;dbo&lt;span style="color:gray;"&gt;.&lt;/span&gt;&lt;span style="color:maroon;"&gt;sp_serveroption&lt;/span&gt; @server&lt;span style="color:gray;"&gt;=&lt;/span&gt;N&lt;span style="color:red;"&gt;'ADSI'&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt; @optname&lt;span style="color:gray;"&gt;=&lt;/span&gt;N&lt;span style="color:red;"&gt;'use remote collation'&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt; @optvalue&lt;span style="color:gray;"&gt;=&lt;/span&gt;N&lt;span style="color:red;"&gt;'true'&lt;br /&gt;&lt;/span&gt;GO&lt;/span&gt;&lt;/p&gt;&lt;p&gt;That's all the configuration you have to do. You are good to go! &lt;/p&gt;&lt;p&gt;Below is an example of the TSQL syntax. &lt;/p&gt;&lt;p&gt;Note that the &lt;span style="color:#548dd4;"&gt;DC&lt;/span&gt; is the domain in which the AD resides – in this instance it has three parts &lt;span style="font-family:Courier New;color:red;"&gt;MyDomainName,DC=MyTopLevelDomain,DC=MyDomainCountryCode &lt;/span&gt;eg &lt;span style="color:#548dd4;"&gt;DC=microsoft,DC=com,DC=au.  &lt;span style="color:#000000;"&gt;In this example, I am returning the username of all users who are a member of the AD group called GAMyADGroupName.&lt;/span&gt; &lt;/span&gt;This example checks if a particular user is a member of a particular AD group: &lt;/p&gt;&lt;p style="MARGIN-LEFT: 36pt"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="color:blue;"&gt;SELECT&lt;/span&gt; &lt;span style="color:gray;"&gt;*&lt;/span&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;FROM&lt;/span&gt; &lt;span style="color:blue;"&gt;OPENQUERY&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;ADSI&lt;span style="color:gray;"&gt;,&lt;/span&gt;&lt;br /&gt;&lt;span style="color:red;"&gt;'SELECT sAMAccountName&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Courier New;color:red;"&gt;    FROM ''LDAP://DC=csr,DC=com,DC=au''&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:Courier New;color:red;"&gt;    WHERE objectCategory = ''Person''&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:Courier New;color:red;"&gt;    AND objectClass = ''user''&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:Courier New;color:red;"&gt;    AND memberOf = ''CN=GAMyADGroupName,OU=Other,OU=Global Groups,OU=Security Groups,DC=MyDomainName,DC=com,DC=au''&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="color:red;"&gt;AND sAMAccountName = ''MyUserName'''&lt;/span&gt;&lt;span style="color:gray;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN-LEFT: 36pt"&gt; &lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-7131892088179685950?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/7131892088179685950/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=7131892088179685950' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/7131892088179685950'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/7131892088179685950'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2008/02/using-tsql-queries-for-ad.html' title='Using TSQL Queries for AD Authentication'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-8788040357307282889</id><published>2008-02-18T13:21:00.006+11:00</published><updated>2011-01-12T11:01:45.383+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SSIS'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>SSIS Synchronous/Asynchronous Script Transformations in a Data Flow</title><content type='html'>&lt;span xmlns=""&gt; &lt;p&gt;Asynchronous just means it consumes all rows before progressing to the next step in the data flow – unlike most other transformations where the entire data flow is executed for each row before the next row is commenced. Script transformations can be synchronous (eg Lookup) or asynchronous (eg Sort or Aggregate).&lt;br /&gt;&lt;/p&gt;&lt;p&gt;A synchronous script transformation is identified because the output is linked to a specified input. This is done in the Inputs and Outputs area of the task by entering the ID from the Input properties in the SynchronousInputID field of the Output properties. For each row of input, there will be one row of output.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;An asynchronous script transformation is identified firstly because the SynchronousInputID field of the Output properties contains "None" or "0". When a new row is to be added, it is explicitly done using: &lt;/p&gt;&lt;p style="MARGIN-LEFT: 36pt"&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;Output0Buffer.AddRow()&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;In order to aggregate data, flatten rows or concatenate data from different rows, you simply set a flag to identify when a new row should be added. To do this you need to declare a boolean in the class but outside the main sub:&lt;br /&gt;&lt;/p&gt;&lt;p style="MARGIN-LEFT: 36pt"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Class&lt;/span&gt; ScriptMain&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Courier New;"&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:blue;"&gt;Inherits&lt;/span&gt; UserComponent &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Courier New;"&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:blue;"&gt;Private&lt;/span&gt; blnFirstRow &lt;span style="color:blue;"&gt;As&lt;/span&gt; &lt;span style="color:blue;"&gt;Boolean&lt;/span&gt; = &lt;/span&gt;&lt;span style="font-size:85%;color:blue;"&gt;True&lt;br /&gt;Dim opMessage1 As String = ""&lt;/p&gt;&lt;/span&gt;&lt;/span&gt;&lt;p style="MARGIN-LEFT: 36pt"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:blue;"&gt;Public&lt;/span&gt; &lt;span style="color:blue;"&gt;Overrides&lt;/span&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;Sub&lt;/span&gt; Input0_ProcessInputRow(&lt;span style="color:blue;"&gt;ByVal&lt;/span&gt; Row &lt;span style="color:blue;"&gt;As&lt;/span&gt; Input0Buffer)&lt;/span&gt;&lt;/span&gt; &lt;/p&gt;&lt;p&gt;In this example, I'm taking all rows and flattenning them into one row so the first step in my sub is:&lt;br /&gt;&lt;/p&gt;&lt;p style="MARGIN-LEFT: 36pt"&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:blue;"&gt;If&lt;/span&gt; blnFirstRow = &lt;span style="color:blue;"&gt;True&lt;/span&gt; &lt;span style="color:blue;"&gt;Then&lt;/span&gt; Output0Buffer.AddRow()&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-size:85%;"&gt;blnFirstRow = &lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:blue;"&gt;False&lt;br /&gt;&lt;/span&gt;opMessage1 = opMessage1 &amp;amp; &lt;span style="color:#a31515;"&gt;" "&lt;/span&gt; &amp;amp; Row.ipMessage.ToString&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Note that I then concatenate a variable with a new value… Alternately, you could set a flag so that a new row is added when certain conditions are met such as the value of the ipCustomerNo changes.&lt;/p&gt;&lt;p&gt;One other thing to add - you need to use the PostExecute() sub to write to variables.&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-8788040357307282889?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/8788040357307282889/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=8788040357307282889' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/8788040357307282889'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/8788040357307282889'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2008/02/ssis-synchronousasynchronous-script.html' title='SSIS Synchronous/Asynchronous Script Transformations in a Data Flow'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-8998064350214544874</id><published>2008-01-08T16:22:00.001+11:00</published><updated>2008-01-08T16:26:14.273+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio Db Pro (DataDude)'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>VS Db Pro – Script Deployment - Database Context</title><content type='html'>&lt;span xmlns=""&gt;&lt;p&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;When deploying databases using Db Pro the scripts which are executed have a database context. Visual Studio will automatically include a 'USE [YourDbName]' where YourDbName is taken from the project's BUILD property. This is the context for the scripts to execute. This is important because if you change it in any of the scripts it can mess with your deployment.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;For example, you create a script called 'AgentJobs.sql' in the Post-Deployment folder and add a reference to the script in Script.PostDeployment.sql. This means your AgentJobs script will be executed when you do a deployment. Now assuming you add a 'USE MSDB' statement in the script, your deployment runs successfully HOWEVER any scripts which execute after AgentJobs eg Data.sql (it executes in alphabetical order) will now have MSDB as the context rather than [YourDbName] as expected.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;So make sure that you use fully qualified references to objects in other databases and DON'T use 'USE'!&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-8998064350214544874?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/8998064350214544874/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=8998064350214544874' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/8998064350214544874'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/8998064350214544874'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2008/01/vs-db-pro-script-deployment-database.html' title='VS Db Pro – Script Deployment - Database Context'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-1787789221724407995</id><published>2007-10-25T15:17:00.001+10:00</published><updated>2007-10-25T15:25:20.420+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sharepoint 2007 (MOSS)'/><title type='text'>Sharepoint 2007  (MOSS) – List “My” Sites</title><content type='html'>&lt;span xmlns=""&gt;&lt;p&gt;So you want to have a web part which lists the sites which "I" have access to… easier said than done.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Below is my code for doing this… except it doesn't work. Well, it works for me because I'm an administrator but not for other users. It iterates through all site collections in the farm and and does GetSubWebsforCurrentUser. Which is fine, because I have permissions to read the properties of all site collections – a normal user of course, does not!&lt;br /&gt;&lt;/p&gt;&lt;p&gt;I tried using elevated authority and all sorts of tricks but so far haven't been able to finagle it. I do have one idea… that is to drop all the info I need into a string array using elevated authority and then do GetSubWebsforCurrentUser on site collections where no errors are raised for the authenticated user. I haven't had a spare second to try that out yet but I will…&lt;br /&gt;&lt;/p&gt;&lt;p&gt;So for the benefit of others – and hopefully someone else will have a brainwave in the meantime – here is the errant code in question…&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;using System;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;using System.Text;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;using System.Runtime.InteropServices;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;using System.Web.UI;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;using System.Web.UI.WebControls.WebParts;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;using System.Xml.Serialization;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;using System.Web;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;using Microsoft.SharePoint;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;using Microsoft.SharePoint.WebControls;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;using Microsoft.SharePoint.WebPartPages;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;using Microsoft.SharePoint.Utilities;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;using Microsoft.SharePoint.Administration;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;using Microsoft.SharePoint.Publishing; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt; &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;namespace CSR.Sharepoint.WebParts&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN-LEFT: 36pt"&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;[Guid("0d546513-7447-4211-8fc9-75117af712b0")]&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;    public class MyCollaborationSites : System.Web.UI.WebControls.WebParts.WebPart&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;        public MyCollaborationSites()&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;            this.ExportMode = WebPartExportMode.All;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;        } &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;        protected override void Render(HtmlTextWriter writer)&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;            SPWebApplication oWebApp = SPContext.Current.Site.WebApplication;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;            SPSiteCollection oSites = oWebApp.Sites;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;&lt;br /&gt;            foreach (SPSite site in oSites) &lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;            {&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;                SPWeb oWeb = site.RootWeb;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;                int ilevel = 1;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;                if (!PublishingSite.IsPublishingSite(site))//don't include portal&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;               {&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;                    GetSubSites(ilevel, oWeb, writer);&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;                };&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;            }; &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;        } &lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;"&gt; &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;        private void GetSubSites(int ilevel, SPWeb oWeb, HtmlTextWriter writer)&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;            Boolean alternate = false;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;            foreach (SPWeb oSPWeb in oWeb.GetSubwebsForCurrentUser())&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;            { &lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;"&gt; &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;                if (ilevel != 1)&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;               {&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;                    if (alternate == true)&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;                    {&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;                        writer.Write("&amp;lt;tr&amp;gt;&amp;lt;td class=csr-RowGrey&amp;gt;&amp;lt;a href='" + SPEncode.HtmlEncode(oSPWeb.Url) + "' target='" + SPEncode.HtmlEncode(oSPWeb.Title.Replace(" ", "")) + "'&amp;gt;" + SPEncode.HtmlEncode(oSPWeb.Title) + "&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/td&amp;gt;");&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;                    }&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;                    else&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;                    {&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;                        writer.Write("&amp;lt;tr&amp;gt;&amp;lt;td class=csr-Rowwhite&amp;gt;&amp;lt;a href='" + SPEncode.HtmlEncode(oSPWeb.Url) + "' target='" + SPEncode.HtmlEncode(oSPWeb.Title.Replace(" ", "")) + "'&amp;gt;" + SPEncode.HtmlEncode(oSPWeb.Title) + "&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/td&amp;gt;");&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;                        alternate = true;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;                    }&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;                }&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;                if (oSPWeb.GetSubwebsForCurrentUser().Count &amp;gt; 0)&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;                {&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;                    ilevel = ilevel + 1;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;                    GetSubSites(ilevel, oSPWeb, writer);&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;                }&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;            }&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:85%;color:#0070c0;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"&gt; &lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-1787789221724407995?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/1787789221724407995/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=1787789221724407995' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/1787789221724407995'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/1787789221724407995'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2007/10/sharepoint-2007-moss-list-my-sites.html' title='Sharepoint 2007  (MOSS) – List “My” Sites'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-6670531463671931984</id><published>2007-10-11T10:45:00.001+10:00</published><updated>2007-10-11T10:56:08.417+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sharepoint 2007 (MOSS)'/><title type='text'>Sharepoint 2007 (MOSS) - Unpublishing/Expiring a Site</title><content type='html'>&lt;div&gt;&lt;span xmlns=""&gt;&lt;p&gt;&lt;span style="font-family:verdana;"&gt;It's not immediately obvious how to expire a site… particularly for used to SPS 2003. In 2003, you could just set the end date to sometime in the past or if you really wanted to, the start date to some time in the far off future. Unfortunately with MOSS it's a little more complicated.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-family:verdana;"&gt;You'd think that the "Unpublish" option on the Workflow menu of the Page Editing Toolbar would do the trick but sadly, no! What it does do is roll the page back to it's previous version. Definitely handy. But what if you want the page (which has several versions) to be entirely invisible to users? In theory, you could delete it… but I ask you, how many of your content managers will want to delete page just because it's expired now? None I'd wager! &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:verdana;"&gt;So what's the answer? Page Scheduling (also referred to as Publication Dates). You set a start and end date for publication and the page is only visible during that period. The period may be from "Immediately" to "Never" so you don't have to think about it to much. Easy huh? Yeah, well…. &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:verdana;"&gt;Every site CAN have publication dates however not every site DOES have them. It has to be enabled. To enable Page Scheduling do the following: &lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;Go to the site in question&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;Go to Site Actions &amp;gt; Site Settings &amp;gt; Modify Pages Library Settings &lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;From Versioning Settings, ensure Versioning and Content Approval are both enabled &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;From Manage Item Scheduling, ensure Enable Scheduling is ticked&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style="font-family:verdana;"&gt;Unfortunately no, it does not apply to subsites of the current site. For the administrators who want to know why - because what you are effectively doing is amending the properties of the Pages list in the site content for that site.&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-family:verdana;"&gt;So still you ask, how do I expire the page???? Ok… &lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;Show the Page Editing toolbar &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;In the status section of the toolbar, it will have the version, the status and the Publication date. Click on the date (it's a hyperlink)&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;&lt;a href="http://3.bp.blogspot.com/_VZHMsOn3uQo/Rw1zbUuaGBI/AAAAAAAAABk/B6wVnsg27p4/s1600-h/toolbar.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5119875264647141394" style="CURSOR: hand" alt="" src="http://3.bp.blogspot.com/_VZHMsOn3uQo/Rw1zbUuaGBI/AAAAAAAAABk/B6wVnsg27p4/s320/toolbar.JPG" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;The page scheduling options will open &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;Set the end date to the desired date/time &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;Hit OK and from the Page Editing Toolbar hit Publish&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;span style="font-family:verdana;"&gt;Again, seemingly simple…. unless you're changing pages migrated from SPS 2003. Mostly I've found the Start and end dates are blank. You can't set the start date or the end date to some time in the past - you will get an error message telling you so. It's a slight irritation sure but is it really necessary? What's the big deal already… just let me set the date to a point in the past! So you can set the start date to 'Immediately' and the End date to 5 minutes from now and once you hit Publish and those 5 minutes have past, the page will magically no longer be visible.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-6670531463671931984?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/6670531463671931984/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=6670531463671931984' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/6670531463671931984'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/6670531463671931984'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2007/10/sharepoint-2007-moss.html' title='Sharepoint 2007 (MOSS) - Unpublishing/Expiring a Site'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_VZHMsOn3uQo/Rw1zbUuaGBI/AAAAAAAAABk/B6wVnsg27p4/s72-c/toolbar.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-7988576618552988653</id><published>2007-10-10T14:14:00.002+10:00</published><updated>2010-04-28T10:51:01.665+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><category scheme='http://www.blogger.com/atom/ns#' term='CLR'/><title type='text'>SQL CLR .Net Function - Split</title><content type='html'>&lt;span xmlns=""&gt;&lt;p&gt;&lt;span style="font-family:verdana;"&gt;Having needed a split function many times in the past, I've always utilised patindex and done it the hard way…. And when it comes to nvarchar values, forget about it! So today I took a few minutes to write a SQL CLR function to do it.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:verdana;"&gt;The function takes a string and a delimiter and returns a table of string values.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:verdana;"&gt;Here are the instructions for those who may want to do the same thing…&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;Create a Visual Studio project of the type Database Projects \ SQL Server\ SQL-CLR \ C# SQL Server Project – I called it udfclrSplitString but you know, call it whatever you like!&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;&lt;span style="font-family:verdana;"&gt;Add the following code:&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;p style="MARGIN-LEFT: 36pt"&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt; System.Data;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt; System.Data.SqlClient;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt; System.Data.SqlTypes;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt; Microsoft.SqlServer.Server;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt; System.Collections; &lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN-LEFT: 36pt"&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color:blue;"&gt;public &lt;/span&gt;&lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;/span&gt;&lt;span style="font-family:courier new;color:#2b91af;"&gt;CSRSplitString&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;[&lt;span style="color:#2b91af;"&gt;SqlFunction&lt;/span&gt;(FillRowMethodName = &lt;span style="color:#a31515;"&gt;"FillRow"&lt;/span&gt;)]&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN-LEFT: 36pt"&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color:blue;"&gt;public &lt;/span&gt;&lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt; udfclrSplitString(&lt;span style="color:#2b91af;"&gt;SqlString&lt;/span&gt; InputString,&lt;span style="color:#2b91af;"&gt;SqlString&lt;/span&gt; Delimiter)&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color:blue;"&gt;&lt;br /&gt;return&lt;/span&gt; InputString.Value.Split(Delimiter.Value.ToCharArray(0, 1));&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color:blue;"&gt;&lt;br /&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; FillRow(&lt;span style="color:blue;"&gt;object&lt;/span&gt; row, &lt;span style="color:blue;"&gt;out&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; InputString)&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;InputString = (&lt;span style="color:blue;"&gt;string&lt;/span&gt;)row; &lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;InputString = InputString.Trim();&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;Build that sucker&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;Drop the dll onto the SQL server somewhere relevant&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;&lt;span style="font-family:verdana;"&gt;If CLR is not already enabled on the server, execute the TSQL code:&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;p style="MARGIN-LEFT: 36pt"&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color:maroon;"&gt;sp_configure&lt;/span&gt; &lt;span style="color:red;"&gt;'clr enabled'&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt; 1&lt;br /&gt;GO&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;color:blue;"&gt;RECONFIGURE&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-family:courier new;"&gt;GO&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;&lt;span style="font-family:verdana;"&gt;In the desired database, execute the following TSQL code:&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;p style="MARGIN-LEFT: 36pt"&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color:blue;"&gt;CREATE&lt;/span&gt; &lt;span style="color:blue;"&gt;ASSEMBLY&lt;/span&gt; CSRSplitString&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color:blue;"&gt;FROM &lt;/span&gt;&lt;span style="color:red;"&gt;'D:\&amp;lt;YourDLLName&amp;gt;.dll'&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color:blue;"&gt;WITH&lt;/span&gt; PERMISSION_SET &lt;span style="color:gray;"&gt;=&lt;/span&gt; SAFE&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;&lt;span style="font-family:verdana;"&gt;In the desired database, execute the following TSQL code:&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;p style="MARGIN-LEFT: 36pt"&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color:blue;"&gt;CREATE&lt;/span&gt; &lt;span style="color:blue;"&gt;FUNCTION&lt;/span&gt; udfclrSplitString&lt;br /&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;@String &lt;span style="color:blue;"&gt;nvarchar&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;4000&lt;span style="color:gray;"&gt;),&lt;/span&gt;@Delimiter &lt;span style="color:blue;"&gt;nvarchar&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;1&lt;/span&gt;&lt;span style="font-family:courier new;color:gray;"&gt;))&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color:blue;"&gt;RETURNS&lt;/span&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;TABLE (&lt;/span&gt;ArrayItem &lt;span style="color:blue;"&gt;nvarchar&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;4000&lt;/span&gt;&lt;span style="font-family:courier new;color:gray;"&gt;))&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color:blue;"&gt;AS&lt;/span&gt; &lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color:blue;"&gt;EXTERNAL&lt;/span&gt; &lt;span style="color:blue;"&gt;NAME&lt;/span&gt; CSRSplitString&lt;span style="color:gray;"&gt;.&lt;/span&gt;CSRSplitString&lt;span style="color:gray;"&gt;.&lt;/span&gt;udfclrSplitString&lt;/span&gt;&lt;span style="font-family:courier new;color:gray;"&gt;; &lt;/span&gt;&lt;span style="font-family:verdana;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:verdana;font-size:85%;"&gt;&lt;em&gt;Where external name is MyDotNETAssembly.MyClassname.Method &lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;&lt;span style="font-family:verdana;"&gt;To test it, try:&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;p style="MARGIN-LEFT: 36pt"&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color:blue;"&gt;select&lt;/span&gt; &lt;span style="color:gray;"&gt;*&lt;/span&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;from&lt;/span&gt; udfclrSplitString&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:red;"&gt;'Kristen,Patrick,Julian,Werner,Koe'&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt;&lt;span style="color:red;"&gt;','&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:courier new;color:gray;"&gt;)&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;You should get 5 rows back … &lt;/span&gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;&lt;span style="font-family:verdana;"&gt;If you want to test it using a table column as the input try something like:&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color:blue;"&gt;&lt;br /&gt;Select&lt;/span&gt; a.name as DbNameOriginal,s&lt;span style="color:gray;"&gt;.*&lt;/span&gt; &lt;span style="color:blue;"&gt;&lt;br /&gt;from&lt;/span&gt; msdb&lt;span style="color:gray;"&gt;.&lt;/span&gt;&lt;span style="color:green;"&gt;sys.databases&lt;/span&gt; a &lt;span style="color:gray;"&gt;cross&lt;/span&gt;&lt;br /&gt;&lt;span style="color:gray;"&gt;apply&lt;/span&gt; udfclrSplitString&lt;span style="color:gray;"&gt;(&lt;/span&gt;a&lt;span style="color:gray;"&gt;.&lt;/span&gt;&lt;span style="color:blue;"&gt;name&lt;/span&gt;&lt;span style="color:gray;"&gt;,&lt;/span&gt;&lt;span style="color:red;"&gt;'_'&lt;/span&gt;&lt;span style="color:gray;"&gt;)&lt;/span&gt; s&lt;br /&gt;&lt;span style="color:blue;"&gt;where&lt;/span&gt; a&lt;span style="color:gray;"&gt;.&lt;/span&gt;&lt;span style="color:blue;"&gt;name&lt;/span&gt; like &lt;/span&gt;&lt;span style="font-family:verdana;color:red;"&gt;&lt;span style="font-family:courier new;"&gt;'%_%'&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;&lt;em&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;You will need to have the function in the msdb database for this example to work&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/em&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;To make this function &lt;strong&gt;automatically&lt;/strong&gt; available in all new databases created on that server, execute steps 6 + 7 in the &lt;span style="color:#0070c0;"&gt;&lt;strong&gt;model&lt;/strong&gt;&lt;/span&gt; system database.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-7988576618552988653?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/7988576618552988653/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=7988576618552988653' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/7988576618552988653'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/7988576618552988653'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2007/10/sql-clr-net-function-split.html' title='SQL CLR .Net Function - Split'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-3026258043370572348</id><published>2007-10-09T16:44:00.001+10:00</published><updated>2007-10-10T14:33:51.416+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySite'/><category scheme='http://www.blogger.com/atom/ns#' term='Sharepoint 2007 (MOSS)'/><title type='text'>Sharepoint MOSS 2007 - MySite Default Locale</title><content type='html'>&lt;span xmlns=""&gt;&lt;p&gt;&lt;span style="font-family:arial;"&gt;The default locale setting in the MySite template is English-US. To amend this, the simplest approach is:&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;ol style="MARGIN-LEFT: 38pt"&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Navigate to http//&lt;yourserver&gt;/MySite/_layouts/regionalsetng.aspx * &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Update the Locale as desired and hit OK&lt;br /&gt;&lt;br /&gt;* this assumes your MySite host is at /MySite so adjust as necessary&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;span style="font-family:arial;"&gt;As to sites which have already been created, this won't fix them. The bottom line is that there is NO supported global fix according to Microsoft as it is by design.&lt;br /&gt;&lt;/p&gt;&lt;/span&gt;&lt;p&gt;&lt;span style="font-family:arial;"&gt;As a bodgy workaround you could update every site in the webs table of your _Content database (and limit it to &lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="color:blue;"&gt;where&lt;/span&gt; fullurl &lt;span style="color:gray;"&gt;like&lt;/span&gt; &lt;span style="color:red;"&gt;'%personal%'&lt;/span&gt;. Simply do an update on the Locale column setting it to the Id of the locale you want. Clearly this is NOT a recommended workaround and may well break any support agreements you have with Microsoft.&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-3026258043370572348?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/3026258043370572348/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=3026258043370572348' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/3026258043370572348'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/3026258043370572348'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2007/10/sharepoint-moss-2007-mysite-default.html' title='Sharepoint MOSS 2007 - MySite Default Locale'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-3787112745115916243</id><published>2007-10-08T15:35:00.001+10:00</published><updated>2007-10-10T14:33:51.417+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sharepoint 2007 (MOSS)'/><title type='text'>Sharepoint MOSS 2007 - Working with the BDC (Business Data Catalog)</title><content type='html'>&lt;div&gt;&lt;div&gt;&lt;span xmlns=""&gt;&lt;p&gt;&lt;span style="font-family:arial;"&gt;Having just started working with the BDC, here's what I've encountered so far.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family:arial;"&gt;Using BDCMetaMan&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-family:arial;"&gt;On advice from others I started using this tool however I found it to be a tad unwieldy in that I couldn't work out how to do everything I wanted – for example, use a Stored Proc as my source. &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;"&gt;So I started with BDC MetaMan, took the output it gave me and then just screwed around with it to make it work with stored procs. In doing so, I found that writing application definitions is nowhere as complicated as others had lead me to believe. That said, it does make for an easy start point where I could just replace values and avoid the tedium of building up all the XML tags in the right order and syntax and so on…&lt;br /&gt;&lt;/span&gt;&lt;strong&gt;&lt;span style="font-family:arial;"&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family:arial;"&gt;Application Definition&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;The basic structure is this:&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;a href="http://1.bp.blogspot.com/_VZHMsOn3uQo/RwnjB0uaGAI/AAAAAAAAABc/o_iLPm2j_OY/s1600-h/ADFSimple.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5118872071955945474" style="CURSOR: hand" alt="" src="http://1.bp.blogspot.com/_VZHMsOn3uQo/RwnjB0uaGAI/AAAAAAAAABc/o_iLPm2j_OY/s320/ADFSimple.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;"&gt;&lt;strong&gt;How to use SQL Authentication&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Thanks to Nick Kellet for doing the hard slog and solving this problem….&lt;/span&gt;&lt;a href="http://planetmoss.blogspot.com/2006/11/using-single-signon-with-database.html"&gt;&lt;span style="font-family:arial;"&gt;http://planetmoss.blogspot.com/2006/11/using-single-signon-with-database.html&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-family:arial;"&gt;The basic steps are:&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Enable the Microsoft Single-sign-on service using a domain account (in windows Services)&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Create an SSO Application&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;font-size:8;"&gt;&lt;em&gt;Central Admin &amp;gt; Operations &amp;gt; Security Configuration &amp;gt; Manage Single Sign-on &amp;gt; Manage Server Settings&lt;br /&gt;Enter Display Name, Application Name (note: this field is what you will enter into your application definition in the LOB instance properties) and Email Address. They don't have to be anything in particular. Ensure the Account Type is Group.&lt;br /&gt;&lt;/em&gt;&lt;/span&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Associate the SSO Application with the domain users group or some other desired group&lt;br /&gt;&lt;span style="font-size:8;"&gt;&lt;em&gt;Central Admin &amp;gt; Operations &amp;gt; Security Configuration &amp;gt; Manage Single Sign-on &amp;gt; Manage Account Information. Select the SSO application and type in the "&amp;lt;domain&amp;gt;\domain users" group. Then key in the SQL username and password. Give the application SELECT and EXECUTE rights (assuming you are using Stored Procedures).&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Configure your connection string in the application definition&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:8;"&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Properties&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Property&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="color:blue;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;AuthenticationMode&lt;/span&gt;"&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="color:blue;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:red;"&gt;Type&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;System.String&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;RdbCredentials&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Property&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Property&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="color:blue;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;DatabaseAccessProvider&lt;/span&gt;"&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="color:blue;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:red;"&gt;Type&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;System.String&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;SqlServer&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Property&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Property&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="color:blue;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;RdbConnection Data Source&lt;/span&gt;"&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="color:blue;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:red;"&gt;Type&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;System.String&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;SERVER NAME&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Property&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Property&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="color:blue;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;RdbConnection Initial Catalog&lt;/span&gt;"&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="color:blue;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:red;"&gt;Type&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;System.String&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;DATABASE NAME&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Property&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Property&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="color:blue;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;RdbConnection Integrated Security&lt;/span&gt;"&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="color:blue;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:red;"&gt;Type&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;System.String&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;false&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Property&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Property&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="color:blue;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;RdbConnection Pooling&lt;/span&gt;"&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="color:blue;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:red;"&gt;Type&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;System.String&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;true&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Property&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Property&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="color:blue;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;SsoApplicationId&lt;/span&gt;"&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="color:blue;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:red;"&gt;Type&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;System.String&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;SSO APPLICATION NAME&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Property&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Property&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="color:blue;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;SsoProviderImplementation&lt;/span&gt;"&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="color:blue;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color:red;"&gt;Type&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;System.String&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;Microsoft.SharePoint.Portal.SingleSignon.SpsSsoProvider, Microsoft.SharePoint.Portal.SingleSignon, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Property&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;br /&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Properties&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Import the application definition&lt;br /&gt;&lt;span style="font-size:8;"&gt;&lt;em&gt;Central Admin &amp;gt; SSP &amp;gt; Business Data Catalog &amp;gt; Import Application Definition&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Configure permissions for the application definition&lt;br /&gt;&lt;span style="font-size:8;"&gt;&lt;em&gt;Central Admin &amp;gt; SSP &amp;gt; Business Data Catalog &amp;gt; Permissions &amp;gt; Copy all to descendants (or apply the entity you want to set if not inheritable)&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;Add a BDC List web part to a page, configure it and fingers crossed, it will work!&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;span style="font-family:arial;"&gt;One BIG caveat… getting this to work across multiple domains is going to be a problem. For now, I’m ignoring that issue and hoping it doesn’t rear it’s VERY ugly head… &lt;/span&gt;&lt;/p&gt;&lt;span style="font-family:arial;"&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;How to use Windows Authentication &lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Haven’t tried it so I don’t know. But… if you are having problems my first suggestion would be to consider the Kerberos double-hop issue. If you don’t know what that is, &lt;/span&gt;&lt;a href="http://www.google.com.au/search?source=ig&amp;amp;hl=en&amp;amp;q=kerberos+double-hop&amp;amp;meta="&gt;&lt;span style="font-family:arial;"&gt;google it&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;"&gt;… it’s a reasonably simple fix, if you are friendly with your AD administrator(s)! &lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-family:arial;"&gt;&lt;strong&gt;Detailed Application Definition&lt;br /&gt;&lt;br /&gt;&lt;/strong&gt;It’s fairly self-explanatory. The bits in green are the bits you have to fill in.&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_VZHMsOn3uQo/Rwnic0uaF_I/AAAAAAAAABU/fs-yA7sO_-w/s1600-h/ADFDetail.jpg"&gt;&lt;span style="font-family:arial;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5118871436300785650" style="CURSOR: hand" alt="" src="http://1.bp.blogspot.com/_VZHMsOn3uQo/Rwnic0uaF_I/AAAAAAAAABU/fs-yA7sO_-w/s400/ADFDetail.jpg" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;Notes:&lt;br /&gt;· The available data types are your standard .Net data types.&lt;br /&gt;· Refer &lt;/span&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/ms546541.aspx"&gt;&lt;span style="font-family:arial;"&gt;http://msdn2.microsoft.com/en-us/library/ms546541.aspx&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:arial;"&gt; for a BDC overviewBelow is my first pass attempt so caveat emptor… it ain’t perfect folks! Feel free to add your comments with anything you can see that can be done better or anything that I’ve got wrong!&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family:arial;"&gt;What’s Next - Got any ideas?&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;span style="font-family:arial;"&gt;So next, I’ve been charged to come up with a BDC-based list where some manual info is also stored – bodgy explanation but allow me to demonstrate.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-family:arial;"&gt;BDC list contains 20 columns. To this list, we want to add some manually entered data. The list will contain around 2000 records. The BDC data will be current and the data editor will update the manual fields when time permits. The web part should output like:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;RequestNo Title DueDate Contact Type Owner OutageRequired OutageNotification&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;"&gt;Where OutageRequired and OutageNotification are sourced from manual data and the rest are from the BDC.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:arial;"&gt;So my initial thought was to have a BDC lookup in my manual list where the RequestNo, OutageRequired and OutageNotification are entered. I really hate this idea. It’s ugly and impractical. It means that the user has to know the Request number upfront rather than being able to immediately see which request numbers haven’t been manually updated because the 2 fields are empty . Haven’t had a second to think it through properly yet but if anyone has a better idea please speak up!&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-3787112745115916243?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/3787112745115916243/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=3787112745115916243' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/3787112745115916243'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/3787112745115916243'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2007/10/sharepoint-moss-2007-working-with-bdc.html' title='Sharepoint MOSS 2007 - Working with the BDC (Business Data Catalog)'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_VZHMsOn3uQo/RwnjB0uaGAI/AAAAAAAAABc/o_iLPm2j_OY/s72-c/ADFSimple.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-4143369542080246237</id><published>2007-10-03T16:52:00.000+10:00</published><updated>2007-10-10T14:33:34.580+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Troubleshooting'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>The SQL Troubleshooting Checklist</title><content type='html'>&lt;span style="color:#3366ff;"&gt;read this handy article from SQL Server magazine and thought I'd share it with everyone... a good one to stick on the pinboard!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The Troubleshooting List&lt;br /&gt;&lt;br /&gt;By &lt;a href="http://www.sqlservercentral.com/Authors/Articles/Andy_Warren/5/"&gt;Andy Warren&lt;/a&gt;, 2007/10/03&lt;br /&gt;Total article views: 177  Views in the last 30 days: 162&lt;br /&gt;&lt;br /&gt;Most DBA's grow into their jobs and part of that process is the baptism by fire that occurs when things go wrong, especially on the performance side of things. I started to make this performance centric, but so many of the steps and thoughts are common with other problems that I tried to make it a little more generic. In this article I've listed some tips and thoughts about what to do - and why - when the sudden performance dip strikes or other serious problem occurs. It's probably not a perfect list, but the key is to build a process that keeps you on track.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;#1 - It's Usually Blocking&lt;br /&gt;&lt;/em&gt;When I get a call that 'everyone is locked up', 'everyone is slow', etc, the first thing I look for is blocking. Various ways to check, but the tried and true technique is to execute 'select * from master..sysprocesses where blocked &gt; 0'. Works on SQL 7 forward and takes about 15 seconds to type in and run, then you can decide what action to take. This usually occurs because someone is doing something bad like bulk loading records during the day. You can find and kill the blocking spid, but it's worth looking to see what the spid is doing first. If it's been running for three hours you might be better off to let it finish rather than wait for it to roll back.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;#2 - It's Not Blocking, Is It Limited to One Application/Database/Physical Location?&lt;br /&gt;&lt;/em&gt;I'm usually asking this question while I'm headed to a machine to work on step #1. If it's NONE of those things I can probably rule out recent application deployments, recent proc changes, network problems to a WAN site. If it is one physical location, I immediately get an email out to the network team to have them check all their hardware. Sometimes a router will blip, or maybe they just rebooted it and forgot to tell everyone. In practice it's usually not the network, but sometimes it is! If it's just one application and/or database, I'm immediately thinking 'what has changed'? If you know how to do wait state analysis this is a good technique to think about applying here but it takes time and you can often shortcut with the right questions.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;#3 - If it's One Application, Can They Reproduce the Issue?&lt;br /&gt;&lt;/em&gt;This is key. If they can show you it's always slow when they add a customer, look up an order, etc, you can quickly zoom in by profiling and filtering to a single host name. That will let you see exactly what is being executed and look for something with a long duration - long being subjective, but anything close to 30 seconds is a good candidate for any immediate look and anything on down to 5 seconds might need to be checked. Ideally here you can refer back to a baseline so you know what those procedures usually cost. Usually application problems can be traced back to either a change (app code or database), or SQL has generated a new plan for a query that isn't performing well, or both. In the worst case get a developer to step through the code against the production database because it's not always a SQL problem. Check whatever error logging system the application uses and the event log of the machine they are using it on.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;#4 - It's One Application, But They Cannot Reproduce on Demand&lt;br /&gt;&lt;/em&gt;These can be miserable to solve. I usually start with running separate profiler sessions on a couple users I can trust to call or email when the problem happens and to be able to tell me a lot about what they were doing at the time. I've seen some of these solved by the low tech technique of using a camcorder to capture everything that happened, more recently I've used &lt;a href="http://www.techsmith.com/morae.asp"&gt;Morae&lt;/a&gt; to let me go back in time to see what happened. Both of those are more often needed for code issues rather than SQL issues, but sometimes you're just looking for clues. If you can get the users to log when it happens you can try to match up in Profiler, the hard part is the query plans may be fine but they are being blocked or bogged down by something happening elsewhere on the server. So you have to have a deep focus on the user AND be looking at the server holistically.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;#5 - Sometimes it's the data&lt;br /&gt;&lt;/em&gt;This might happen because a lot of data has been added and the statistics don't match the current state of the data, or just because in some cases there is a lot more data than the developer expected. I dealt with a problem like this once where IT users had not flipped a bit in a table that allowed users to cache the results of an expensive query on the client, as a result they kept running that query over and over and over, killing performance. Flipped the bit and magically all was well!&lt;br /&gt;&lt;br /&gt;&lt;em&gt;#6 - Rarely Is it the Hardware&lt;br /&gt;&lt;/em&gt;Perhaps most common in this category is a drive in a RAID set failing and no one noticing, resulting in a performance decrease because parity is being used to restore the missing data on the fly. I've also seen more than once incidents where 'the server is down' but someone doing work in the server room unplugged/knocked loose the wrong power/network cable. For the  most part the hardware will either work or it won't. Doesn't hurt to have some check, but unless the server is actually unavailable this should be further down the list.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;#7 - It's Usually Because Someone Changed Something!&lt;br /&gt;&lt;/em&gt;I bet we all have had a few of these happen. Having a good change control process that is logged can really help when you're under stress. Something as minor as deploying a proc change where they added a column or order by can have a huge performance impact if the query is no longer covered. Sometimes the rules change after a hotfix (less often) or a service pack (more often) and while hopefully the changes are good, sometimes it isn't. Larger companies may be applying patches on a regular basis and after a while you start to ignore them, until something goes wrong. I'll also add a plug here for rebooting one extra time after applying a service pack because I want to be absolutely sure there are no pending changes waiting to be made live on the next reboot which might be months away - who would think of the last service pack as being an issue when it was applied three months ago?&lt;br /&gt;&lt;br /&gt;&lt;em&gt;#8 - It's Incredibly Important to Communicate&lt;br /&gt;&lt;/em&gt;As soon as you know an incident is going to last more than few minutes someone needs to get the word to operations. Work may need to be redirected to other sites, hourly employees put on break or sent for an hour of required but not all that important training, or in worse cases sent home for the day. Even smaller companies may have hundreds of employees/customers affected and the cost per hour of down time can be significant. Tell operations what you know via your boss, let them decide. It's also important to immediately communicate problems to everyone in IT. A lot of times you'll get an immediate reply back from someone who was bulk loading data, rebooting a switch, etc, that will immediately explain the problem. You also will need people to help you chase down leads so that you can stay focused, and someone to make sure you get something to eat and drink while you work.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;#9 - Know when to ask for Help&lt;br /&gt;&lt;/em&gt;I think the more experienced you are the easier this is to do. If you're a brand new DBA you hate to get the credit card from your boss to call PSS, or ask for a consultant to come, because you don't want to look inept. Absolutely there is a risk to that, but on the other hand, anything beyond a few hours and the cost of either of those pales in comparison. Try setting the stage before the incident by having one call to PSS pre-approved and consider establishing a relationship with a SQL consultant just in case. And it doesn't have to just be PSS, lot's of good challenging problems get posted in the forums here and on MSDN every day and the people that answer them like a good challenge and the learning it brings. Lean on your peers too, whether within the company or someone you met at the local user group. With experience you get more comfortable with the idea that you know what you need to know, you know what you don't know, and that it is not a sign of weakness to ask for help. Sometimes easier to say than to do!&lt;br /&gt;&lt;br /&gt;&lt;em&gt;#10 - Learn Your Lesson&lt;br /&gt;&lt;/em&gt;I bet easily 8 out of 10 times when I'm finally done resolving a performance problem that I can look back and see that I didn't ask the right question, didn't really listen to an answer, took off following the first lead rather than being methodical, or any of a bunch of other things I should have done - in hindsight. This isn't about beating yourself up or holding yourself to some incredibly high standard, but rather stepping past our pride enough to really learn a lesson.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;#Extra Credit - The Challenge&lt;br /&gt;&lt;/em&gt;It's been a while since one was posted, but Steve and I had a lot of fun writing about many of the near disasters we've been involved in, often of our making. So my challenge to you is post your own performance issue checklist, or tell us about the problem you should have solved sooner and why. Yeah, we may smile a bit when we read them, but I bet more of us smile because we've done the same thing, or because we know that's one trap we won't fall in to. As always I hope you've learned something or sparked an idea or two, and look forward to an interesting discussion!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-4143369542080246237?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/4143369542080246237/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=4143369542080246237' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/4143369542080246237'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/4143369542080246237'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2007/10/sql-troubleshooting-checklist.html' title='The SQL Troubleshooting Checklist'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-4868620938927259289</id><published>2007-09-20T11:52:00.001+10:00</published><updated>2007-10-10T14:33:51.417+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sharepoint 2007 (MOSS)'/><title type='text'>Sharepoint 2007 (MOSS) Memory Errors – EventID 6482/6398/7076 - Attempted to read or write protected memory</title><content type='html'>&lt;span xmlns=""&gt;&lt;p&gt;&lt;span style="font-family:MS Shell Dlg;font-size:8;"&gt;&lt;strong&gt;Sharepoint 2007 (MOSS) Memory Errors – EventID 6482/6398/7076&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:MS Shell Dlg;font-size:8;"&gt;If you are seeing the following error in your event log: "&lt;em&gt;Attempted to read or write protected memory. This is often an indication that other memory is corrupt&lt;/em&gt;"….&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:MS Shell Dlg;font-size:8;"&gt;…Microsoft do have a Hotfix for this problem – however you will have to contact Microsoft Premier Support to get a copy. Unfortunately if you do not have Support, I can't give you a copy of our hotfix as it is password protected and the password is only valid for 7 days!&lt;/span&gt; &lt;/p&gt;&lt;p&gt;The patch in question is a .Net 2.0 hotfix titled 303311_intl_x64_zip.exe for 64bit servers and 303312_intl_i386_zip.exe for 32bit.&lt;br /&gt;&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-4868620938927259289?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/4868620938927259289/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=4868620938927259289' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/4868620938927259289'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/4868620938927259289'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2007/09/sharepoint-2007-moss-memory-errors.html' title='Sharepoint 2007 (MOSS) Memory Errors – EventID 6482/6398/7076 - Attempted to read or write protected memory'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-3482051385129884518</id><published>2007-09-12T19:57:00.001+10:00</published><updated>2007-10-10T14:37:56.420+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Business Scorecard Manager (BSM)'/><category scheme='http://www.blogger.com/atom/ns#' term='Sharepoint 2007 (MOSS)'/><title type='text'>BSM 2005 &amp; MOSS x64 don’t play well together….</title><content type='html'>&lt;span xmlns=""&gt;&lt;p&gt;&lt;span style="font-family:Arial;"&gt;&lt;em&gt;Here's what you have….&lt;/em&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Machine1: Windows 2003 x64 with MOSS 2007 x64&lt;br /&gt;Machine2: Windows 2003 x32 with BSM 2005&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;Here's where you want to end up:&lt;/em&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Machine1: Windows 2003 x64 with MOSS 2007 x64 and BSM 2005 WebPart (only)&lt;br /&gt;Machine2: Windows 2003 x32 with BSM 2005&lt;br /&gt;&lt;/p&gt;&lt;p&gt;The article &lt;a href="http://support.microsoft.com/?id=894435"&gt;How to switch between the 32-bit versions of ASP.NET 1.1 and the 64-bit version of ASP.NET 2.0 on a 64-bit version of Windows&lt;/a&gt;&lt;span style="font-family:Verdana;color:black;"&gt; &lt;/span&gt;implies that BSM 2005 can't be used in a x64 MOSS environment because the BSM webparts require ASP.Net 1.1 which is 32bit only and IIS can't have BOTH 32bit and 64bit websites running at the same time.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;This is shown when attempting to install the BSM web parts on the MOSS server.&lt;br /&gt;&lt;/p&gt;&lt;ol style="MARGIN-LEFT: 38pt"&gt;&lt;li&gt;On the MOSS server, run the server.msi from the BSM compatibility pack&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Select a custom installation &amp;gt; Web Part components only&lt;br /&gt;&lt;/li&gt;&lt;li&gt;It fails because .NetFramework 1.1 is not installed&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Install .NetFramework 1.1 on the MOSS Server&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Execute &lt;span style="font-family:Verdana;font-size:85%;color:black;"&gt;&lt;strong&gt;cscript %SYSTEMDRIVE%\inetpub\adminscripts\adsutil.vbs SET W3SVC/AppPools/Enable32bitAppOnWin64 1&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;.Net 1.1 Web Service Extension is set to allowed.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Outcomes:&lt;br /&gt;&lt;/p&gt;&lt;ul style="MARGIN-LEFT: 38pt"&gt;&lt;li&gt;MOSS site doesn't work - error is "Service Unavailable" &lt;/li&gt;&lt;li&gt;Compatibility pack (web parts only) still fails because WSS 2.0 (or SPS 2003) is not installed&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Question&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Can BSM web parts be installed in a MOSS x64 environment? If so, how??&lt;br /&gt;&lt;/p&gt;&lt;p&gt;This is the question I have posed to Microsoft Premier Support, it looks like the answer is no but I want confirmation from MS before giving up!&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="color:#ff0000;"&gt;****************  UPDATE FROM MICROSOFT ****************  &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;From: Biao Zhang Sent: 2007年9月13日 14:04To: 'Hodges, Kristen'Subject: RE: SRZ070912000200:BSM2005: Can BSM web parts be installed in a MOSS x64 environment? If so, how??Importance: High&lt;br /&gt;&lt;br /&gt;Dear Kristen,&lt;br /&gt;&lt;br /&gt;I understand this question is very urgent and I have made some research, here is the update:&lt;br /&gt;&lt;br /&gt;1.Business Scorecard Manager Server 2005 does not have 64-bit version and officially, Business Scorecard Manager Server 2005 (including web parts) does not support Windows 64-bit platform.&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-3482051385129884518?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/3482051385129884518/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=3482051385129884518' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/3482051385129884518'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/3482051385129884518'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2007/09/bsm-2005-moss-x64-dont-play-well.html' title='BSM 2005 &amp;amp; MOSS x64 don’t play well together….'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-8407648863554569475</id><published>2007-08-21T12:39:00.000+10:00</published><updated>2007-10-10T14:33:51.418+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><category scheme='http://www.blogger.com/atom/ns#' term='Sharepoint 2007 (MOSS)'/><title type='text'>Sharepoint 2007 (MOSS) Upgrade - TempDb issues</title><content type='html'>In the middle of a Sharepoint 2007 (MOSS) upgrade....&lt;br /&gt;&lt;br /&gt;One key piece of advice I can give - allow TempDb to have PLENTY of space when doing your initial full crawl.... in fact you may find that the % increase approach may not work during this process because it can't get enough space to fulfil it's very hungry needs! A Mb increase approach should work fine.  &lt;br /&gt;&lt;br /&gt;You may see errors such as "The transaction log for database 'tempdb' is full."&lt;br /&gt;&lt;br /&gt;During later incremental crawls it shouldn't need any special handling, this just seems to apply to the intial full crawl.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-8407648863554569475?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/8407648863554569475/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=8407648863554569475' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/8407648863554569475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/8407648863554569475'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2007/08/sharepoint-2007-moss-upgrade-tempdb.html' title='Sharepoint 2007 (MOSS) Upgrade - TempDb issues'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-4346021683632399920</id><published>2007-06-25T09:44:00.000+10:00</published><updated>2007-10-10T14:34:37.085+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio Db Pro (DataDude)'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>Visual Studio Db Pro (DataDude) Headaches</title><content type='html'>So, no question, Db Pro is a great tool. However, it is not without it's headaches.&lt;br /&gt;&lt;br /&gt;When working with TFS and multiple team members, we have had no end of synching problems and regular out of memory errors. This only seems to occur when multiple users are working on the same Db Pro project.&lt;br /&gt;&lt;br /&gt;As you can imagine, this has added to development time on projects... ok not hugely but certainly a day or maybe two in terms of charge-able hours and in terms of developer frustration and tense working environment!&lt;br /&gt;&lt;br /&gt;My advice to you would be keep it to single user projects where possible... if not, maybe wait for SP1 or Orcas before switching to DataDude.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-4346021683632399920?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/4346021683632399920/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=4346021683632399920' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/4346021683632399920'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/4346021683632399920'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2007/06/visual-studio-db-pro-datadude-headaches.html' title='Visual Studio Db Pro (DataDude) Headaches'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-3400637643785011184</id><published>2007-06-18T16:12:00.000+10:00</published><updated>2007-10-10T14:34:37.086+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Bug'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio Db Pro (DataDude)'/><category scheme='http://www.blogger.com/atom/ns#' term='TFS'/><title type='text'>BUG REPORT: VS Db Pro - TFS - Get Latest Version doesn't update error list</title><content type='html'>When using Visual Studio Database Professional (DataDude) and Team Foundation Server there are synching problems between team members when using "Get Latest Version" - the error list does not update to reflect changes. Allow me to give you an example:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;DeveloperA deletes TableA and checks in. At this point, StoredProcA is in error because it depends on DatabaseObjectA - this is shown in DeveloperA's error list in Visual Studio.&lt;/li&gt;&lt;li&gt;DeveloperB does "Get Latest Version" on the project&lt;/li&gt;&lt;li&gt;DeveloperB corrects StoredProcA and checks in.&lt;/li&gt;&lt;li&gt;DeveloperA does "Get Latest Version" on the project&lt;/li&gt;&lt;/ol&gt;After the Get Latest, you would expect that DeveloperA's error list is now clear of the aforemetioned errors. Unfortunately it isn't. To get rid of these errors, Visual Studio must be restarted OR each error double-clicked. And every now and then, only a reboot will resolve it.&lt;br /&gt;&lt;br /&gt;Have logged it with Microsoft Connect... you can view/watch it at &lt;a href="https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=285730"&gt;https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=285730&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;color:#ff0000;"&gt;******************************** UPDATE ******************************** &lt;/span&gt;&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;This is the response from Microsoft.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#6600cc;"&gt;Unfortunately, this is expected behavior. The database project doesn't know when all of the files have finished being updated, so it doesn't know when to refresh itself. When the project is in this situation, there is an information message in the info strip at the top of schema view telling you that you need to refresh. You can refresh the project one of these ways: . do a refresh on the solution explorer (button on the toolbar of solution explorer) . open the file that was modified . build . close/reopen the project&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-3400637643785011184?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/3400637643785011184/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=3400637643785011184' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/3400637643785011184'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/3400637643785011184'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2007/06/vs-db-pro-tfs-get-latest-version-doesnt.html' title='BUG REPORT: VS Db Pro - TFS - Get Latest Version doesn&apos;t update error list'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8511988205422549424.post-6068618377122032549</id><published>2007-06-18T13:15:00.000+10:00</published><updated>2007-10-10T14:34:37.087+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio Db Pro (DataDude)'/><title type='text'>FEATURE REQUEST: VS DbPro - Refactor/Delete function</title><content type='html'>&lt;div align="left"&gt;If you have been using Db Pro (aka DataDude) you may have hit this little headache during your build phase... if you delete a column, table, stored proc, function or other object, references to it are not deleted thus leaving your project in an error state which is simple to fix however time-consuming and unnecessary.&lt;br /&gt;&lt;br /&gt;I've suggested this should be a prompted action whenever you do a schema view delete... and if the action is not carried out, then all affected items should be flagged.&lt;br /&gt;&lt;br /&gt;If you've hit this little nugget of joy, please vote for the feature request...&lt;br /&gt;&lt;br /&gt;&lt;a href="https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=285727"&gt;https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=285727&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;color:#ff0000;"&gt;************** UPDATE FROM MICROSOFT **************&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;This is a good suggestion, thank you for your feedback. We are considering your suggestion for future release.&lt;br /&gt;Posted by Microsoft on 22/08/2007 at 9:45 AM&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;&lt;strong&gt;&lt;span style="color:#ff0000;"&gt;&lt;span style="font-size:130%;"&gt;************** ANOTHER UPDATE FROM MICROSOFT **************&lt;/span&gt; &lt;/span&gt;&lt;/strong&gt;&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;We are concerned about two potential problems around how we understand your suggestion:1) Cascading deletions. If we were to enable deletion of dependent objects automatically, the cascade could be disasterous2) Statement level references. Do you envision deletion of referencing statements within programmability objects or deletion of the programmability object (function, sproc, etc.) as a whole?We do believe that the deletion of child objects, such as indexes or triggers on a table being deleted, is beneficial.We'd be interested in additional details you could provide on the scenario that you envision&lt;br /&gt;&lt;strong&gt;Posted by Microsoft on 8/22/2007 at 9:45 AM&lt;/strong&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;br /&gt;I agree that a cascading delete would be far too heavy-handed. An excellent solution would be something similar to a 'schema compare'. &lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;For example, let's say I select Refactor&gt;Delete on an object called [Qty] on the [Order] table. A window appears looking very like the schema compare window which lists all objects dependent on [Order].[Qty] broken down by schema type. When an object is selected, the object definition is shown below with the references to [Order].[Qty] highlighted and below that the update script (and the cursor in the update script is positioned to the current object). &lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;I have 3 Update Actions available to each object in the list - Skip, Drop and Update.When I select, Drop, the Update script is automatically updated to carry out that action.When I select Update, I then remove or replace references to [Order].[Qty] in the update script for the current object.When I select Skip, the object is not changed in any way.&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;Once all changes are done, I can then hit 'Write Updates' to apply the changes including the delete of [Order].[Qty].&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;This implies that a 'Find Orphaned References' should also exist which identifies references to deleted objects ie when the 'Skip' update action was selected. And again, a similar approach could be taken as outlined above.&lt;/div&gt;&lt;div align="left"&gt; &lt;/div&gt;&lt;div align="left"&gt;This approach covers both your questions ie eliminating the impact of cascading deletes and amending programmability objects as well as deleting them.&lt;br /&gt;&lt;strong&gt;Posted by khodges on 8/29/2007 at 5:33 PM&lt;/strong&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8511988205422549424-6068618377122032549?l=bi-tch.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bi-tch.blogspot.com/feeds/6068618377122032549/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8511988205422549424&amp;postID=6068618377122032549' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/6068618377122032549'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8511988205422549424/posts/default/6068618377122032549'/><link rel='alternate' type='text/html' href='http://bi-tch.blogspot.com/2007/06/vs-dbpro-feature-request-for.html' title='FEATURE REQUEST: VS DbPro - Refactor/Delete function'/><author><name>Kristen Hodges</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://3.bp.blogspot.com/_VZHMsOn3uQo/SqnY9IxniGI/AAAAAAAAAHM/sHfN0uhMzgA/S220/Photo+6.jpg'/></author><thr:total>2</thr:total></entry></feed>
