<?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-8413638223026049990</id><updated>2012-01-23T07:39:39.079-05:00</updated><category term='point'/><category term='tools'/><category term='end of the world'/><category term='news'/><category term='ssas'/><category term='bug'/><category term='reportingservice2005'/><category term='tab delimited'/><category term='small'/><category term='development'/><category term='interesting'/><category term='customer'/><category term='precedence constraint'/><category term='how to'/><category term='jpg'/><category term='date'/><category term='insert'/><category term='db2'/><category term='chrome'/><category term='c#'/><category term='firefox'/><category term='slowly changing dimension'/><category term='data source'/><category term='css'/><category term='dt_date'/><category term='OLEDB for DB2'/><category term='cast'/><category term='extension'/><category term='tips'/><category term='web service'/><category term='top'/><category term='multi'/><category term='uniqueidentifier'/><category term='performance'/><category term='group'/><category term='SQL Command task'/><category term='2008'/><category term='sort'/><category term='64 bit'/><category term='utility'/><category term='humor'/><category term='multiple'/><category term='future'/><category term='section'/><category term='table'/><category term='black hole'/><category term='interactive'/><category term='business'/><category term='SQL2008'/><category term='flow control'/><category term='security'/><category term='mistakes'/><category term='field'/><category term='subfolder'/><category term='language'/><category term='format'/><category term='failed to load'/><category term='2007'/><category term='Fast Load'/><category term='zero'/><category term='ssis'/><category term='IIF'/><category term='industry'/><category term='filter'/><category term='resultset'/><category term='batch'/><category term='exists'/><category term='integration'/><category term='report'/><category term='ssrs'/><category term='welcome'/><category term='alert'/><category term='parameter'/><category term='network'/><category term='fix'/><category term='testing'/><category term='datetime'/><category term='requirements'/><category term='T-SQL'/><category term='detail'/><category term='automation'/><category term='collider'/><category term='disappear'/><category term='error'/><category term='.NET'/><category term='data type'/><category term='no results'/><category term='users'/><category term='url'/><category term='value'/><category term='scd'/><category term='javascript'/><category term='lessons'/><category term='list'/><category term='Maximum Insert Commit Size'/><category term='dynamic'/><category term='GUID'/><category term='mario theme music bass'/><category term='no data'/><category term='prompts'/><category term='IF'/><category term='derived column'/><category term='custom renderer'/><category term='Business Intelligence'/><category term='easy'/><category term='currency'/><category term='connection manager'/><category term='shortcoming'/><category term='_blank'/><category term='drill thru'/><category term='bulk insert'/><category term='VSS visual source safe 2005 silen unattended install'/><category term='performancepoint'/><category term='evaluation'/><category term='OLEDB'/><category term='top n'/><category term='deadlines'/><category term='hide'/><category term='layout'/><category term='image'/><category term='code'/><category term='footer'/><category term='csv'/><category term='count'/><category term='file'/><category term='default'/><category term='total'/><category term='row'/><category term='deploy'/><category term='message box'/><category term='rendering'/><category term='speed'/><category term='tricks'/><category term='new window'/><category term='Script'/><category term='drill through'/><category term='SQL Server 2008'/><category term='stored procedure'/><category term='workaround'/><category term='connect'/><category term='header'/><category term='optimize'/><category term='programming'/><category term='culture'/><category term='deployment'/><category term='implementation'/><category term='expression'/><category term='mapping'/><category term='dashboard'/><category term='button'/><category term='sql server'/><category term='2005'/><category term='null'/><category term='time'/><category term='click thru'/><category term='as400'/><category term='report viewer'/><category term='datatype'/><category term='multivalue'/><category term='BI'/><category term='missing'/><category term='microsoft'/><category term='ODBC'/><category term='connectivity'/><category term='dt_dbtimestamp'/><category term='pop up'/><category term='numbers'/><category term='SSRS 2008 R2 table tablix header repeat column'/><category term='data'/><category term='timeout'/><category term='multilanguage'/><category term='batch file'/><category term='wildcard'/><category term='RDL Editor'/><title type='text'>Random Neural Firings</title><subtitle type='html'>Tidbits and Musings from my journeys thru the Microsoft SQL Server Business Intelligence Suite</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://bobp1339.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://bobp1339.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Bob Pearson</name><uri>http://www.blogger.com/profile/16528166535649336177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>54</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8413638223026049990.post-7647379475705491870</id><published>2011-12-02T11:14:00.000-05:00</published><updated>2011-12-02T11:14:25.726-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='multiple'/><category scheme='http://www.blogger.com/atom/ns#' term='row'/><category scheme='http://www.blogger.com/atom/ns#' term='T-SQL'/><category scheme='http://www.blogger.com/atom/ns#' term='multi'/><category scheme='http://www.blogger.com/atom/ns#' term='insert'/><title type='text'>Multi Row Inserts in T-SQL</title><content type='html'>A new feature in SQL Server 2008 is the ability to insert multiple rows with one insert statement!&lt;br /&gt;&lt;br /&gt;In previous versions, anytime you wanted to insert multiple rows into a table with a T-SQL script, you would have done something like this:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Insert into MyTable (Field1, Field2)&lt;br /&gt;Values ('ABC',123)&lt;br /&gt;Insert into MyTable (Field1, Field2)&lt;br /&gt;Values ('DEF',456)&lt;br /&gt;&lt;/blockquote&gt;However, with SQL Server 2008, you can now do this:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Insert into MyTable (Field1, Field2)&lt;br /&gt;Values ('ABC',123),('DEF',456)&lt;/blockquote&gt;&lt;br /&gt;Working with a growing data mart, I do a lot of scripted inserts, so this definitely makes my life a little simpler!&lt;br /&gt;&lt;br /&gt;peace&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413638223026049990-7647379475705491870?l=bobp1339.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bobp1339.blogspot.com/feeds/7647379475705491870/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413638223026049990&amp;postID=7647379475705491870' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/7647379475705491870'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/7647379475705491870'/><link rel='alternate' type='text/html' href='http://bobp1339.blogspot.com/2011/12/multi-row-inserts-in-t-sql.html' title='Multi Row Inserts in T-SQL'/><author><name>Bob Pearson</name><uri>http://www.blogger.com/profile/16528166535649336177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413638223026049990.post-7282073587992392881</id><published>2011-10-18T13:38:00.000-04:00</published><updated>2011-10-18T13:38:36.871-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VSS visual source safe 2005 silen unattended install'/><title type='text'>Unattended Visual Source Safe 2005 installation</title><content type='html'>To install Visual Source Safe 2005 silently, you must first create an install ini file using Setup.exe.&lt;br /&gt;The setup in the root of the CD will not do this, you have to navigate to the setup folder on the CD.&lt;br /&gt;If you are using a download from MSDN, there is only one setup.exe and it’s the one to use.&lt;br /&gt;The machine that you use to create this ini will be the template for all installations.  You cannot create the ini file from a machine that already has VSS installed. You must create it from a machine that does not yet have VSS installed.&lt;br /&gt;&lt;br /&gt;From a command line, execute the following: &lt;blockquote&gt;\\(servername)\(sharename)\(VSS Path)\setup.exe /CreateUnattend  \\(servername)\(sharename)\(Path to INI)\filename.ini&lt;/blockquote&gt;&lt;br /&gt;I create my ini file in the same folder as the setup process.&lt;br /&gt;For example, my command would look like this:&lt;br /&gt;&lt;blockquote&gt;\\VSSServer\VSS\setup.exe /CreateUnattend \\VSSServer\VSS\FullInstall.ini&lt;/blockquote&gt;&lt;br /&gt;Again, the machine that you are running this process on should not have VSS installed yet. If it does have VSS installed, the ini file will be used to upgrade or add/remove features and will not install VSS on the target machine.&lt;br /&gt;&lt;br /&gt;To install on the target machine, run this command:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;\\(servername)\(sharename)\(VSS Path)\setup.exe /UnattendFile  \\(servername)\(sharename)\(Path to INI)\filename.ini&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413638223026049990-7282073587992392881?l=bobp1339.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bobp1339.blogspot.com/feeds/7282073587992392881/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413638223026049990&amp;postID=7282073587992392881' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/7282073587992392881'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/7282073587992392881'/><link rel='alternate' type='text/html' href='http://bobp1339.blogspot.com/2011/10/unattended-visual-source-safe-2005.html' title='Unattended Visual Source Safe 2005 installation'/><author><name>Bob Pearson</name><uri>http://www.blogger.com/profile/16528166535649336177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413638223026049990.post-1431006663404963428</id><published>2011-09-13T10:16:00.000-04:00</published><updated>2011-09-13T10:16:07.671-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SSRS 2008 R2 table tablix header repeat column'/><title type='text'>Repeat Table Header on Each Page in SSRS 2008R2</title><content type='html'>I ran into an issue with the tablix in SSRS 2008R2 where I set the tablix property “RepeatColumnHeaders” to True. However, this did not cause the table header to repeat.&lt;br /&gt;&lt;br /&gt;After a little experimentation, and a little help from Paul Turley, I figured out how to consistently get the table header to repeat on every page.&lt;br /&gt;&lt;br /&gt;The setting of the “RepeatColumnHeaders” property on the tablix seems to have no effect on this behavior. Instead, we have to set it on a static member of the row groups.&lt;br /&gt;&lt;br /&gt;To see the static members of the row groups, click on the small drop down arrow on the far right of the row groups/columns groups header.  Then select Advanced Mode.&lt;br /&gt;&lt;br /&gt;With the static members of the row group shown, select the first one in the list. The top left cell of the tablix should be selected in the designer.&lt;br /&gt;&lt;br /&gt;Now open the property pane and find the property “RepeatOnNewPage” and set it to True.&lt;br /&gt;&lt;br /&gt;Then find the property “KeepWithGroup” and make sure its set to After.  If its not, set it to After.&lt;br /&gt;&lt;br /&gt;Now your table header will repeat on every page.&lt;br /&gt;&lt;br /&gt;BTW, check out Paul’s book “Microsoft SQL Server Reporting Services Recipes: for Designing Expert Reports”  It has been a good resource for SSRS.&lt;br /&gt;peace&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413638223026049990-1431006663404963428?l=bobp1339.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bobp1339.blogspot.com/feeds/1431006663404963428/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413638223026049990&amp;postID=1431006663404963428' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/1431006663404963428'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/1431006663404963428'/><link rel='alternate' type='text/html' href='http://bobp1339.blogspot.com/2011/09/repeat-table-header-on-each-page-in.html' title='Repeat Table Header on Each Page in SSRS 2008R2'/><author><name>Bob Pearson</name><uri>http://www.blogger.com/profile/16528166535649336177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413638223026049990.post-7197218148228710453</id><published>2010-09-23T15:29:00.000-04:00</published><updated>2010-09-23T15:29:27.234-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='connectivity'/><category scheme='http://www.blogger.com/atom/ns#' term='ssis'/><category scheme='http://www.blogger.com/atom/ns#' term='network'/><category scheme='http://www.blogger.com/atom/ns#' term='connection manager'/><category scheme='http://www.blogger.com/atom/ns#' term='error'/><category scheme='http://www.blogger.com/atom/ns#' term='64 bit'/><category scheme='http://www.blogger.com/atom/ns#' term='2008'/><title type='text'>SSIS 2008 / SQL Server 2008 Connectivity Issue</title><content type='html'>We recently upgraded to SSIS 2008 and SQL Server 2008 r2. This helped the performance of a large package that contained 27 lookups for a fact table. It used an OLEDB destination component, set to Table – Fast Load. It would process a million rows in less than 2 minutes.&lt;br /&gt;&lt;br /&gt;This worked well, until I added a multicast and an OLE Command component to the data flow. What I wanted was to check the values passed to the stored procedure and add the existing row to history if there was a change. The OLE Command used the same connection manager as the main data insert, since the history and the current tables were in the same database.&lt;br /&gt;&lt;br /&gt;When running it, I would get to about 100,000 rows, and then SSIS would begin to slow down and finally it would lose network connectivity to the SQL Server. (We have a separate SSIS server) This is the error that was written to the logs:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;SSIS Error Code DTS_E_OLEDBERROR. An OLE DB error has occurred.&lt;br /&gt;Error code: 0x80004005.&lt;br /&gt;An OLE DB record is available. Source: "Microsoft SQL Server Native Client 10.0" &lt;br /&gt;Hresult: 0x80004005 Description: "A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not accessible. Check if instance name is correct and if SQL Server is configured to allow remote connections. For more information see SQL Server Books Online.".&lt;br /&gt;An OLE DB record is available. Source: "Microsoft SQL Server Native Client 10.0" &lt;br /&gt;Hresult: 0x80004005 Description: "Communication link failure".&lt;br /&gt;An OLE DB record is available. Source: "Microsoft SQL Server Native Client 10.0" &lt;br /&gt;Hresult: 0x80004005 Description: "Named Pipes Provider: No process is on the other end of the pipe."&lt;/blockquote&gt;&lt;br /&gt;I began by troubleshooting the network, looking for errors on the switch and both servers. This yielded nothing, there were no errors logged.  So I turned to SSIS, figuring that it somehow was the culprit since everything worked until I added the multicast.&lt;br /&gt;&lt;br /&gt;I removed the multicast and the OLE Command components and tested again. The package processed a million rows in less than 2 minutes.&lt;br /&gt;&lt;br /&gt;I added the multicast back in, without the OLE Command and tested.  Again it processed a million rows in less than 2 minutes.&lt;br /&gt;&lt;br /&gt;I added the OLE Command component back in and tested. It failed at 49,000 records.&lt;br /&gt;&lt;br /&gt;I added another connection manager, set the same properties and then pointed the OLE Command to the new manager. When I tested, I was surprised to see it complete successfully! &lt;br /&gt;&lt;br /&gt;It seems that the one connection manager was not able to handle the multiple destinations simultaneously. I have no way to confirm this at this time, but since I have multiple connection managers for the same database, I have not experienced this issue at all.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413638223026049990-7197218148228710453?l=bobp1339.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bobp1339.blogspot.com/feeds/7197218148228710453/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413638223026049990&amp;postID=7197218148228710453' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/7197218148228710453'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/7197218148228710453'/><link rel='alternate' type='text/html' href='http://bobp1339.blogspot.com/2010/09/ssis-2008-sql-server-2008-connectivity.html' title='SSIS 2008 / SQL Server 2008 Connectivity Issue'/><author><name>Bob Pearson</name><uri>http://www.blogger.com/profile/16528166535649336177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413638223026049990.post-4111686527501632889</id><published>2010-08-04T12:43:00.000-04:00</published><updated>2010-08-04T12:43:36.675-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><category scheme='http://www.blogger.com/atom/ns#' term='small'/><category scheme='http://www.blogger.com/atom/ns#' term='ssrs'/><category scheme='http://www.blogger.com/atom/ns#' term='report viewer'/><category scheme='http://www.blogger.com/atom/ns#' term='chrome'/><category scheme='http://www.blogger.com/atom/ns#' term='fix'/><category scheme='http://www.blogger.com/atom/ns#' term='css'/><title type='text'>SSRS Fix for FireFox/Chrome Report Size</title><content type='html'>If you have ever used Chrome or FireFox with SSRS, you know the report window can show up very small. This is due to the way that SSRS implements the IFRAME. &lt;br /&gt;&lt;br /&gt;A quick fix for this is to add the following entry to the ReportingServices.css file.&lt;br /&gt;&lt;blockquote&gt;.DocMapAndReportFrame&lt;br /&gt;{&lt;br /&gt;     min-height: 800px;&lt;br /&gt; min-width: 800px;&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;You can usually find the ReportingServices.css file at: C:\Program Files\Microsoft SQL Server\MSSQL.3\Reporting Services\ReportManager\Styles, however your location may be different depending on your installation.&lt;br /&gt;&lt;br /&gt;peace&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413638223026049990-4111686527501632889?l=bobp1339.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bobp1339.blogspot.com/feeds/4111686527501632889/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413638223026049990&amp;postID=4111686527501632889' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/4111686527501632889'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/4111686527501632889'/><link rel='alternate' type='text/html' href='http://bobp1339.blogspot.com/2010/08/ssrs-fix-for-firefoxchrome-report-size.html' title='SSRS Fix for FireFox/Chrome Report Size'/><author><name>Bob Pearson</name><uri>http://www.blogger.com/profile/16528166535649336177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413638223026049990.post-487834233610328607</id><published>2010-07-23T11:29:00.000-04:00</published><updated>2010-07-23T11:29:05.377-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ssis'/><category scheme='http://www.blogger.com/atom/ns#' term='speed'/><category scheme='http://www.blogger.com/atom/ns#' term='Fast Load'/><category scheme='http://www.blogger.com/atom/ns#' term='Maximum Insert Commit Size'/><category scheme='http://www.blogger.com/atom/ns#' term='2005'/><category scheme='http://www.blogger.com/atom/ns#' term='OLEDB'/><category scheme='http://www.blogger.com/atom/ns#' term='optimize'/><category scheme='http://www.blogger.com/atom/ns#' term='bulk insert'/><title type='text'>Using Maximum Insert Commit Size with FAST LOAD on the OLE DB Connector, and a Warning</title><content type='html'>I have been working on some new ETL recently, which of course has me optimizing the ETL. One of the things that I look at while optimizing is the Maximum Insert Commit Size (MICS) one the OLEDB connector when using the Table – FAST LOAD option.&lt;br /&gt;&lt;br /&gt;This setting controls how many records are sent and committed to a table at a time. For example, if you have a 12,000 record source, and you set MICS to 5,000, you will have 3 bulk insert statements sent to the server:  two with 5,000 records and 1 with 2,000 records. &lt;br /&gt;&lt;br /&gt;The beauty of doing this is that it helps keep the transaction log small if you use simple logging. (On staging databases, I routinely use simple logging since there is no need to have full logging). It can also increase performance since the server is dealing with smaller chunks of data at one time.&lt;br /&gt;&lt;br /&gt;But, like all good things, there is something you should watch out for.  If you set up redirect row on error in the OLEDB Destination and one record in a batch fails, that one record will be redirected to the error output, but the entire batch will not be inserted into the database!  The only indication you will get is that one record failure.&lt;br /&gt;&lt;br /&gt;I have tried to set the MICS to 1 for safety, but that ends up being slower than the normal Table Load.&lt;br /&gt;What I wound up doing is using the normal table load on smaller tables, and removing the redirect row error handling on larger tables. I then put in a derived column step that clean the data before inserting it.  This allows me to load a 46 million row table in a few minutes, with a transaction log that doesn’t get above 10 Megs.&lt;br /&gt;&lt;br /&gt;So, definitely work with the MICS setting to further optimize your ETL, but if you are using error handling to redirect rows, be aware that you will lose data each time a row is redirected.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413638223026049990-487834233610328607?l=bobp1339.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bobp1339.blogspot.com/feeds/487834233610328607/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413638223026049990&amp;postID=487834233610328607' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/487834233610328607'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/487834233610328607'/><link rel='alternate' type='text/html' href='http://bobp1339.blogspot.com/2010/07/using-maximum-insert-commit-size-with.html' title='Using Maximum Insert Commit Size with FAST LOAD on the OLE DB Connector, and a Warning'/><author><name>Bob Pearson</name><uri>http://www.blogger.com/profile/16528166535649336177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413638223026049990.post-7948177809807773865</id><published>2010-07-14T13:55:00.004-04:00</published><updated>2010-07-15T12:34:55.712-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ssis'/><category scheme='http://www.blogger.com/atom/ns#' term='null'/><category scheme='http://www.blogger.com/atom/ns#' term='derived column'/><category scheme='http://www.blogger.com/atom/ns#' term='error'/><category scheme='http://www.blogger.com/atom/ns#' term='cast'/><title type='text'>Setting a NULL value in SSIS derived column</title><content type='html'>Ran into an interesting error while trying to set a null value to a column in a derived column task in SSIS.&lt;br /&gt;Here is my statement:&lt;br /&gt;&lt;blockquote&gt;[CustNum]=="" ?  NULL(DT_STR, 4, 1252) : [CustNum]&lt;/blockquote&gt;&lt;br /&gt;And the error thrown:&lt;br /&gt;&lt;blockquote&gt;For operands of the conditional operator, the data type DT_STR is supported only for input and cast operations.&lt;/blockquote&gt;&lt;br /&gt;The correct syntax for this is:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;[CustNum]=="" ?  (DT_STR, 4, 1252)NULL(DT_STR, 4, 1252) : [CustNum]&lt;/blockquote&gt;&lt;br /&gt;Not sure why this requires the explicit cast since you include the type in the null statement. &lt;br /&gt;&lt;br /&gt;peace&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413638223026049990-7948177809807773865?l=bobp1339.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bobp1339.blogspot.com/feeds/7948177809807773865/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413638223026049990&amp;postID=7948177809807773865' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/7948177809807773865'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/7948177809807773865'/><link rel='alternate' type='text/html' href='http://bobp1339.blogspot.com/2010/07/setting-null-value-in-ssis-derived.html' title='Setting a NULL value in SSIS derived column'/><author><name>Bob Pearson</name><uri>http://www.blogger.com/profile/16528166535649336177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413638223026049990.post-439169080576451187</id><published>2010-07-08T11:17:00.001-04:00</published><updated>2010-07-08T11:19:03.729-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tricks'/><category scheme='http://www.blogger.com/atom/ns#' term='deploy'/><category scheme='http://www.blogger.com/atom/ns#' term='deployment'/><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='ssis'/><category scheme='http://www.blogger.com/atom/ns#' term='sql server'/><category scheme='http://www.blogger.com/atom/ns#' term='batch'/><category scheme='http://www.blogger.com/atom/ns#' term='automation'/><category scheme='http://www.blogger.com/atom/ns#' term='batch file'/><title type='text'>Deploying SSIS Packages with a Batch File</title><content type='html'>This is a handy little batch file that I have been using for years to deploy multiple SSIS packages to a SQL Server. It is pretty basic; it copies all of the *.dtsx files in a specified folder to the SQL Server. &lt;br /&gt;It first removes the packages from the SQL Server, deletes the folder, and then copies the new files to the server. One limitation is that it only deletes the packages that are in the source folder. So if you have extra packages deployed, you will need to remove them manually.&lt;br /&gt;&lt;br /&gt;This batch files uses DTUTIL so it must be run on a machine that has SSIS installed.&lt;br /&gt;&lt;br /&gt;The syntax for running the file is:  DeploySSISPackages.cmd &lt;i&gt;(SQL Server name)&lt;/i&gt; &lt;i&gt;(Folder containing packages to deploy)&lt;/i&gt; &lt;i&gt;(Folder in MSDB to deploy to)&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;If any of the 3 parameters contain spaces, enclose them in quotes.&lt;br /&gt;&lt;br /&gt;Examples:&lt;br /&gt;&lt;br /&gt;DeploySSISPackages.cmd  SQLServer001 “C:\My Projects\SSIS\ETL” “ETL SSIS”&lt;br /&gt;&lt;br /&gt;DeploySSISPackages.cmd  SQLServer001  C:\Projects\SSIS\ETL  ETL&lt;br /&gt;&lt;br /&gt;Enjoy!&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;@Echo Off&lt;br /&gt;&lt;br /&gt;Echo.&lt;br /&gt;Echo.&lt;br /&gt;Echo   SSIS Package Installation Script&lt;br /&gt;Echo   Written by Bob Pearson&lt;br /&gt;Echo   7/6/07&lt;br /&gt;Echo.&lt;br /&gt;&lt;br /&gt;if %1a == a goto Error&lt;br /&gt;if %2a == a goto Error&lt;br /&gt;if %3a == a goto Error&lt;br /&gt;&lt;br /&gt;Echo.&lt;br /&gt;Echo.&lt;br /&gt;Echo Deployment Server:  %1&lt;br /&gt;Echo -----------------------------------------------------&lt;br /&gt;Echo --This will delete any %3 data mart files &lt;br /&gt;Echo --on the server, and reinstall from the local machine&lt;br /&gt;Echo -----------------------------------------------------&lt;br /&gt;Pause&lt;br /&gt;REM   Goto Out&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;REM   Remove Existing files and directory on Server &lt;br /&gt;for %%f in (%2"\*.dtsx") do (&lt;br /&gt;Echo Now Removing: %%~nf&lt;br /&gt;dtutil /Q /SourceS %1 /SQL "\%3\\%%~nf" /Del &lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;dtutil /Q /SourceS %1 /FDe "SQL;\;%3"&lt;br /&gt;&lt;br /&gt;:Create&lt;br /&gt;&lt;br /&gt;Echo.&lt;br /&gt;Echo Preparing to create folder&lt;br /&gt;Echo.&lt;br /&gt;pause&lt;br /&gt;&lt;br /&gt;REM   Create the Directory&lt;br /&gt;dtutil /Q /SourceS %1 /FC "SQL;\;%3"&lt;br /&gt;if errorlevel 1 goto End&lt;br /&gt;Echo.&lt;br /&gt;Echo Preparing to Copy Files to Server&lt;br /&gt;Echo.&lt;br /&gt;pause&lt;br /&gt;&lt;br /&gt;:Out&lt;br /&gt;REM   copy the SSIS Packages to the server&lt;br /&gt;for %%f in (%2"\*.dtsx") do (&lt;br /&gt;Echo Now Copying: %%~nf&lt;br /&gt;dtutil /Q /DestS %1 /Fi "%%f" /C "SQL;\%3\\%%~nf"&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Echo.&lt;br /&gt;Echo.&lt;br /&gt;Echo Installation Complete!&lt;br /&gt;Echo.&lt;br /&gt;Echo.&lt;br /&gt;Pause&lt;br /&gt;Goto End&lt;br /&gt;&lt;br /&gt;:Error&lt;br /&gt;Echo.    &lt;br /&gt;Echo.  &lt;br /&gt;Echo Missing Servername!&lt;br /&gt;Echo Syntax: Deploy SSIS Packages [servername] [Source File Path] [MSDB Deploy Folder]&lt;br /&gt;Echo.    &lt;br /&gt;Echo.    &lt;br /&gt;&lt;br /&gt;Pause&lt;br /&gt;&lt;br /&gt;:End&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413638223026049990-439169080576451187?l=bobp1339.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bobp1339.blogspot.com/feeds/439169080576451187/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413638223026049990&amp;postID=439169080576451187' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/439169080576451187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/439169080576451187'/><link rel='alternate' type='text/html' href='http://bobp1339.blogspot.com/2010/07/deploying-ssis-packages-with-batch-file.html' title='Deploying SSIS Packages with a Batch File'/><author><name>Bob Pearson</name><uri>http://www.blogger.com/profile/16528166535649336177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413638223026049990.post-6221710363665592617</id><published>2010-07-02T15:05:00.001-04:00</published><updated>2010-07-02T15:07:19.916-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='ssis'/><category scheme='http://www.blogger.com/atom/ns#' term='ODBC'/><category scheme='http://www.blogger.com/atom/ns#' term='sql server'/><category scheme='http://www.blogger.com/atom/ns#' term='OLEDB for DB2'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='OLEDB'/><category scheme='http://www.blogger.com/atom/ns#' term='db2'/><category scheme='http://www.blogger.com/atom/ns#' term='as400'/><title type='text'>Pulling Data from DB2 into SQL Server using SSIS</title><content type='html'>Well, I am finally back!  I am at a new location, in a new industry, and working with new data!  Very exciting times!&lt;br /&gt;&lt;br /&gt;One of the new things I am working with is pulling data into SSIS from a DB2 database running on an AS/400. The first thing I did was scour the net for information on which provider I should use to pull data from DB2 to SQL Server. I found 4 options:&lt;br /&gt;&lt;br /&gt;1. Use a flat file extract from the DB2&lt;br /&gt;2. Use the ODBC provider.&lt;br /&gt;3. Use the iSeries OLEDB provider.&lt;br /&gt;4. Use the Microsoft OLEDB provider.&lt;br /&gt;&lt;br /&gt;After some initial testing between the ODBC provider and the iSeries OLEDB, I ruled out the ODBC. It is much too slow. I ran several small tests, but once I got up to 100k records, it was too painful to even complete the ODBC portion of the tests.&lt;br /&gt;&lt;br /&gt;I then turned my attention to comparing the Microsoft OLEDB v3.0 provider to the iSeries OLEDB V5R3M0 provider. &lt;br /&gt;&lt;br /&gt;I setup an SSIS package with 2 sequence containers: one that contained the flow for the MSOLEDB and one for the iSOLEDB. I setup several SQL SELECT statements from the tables that I will be using in my ETL. I used no WHERE clause, just a basic select.  I wanted this test to be as simple as possible.&lt;br /&gt;I then put these 2 containers into a for..next container and set it up to loop 10 times.&lt;br /&gt;&lt;br /&gt;Note:  I am running on a development server with limited memory (4 gigs, running a SQL server instance and SSIS) and 4 processors.&lt;br /&gt;&lt;br /&gt;I ran it on the first SQL statement that  would return about 4k rows. The MSOLEDB ran in 298ms, the iSOLEDB in 732ms.   I changed the SQL statement to return 400k rows. The MSOLEDB took 83 seconds (1min, 23sec), and the iSOLEDB took 514 seconds (8min, 34sec). I then went for a big test, 1 million rows.  The MSOLEDB took 636 seconds (10min, 36sec) and the iSOLEDB took 2008 seconds (33min, 28sec).&lt;br /&gt;&lt;br /&gt;So as you can see from these tests, the Microsoft OLEDB for DB2 provider is much faster.  However, how would it perform on a multimillion row rowset?&lt;br /&gt;&lt;br /&gt;I tested the Microsoft OLEDB provider for DB2 against a table that contained over 12 million rows, with each row being ~500 bytes wide. The flat file import took 15 min, 56sec. The MSOLEDB took 20min, 53sec.  However, if I use the OLEDB provider, I do not have to worry about the file not being created, etc. There are less moving parts. So for this example, I am going to use the OLEDB provider. I have several tables that have more than 40 million records. I am going to have to test these out and then decide how much it is worth to not have to rely on external file creation processes. &lt;br /&gt;&lt;br /&gt;So, in summary, the new Microsoft OLEDB Provider for DB2 is very speedy.  It is a no brainer to use it instead of the iSeries or the ODBC providers. For larger tables however, flat files may still be the way to go. &lt;br /&gt;&lt;br /&gt;peace&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413638223026049990-6221710363665592617?l=bobp1339.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bobp1339.blogspot.com/feeds/6221710363665592617/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413638223026049990&amp;postID=6221710363665592617' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/6221710363665592617'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/6221710363665592617'/><link rel='alternate' type='text/html' href='http://bobp1339.blogspot.com/2010/07/pulling-data-from-db2-into-sql-server.html' title='Pulling Data from DB2 into SQL Server using SSIS'/><author><name>Bob Pearson</name><uri>http://www.blogger.com/profile/16528166535649336177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413638223026049990.post-8522673776221054149</id><published>2009-06-30T08:46:00.003-04:00</published><updated>2009-06-30T08:48:28.573-04:00</updated><title type='text'>Wave of the future...</title><content type='html'>Here is an &lt;a href="http://video.google.com/videoplay?docid=-8734787622017763097&amp;q=engelbart"&gt;interesting demo&lt;/a&gt; by Doug Engelbart from 1968, showing how a computer could be used in an office setting...&lt;br /&gt;&lt;br /&gt;The quality isn't the best, but the demo is very interesting. This would have been very exciting to work on. &lt;br /&gt;&lt;br /&gt;peace&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413638223026049990-8522673776221054149?l=bobp1339.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bobp1339.blogspot.com/feeds/8522673776221054149/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413638223026049990&amp;postID=8522673776221054149' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/8522673776221054149'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/8522673776221054149'/><link rel='alternate' type='text/html' href='http://bobp1339.blogspot.com/2009/06/wave-of-future.html' title='Wave of the future...'/><author><name>Bob Pearson</name><uri>http://www.blogger.com/profile/16528166535649336177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413638223026049990.post-2078042005930083762</id><published>2009-06-18T23:25:00.004-04:00</published><updated>2009-06-18T23:45:02.583-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='custom renderer'/><category scheme='http://www.blogger.com/atom/ns#' term='csv'/><category scheme='http://www.blogger.com/atom/ns#' term='rendering'/><category scheme='http://www.blogger.com/atom/ns#' term='extension'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='sql server'/><category scheme='http://www.blogger.com/atom/ns#' term='tab delimited'/><category scheme='http://www.blogger.com/atom/ns#' term='reportingservice2005'/><category scheme='http://www.blogger.com/atom/ns#' term='2005'/><category scheme='http://www.blogger.com/atom/ns#' term='ssrs'/><title type='text'>Tab Delimited Renderer in SSRS 2005</title><content type='html'>I was recently tasked with coming up with a tab delimited renderer in SSRS 2005.&lt;br /&gt;&lt;br /&gt;My first thought was to use the CSV renderer and add a config entry in the ReportServer.config file to use a tab as a field delimiter.&lt;br /&gt;However, in SSRS 2005, Microsoft clears any whitespace when reading the config file for the CSV renderer, meaning that the tab character does not work.&lt;br /&gt;&lt;br /&gt;So I set about researching how to create a tab renderer.&lt;br /&gt;&lt;br /&gt;The first article I read stated that you would have to visit Redmond, WA and sit with an SSRS developer to even think about developing a rendering extension. I didn't buy this and kept searching.&lt;br /&gt;&lt;br /&gt;There isn't a lot out there on rendering extensions, but I did find several references to the following assemblies:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Microsoft.ReportingServices.Interfaces&lt;br&gt;Microsoft.ReportingServices.ReportRendering&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;So with that, I started to develop a prototype solution to the tab rendering problem.&lt;br /&gt;&lt;br /&gt;My first decision was to only render tables and matrices. The SSRS CSV renderer tries to render textboxes, which only leads to malformed CSV files. And since most of the time the tab delimited export is going to be loaded into Excel, I decided to just focus on the table and the matrix control.&lt;br /&gt;&lt;br /&gt;More to come in the next post...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413638223026049990-2078042005930083762?l=bobp1339.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bobp1339.blogspot.com/feeds/2078042005930083762/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413638223026049990&amp;postID=2078042005930083762' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/2078042005930083762'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/2078042005930083762'/><link rel='alternate' type='text/html' href='http://bobp1339.blogspot.com/2009/06/tab-delimited-renderer-in-ssrs-2005.html' title='Tab Delimited Renderer in SSRS 2005'/><author><name>Bob Pearson</name><uri>http://www.blogger.com/profile/16528166535649336177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413638223026049990.post-2412398872570336526</id><published>2009-03-06T09:24:00.004-05:00</published><updated>2009-03-06T11:40:03.372-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='ssis'/><category scheme='http://www.blogger.com/atom/ns#' term='missing'/><category scheme='http://www.blogger.com/atom/ns#' term='lessons'/><category scheme='http://www.blogger.com/atom/ns#' term='datetime'/><category scheme='http://www.blogger.com/atom/ns#' term='error'/><category scheme='http://www.blogger.com/atom/ns#' term='mistakes'/><title type='text'>Last Update Dates</title><content type='html'>It's been a while... We are well into deployment and finalization of this version of our ETL and reporting system. Things are going well.&lt;br /&gt;&lt;br /&gt;Recently I ran into an interesting ETL problem while using a source system "last update" field. Let me give you some background.&lt;br /&gt;&lt;br /&gt;We have an ETL process that reads from a source system that was developed in-house. The queries were all based on the last update field in all of the tables. &lt;br /&gt;&lt;br /&gt;While in UAT, several reports were reported as missing rows. After investigating, it appeared that the rows had never made it to the data mart. Needless to say, this was very worrisome. &lt;br /&gt;&lt;br /&gt;I researched and tried to find out why these rows were excluded. There seemed to be no pattern, just random rows. &lt;br /&gt;&lt;br /&gt;While looking at my morning logs, I noticed something strange. The ETL Last Update table showed times from about 5 hours after the ETL had run. It should have been when the ETL had run. &lt;br /&gt;&lt;br /&gt;I looked in the source system, and there were 3 rows that had update dates &lt;em&gt;in the future!&lt;/em&gt;  5 hours to be exact!&lt;br /&gt;&lt;br /&gt;It turns out that under certain circumstances, the source system was using the wrong date/time to update the last update field. And this date was GMT, so it was 5 hours in the "future" when it was applied to the last update field. &lt;br /&gt;&lt;br /&gt;The result of this was missed records on the ETL. It would miss 5 hours worth of updates anytime this occured in the source system.&lt;br /&gt;&lt;br /&gt;So my recommendation, which I am now kicking myself for not implementing to begin with, is this:  Always use a date range, not just a "Greater than" for last update fields. For example:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Where LastUpdate Between '3/5/09 11:00:00' and GetDate()&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;And the other rule... Never trust the source system to be accurate 100% of the time. Anticipate issues like this.&lt;br /&gt;&lt;br /&gt;Anyway, that's all for now. &lt;br /&gt;&lt;br /&gt;peace&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413638223026049990-2412398872570336526?l=bobp1339.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bobp1339.blogspot.com/feeds/2412398872570336526/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413638223026049990&amp;postID=2412398872570336526' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/2412398872570336526'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/2412398872570336526'/><link rel='alternate' type='text/html' href='http://bobp1339.blogspot.com/2009/03/last-update-dates.html' title='Last Update Dates'/><author><name>Bob Pearson</name><uri>http://www.blogger.com/profile/16528166535649336177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413638223026049990.post-3538720027697649937</id><published>2008-12-18T09:32:00.002-05:00</published><updated>2008-12-18T09:38:05.857-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='evaluation'/><category scheme='http://www.blogger.com/atom/ns#' term='ssas'/><category scheme='http://www.blogger.com/atom/ns#' term='point'/><category scheme='http://www.blogger.com/atom/ns#' term='2007'/><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='implementation'/><category scheme='http://www.blogger.com/atom/ns#' term='performancepoint'/><category scheme='http://www.blogger.com/atom/ns#' term='dashboard'/><title type='text'>PerformancePoint Server 2007</title><content type='html'>We have begun the task of implementing PerformancePoint Server 2007 (PPS) on top of our existing data marts. Right now we are in the early stages of the requirements gathering. However, I have had a good chance to play with PPS and it is very slick!&lt;br /&gt;&lt;br /&gt;I would highly recommend anyone needing a dashboard application to download the evaluation version and spend some time on it. You can download it &lt;a href="http://www.microsoft.com/business/performancepoint" target="_blank"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;You will see some more blogs about it in the very near future because some of the stuff this can do is worth writing about. Also, some of the pitfalls that we have hit are interesting as well!&lt;br /&gt;&lt;br /&gt;peace&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413638223026049990-3538720027697649937?l=bobp1339.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bobp1339.blogspot.com/feeds/3538720027697649937/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413638223026049990&amp;postID=3538720027697649937' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/3538720027697649937'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/3538720027697649937'/><link rel='alternate' type='text/html' href='http://bobp1339.blogspot.com/2008/12/performancepoint-server-2007.html' title='PerformancePoint Server 2007'/><author><name>Bob Pearson</name><uri>http://www.blogger.com/profile/16528166535649336177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413638223026049990.post-32953407967915687</id><published>2008-12-10T11:40:00.005-05:00</published><updated>2008-12-10T11:54:05.943-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dt_dbtimestamp'/><category scheme='http://www.blogger.com/atom/ns#' term='scd'/><category scheme='http://www.blogger.com/atom/ns#' term='ssis'/><category scheme='http://www.blogger.com/atom/ns#' term='data type'/><category scheme='http://www.blogger.com/atom/ns#' term='datetime'/><category scheme='http://www.blogger.com/atom/ns#' term='time'/><category scheme='http://www.blogger.com/atom/ns#' term='error'/><category scheme='http://www.blogger.com/atom/ns#' term='datatype'/><category scheme='http://www.blogger.com/atom/ns#' term='BI'/><category scheme='http://www.blogger.com/atom/ns#' term='dt_date'/><category scheme='http://www.blogger.com/atom/ns#' term='date'/><category scheme='http://www.blogger.com/atom/ns#' term='slowly changing dimension'/><title type='text'>DateTime Columns in Slowly Changing Dimension Component</title><content type='html'>We had an interesting error when implementing a slowly changing dimension in SSIS this week.&lt;br /&gt;&lt;br /&gt;We had a date column that we were passing thru to the database from the source.  However, the source was a script task because it came in from a &lt;a href="http://bobp1339.blogspot.com/2008/09/how-to-use-ssis-script-component-as.html"&gt;multi-resultset stored procedure&lt;/a&gt;. In other data flows, where we were using an OLE DB destination, we typed datetime columns as DT_DATE.  However, when we used DT_DATE with the slowly changing dimension component, it threw an error:&lt;blockquote&gt;Error at Import Data [Slowly Changing Dimension]:The input column "input column "ALDATE (15157)" cannot be mapped to external column "external column "ALDATE (15160)" because they have different data types. The Slowly Changing Dimension transformation does not allow mapping between column of different types except for DT_STR and DT_WDTR.&lt;/blockquote&gt;After much digging and research, we determined that we had to set the output column type on the script component to DT_DBTIMESTAMP.  Once we changed that, the SCD worked just fine!&lt;br /&gt;&lt;br /&gt;peace&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413638223026049990-32953407967915687?l=bobp1339.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bobp1339.blogspot.com/feeds/32953407967915687/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413638223026049990&amp;postID=32953407967915687' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/32953407967915687'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/32953407967915687'/><link rel='alternate' type='text/html' href='http://bobp1339.blogspot.com/2008/12/datetime-columns-in-slowly-changing.html' title='DateTime Columns in Slowly Changing Dimension Component'/><author><name>Bob Pearson</name><uri>http://www.blogger.com/profile/16528166535649336177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413638223026049990.post-7933744326371259172</id><published>2008-12-05T11:17:00.003-05:00</published><updated>2008-12-05T12:10:00.113-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='csv'/><category scheme='http://www.blogger.com/atom/ns#' term='ssis'/><category scheme='http://www.blogger.com/atom/ns#' term='file'/><category scheme='http://www.blogger.com/atom/ns#' term='count'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='utility'/><category scheme='http://www.blogger.com/atom/ns#' term='shortcoming'/><category scheme='http://www.blogger.com/atom/ns#' term='field'/><title type='text'>Importing CSV Files with SSIS</title><content type='html'>One of the shortcomings of the comma separated value (CSV) file import in SSIS is the inability for SSIS to determine if there are too few fields in a record. &lt;br /&gt;&lt;br /&gt;According to Microsoft, they only check for the end of record indicator (Ususally a CR/LF) when processing the last column in the file. If you are not on the last column, and a CR/LF is encountered, it is ignored and the first field of the new line is added to the last column of the previous line.&lt;br /&gt;&lt;br /&gt;Here is an example of what you see:&lt;blockquote&gt;&lt;br /&gt;SSIS is set up to accept 3 columns in a CSV file: Col1, Col2 and Col3.&lt;br /&gt;&lt;br /&gt;File comes in like this:&lt;br /&gt;&lt;br /&gt;Col1,Col2&lt;br /&gt;A1,A2&lt;br /&gt;B1,B2&lt;br /&gt;C1,C2&lt;br /&gt;&lt;br /&gt;When ssis imports this file it produces this result:&lt;br /&gt;Record 1:   A1, A2B1, B2&lt;br /&gt;Record 2:   C1,C2 Error - Column Delimiter Not Found&lt;br /&gt;&lt;/blockquote&gt;Now, when troubleshooting this error, you can be looking in the wrong place, since the error usually shows up only at the end of the file. &lt;br /&gt;&lt;br /&gt;So what I have been doing to gracefully catch and report on this is to quickly pre-process the file to count the columns. Since the processes that create the CSV files for my app are automated, I can assume that every record in the file has the same number of fields, and I only need to count 1 row. If you cannot assume this, it would be just as easy to loop thru each row and determine the field count.&lt;br /&gt;&lt;br /&gt;I would also like to point out that my code does not yet handle commas embedded within quote delimited fields.  For example, if your record looked like this:&lt;blockquote&gt;1,"this is um, the field", 1,1&lt;/blockquote&gt;I will be posting code for that next week sometime.&lt;br /&gt;&lt;br /&gt;Ok, so here is what I am doing.&lt;br /&gt;&lt;br /&gt;I set up a script task in the control flow, before I try to open the file with ssis. This is the code I use:&lt;blockquote&gt;Imports System&lt;br /&gt;Imports System.Data&lt;br /&gt;Imports System.Math&lt;br /&gt;Imports Microsoft.SqlServer.Dts.Runtime&lt;br /&gt;&lt;br /&gt;Imports System.IO&lt;br /&gt;&lt;br /&gt;Public Class ScriptMain&lt;br /&gt;&lt;br /&gt;    Public Sub Main()&lt;br /&gt;&lt;br /&gt;        Dim sr As StreamReader&lt;br /&gt;        Dim Textline As String&lt;br /&gt;        Dim Fields As String()&lt;br /&gt;&lt;br /&gt;        sr = File.OpenText("C:\FileName.csv")&lt;br /&gt;&lt;br /&gt;        If Not sr.EndOfStream Then&lt;br /&gt;            sr.ReadLine() 'Skip 1 row (Header) &lt;br /&gt;        End If&lt;br /&gt;&lt;br /&gt;        If Not sr.EndOfStream Then&lt;br /&gt;            Textline = sr.ReadLine() 'Read in the entire line of text.&lt;br /&gt;            Fields = Textline.Split(Convert.ToChar(",")) ' Split the line of text into a string array.&lt;br /&gt;        Else&lt;br /&gt;            sr.Close()&lt;br /&gt;            sr.Dispose()&lt;br /&gt;&lt;br /&gt;            Dts.TaskResult = Dts.Results.Failure 'There were no records after the header. This might not be a failure in all implementations.&lt;br /&gt;            Exit Sub&lt;br /&gt;        End If&lt;br /&gt;&lt;br /&gt;        sr.Close()&lt;br /&gt;        sr.Dispose()&lt;br /&gt;&lt;br /&gt;        If Fields.Length &lt;&gt; 25 Then ' If there are not 25 fields in the record, raise error. &lt;br /&gt;            Dts.TaskResult = Dts.Results.Failure&lt;br /&gt;            Err.Raise(vbObjectError + 513, Nothing, "Field Count is Invalid! 25 expected, " + Fields.Length.ToString() + " received.")&lt;br /&gt;            Exit Sub&lt;br /&gt;        End If&lt;br /&gt;&lt;br /&gt;        Dts.TaskResult = Dts.Results.Success&lt;br /&gt;&lt;br /&gt;    End Sub&lt;br /&gt;&lt;br /&gt;End Class&lt;/blockquote&gt;&lt;br /&gt;When this code runs, it generates an error if the field count is not correct.&lt;br /&gt;&lt;br /&gt;If you need to check multiple file layouts, you can put the script task into a foreach container in SSIS and use database lookups to get the field length based on the filename, making this code totally reusable!&lt;br /&gt;&lt;br /&gt;Also note... I actually converted this code into a C# dll and put it in the GAC on the SSIS server so all I have to do is call that dll in my script task. I will blog about that soon.&lt;br /&gt;&lt;br /&gt;Hope this helps!&lt;br /&gt;&lt;br /&gt;peace&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413638223026049990-7933744326371259172?l=bobp1339.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bobp1339.blogspot.com/feeds/7933744326371259172/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413638223026049990&amp;postID=7933744326371259172' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/7933744326371259172'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/7933744326371259172'/><link rel='alternate' type='text/html' href='http://bobp1339.blogspot.com/2008/12/importing-csv-files-with-ssis.html' title='Importing CSV Files with SSIS'/><author><name>Bob Pearson</name><uri>http://www.blogger.com/profile/16528166535649336177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413638223026049990.post-5482943133633578587</id><published>2008-12-02T16:27:00.003-05:00</published><updated>2008-12-02T16:34:46.558-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ssis'/><category scheme='http://www.blogger.com/atom/ns#' term='GUID'/><category scheme='http://www.blogger.com/atom/ns#' term='uniqueidentifier'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Command task'/><category scheme='http://www.blogger.com/atom/ns#' term='mapping'/><category scheme='http://www.blogger.com/atom/ns#' term='error'/><category scheme='http://www.blogger.com/atom/ns#' term='no data'/><category scheme='http://www.blogger.com/atom/ns#' term='parameter'/><category scheme='http://www.blogger.com/atom/ns#' term='stored procedure'/><category scheme='http://www.blogger.com/atom/ns#' term='no results'/><title type='text'>Using GUID Data Type in SQL Command Task</title><content type='html'>I have now run into this problem several times, so I thought I would write it down.&lt;br /&gt;&lt;br /&gt;Just had a colleague come to me with an issue of the SQL Command task not returning the data it should have.&lt;br /&gt;&lt;br /&gt;Looking at his stored proc, everything seemed fine. The proc took in a UniqueIdentifier and returned a SELECT from a table.&lt;br /&gt;&lt;br /&gt;The SQL Command task in SSIS passed a GUID and put the result set into an object variable.&lt;br /&gt;&lt;br /&gt;However, by watching Profiler, we captured that the value being sent to the stored procedure parameter from the SQL Command task was not the GUID that was being processed in SSIS.&lt;br /&gt;&lt;br /&gt;So on the parameter mapping tab we changed the data type of the parameter from GUID to VARCHAR(70).&lt;br /&gt;&lt;br /&gt;After that the SQL Command returned the rows that were expected.&lt;br /&gt;&lt;br /&gt;I hope this helps someone out there&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413638223026049990-5482943133633578587?l=bobp1339.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bobp1339.blogspot.com/feeds/5482943133633578587/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413638223026049990&amp;postID=5482943133633578587' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/5482943133633578587'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/5482943133633578587'/><link rel='alternate' type='text/html' href='http://bobp1339.blogspot.com/2008/12/using-guid-data-type-in-sql-command.html' title='Using GUID Data Type in SQL Command Task'/><author><name>Bob Pearson</name><uri>http://www.blogger.com/profile/16528166535649336177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413638223026049990.post-7047282896713678656</id><published>2008-11-10T09:38:00.002-05:00</published><updated>2008-11-10T09:42:06.058-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='timeout'/><category scheme='http://www.blogger.com/atom/ns#' term='reportingservice2005'/><category scheme='http://www.blogger.com/atom/ns#' term='report viewer'/><category scheme='http://www.blogger.com/atom/ns#' term='web service'/><title type='text'>Timeouts in SSRS 2005 Web Service and Report Viewer Control</title><content type='html'>One of the questions that I get asked a lot is how to prevent timeouts when running or exporting large reports using the SSRS web service or the .NET report viewer control.&lt;br /&gt;&lt;br /&gt;With the report viewer control, this is fairly simple; the problem is that the property is hiding in the property tab. In the property tab, expand the ServerReport property, and set the timeout value to a large number or to -1 (infinite timeout)&lt;br /&gt;&lt;br /&gt;For the web services, the ReportExecutionService instance contains the property Timeout.&lt;br /&gt;&lt;br /&gt;In my &lt;a href=http://bobp1339.blogspot.com/2007/11/rendering-ssrs-2005-reports-with-web.html&gt;previous post&lt;/a&gt; showing how to use the web service, I neglected to add the timeout property.  &lt;blockquote&gt;&lt;br /&gt;ReportExecutionService re = new ReportExecutionService();&lt;br /&gt;re.Credentials = System.Net.CredentialCache.DefaultCredentials;&lt;br /&gt;re.Timeout = -1;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Also, when working with the web service in SSRS 2005, you have to keep the IIS timeouts in mind.  For example, the session timeout by default is 20 minutes. If you have reports taking longer than that, you would need to increase this setting in IIS.  However, if your reports are taking that long, I would consider using SSIS to pre-process the report data on a schedule and then run the report against the pre processed data. That is a much more elegant solution.&lt;br /&gt;&lt;br /&gt;peace&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413638223026049990-7047282896713678656?l=bobp1339.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bobp1339.blogspot.com/feeds/7047282896713678656/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413638223026049990&amp;postID=7047282896713678656' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/7047282896713678656'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/7047282896713678656'/><link rel='alternate' type='text/html' href='http://bobp1339.blogspot.com/2008/11/timeouts-in-ssrs-2005-web-service-and.html' title='Timeouts in SSRS 2005 Web Service and Report Viewer Control'/><author><name>Bob Pearson</name><uri>http://www.blogger.com/profile/16528166535649336177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413638223026049990.post-8756857647789570454</id><published>2008-11-04T09:31:00.002-05:00</published><updated>2008-11-04T09:36:36.808-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tricks'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL2008'/><category scheme='http://www.blogger.com/atom/ns#' term='data'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='ssis'/><category scheme='http://www.blogger.com/atom/ns#' term='news'/><category scheme='http://www.blogger.com/atom/ns#' term='industry'/><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><category scheme='http://www.blogger.com/atom/ns#' term='ssrs'/><category scheme='http://www.blogger.com/atom/ns#' term='BI'/><category scheme='http://www.blogger.com/atom/ns#' term='future'/><title type='text'>WANTED: Your Opinion and Thoughts...</title><content type='html'>Ok, So I have been a bit slack in the blog department. &lt;br /&gt;&lt;br /&gt;I have been finding it hard to break out of the everyday rut of work to post anything. &lt;br /&gt;&lt;br /&gt;Well, that has to change. I need to get out of this rut, to challenge myself, to expand my horizons.  After all, the project I am working on is quite interesting, why not share?&lt;br /&gt;&lt;br /&gt;So I have been thinking... Is anyone out there interested in a daily or weekly email newsletter for BI?  Maybe a forum, etc?  User donated articles, etc? Sort of like &lt;a href="http://codeproject.com"&gt;Code Project&lt;/a&gt;, except for BI? A place where I can get everyone involved, rather than just myself. &lt;br /&gt;&lt;br /&gt;I would like to hear some feedback, as well as thoughts or ideas.&lt;br /&gt; &lt;br /&gt;Meanwhile, I have to get back to work. I have an article on the ForEach SSIS Task almost complete.  I will try to post it today.&lt;br /&gt;&lt;br /&gt;peace&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413638223026049990-8756857647789570454?l=bobp1339.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bobp1339.blogspot.com/feeds/8756857647789570454/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413638223026049990&amp;postID=8756857647789570454' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/8756857647789570454'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/8756857647789570454'/><link rel='alternate' type='text/html' href='http://bobp1339.blogspot.com/2008/11/wanted-your-opinion-and-thoughts.html' title='WANTED: Your Opinion and Thoughts...'/><author><name>Bob Pearson</name><uri>http://www.blogger.com/profile/16528166535649336177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413638223026049990.post-6328144190656060896</id><published>2008-09-09T17:30:00.002-04:00</published><updated>2008-09-09T17:36:13.504-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='black hole'/><category scheme='http://www.blogger.com/atom/ns#' term='news'/><category scheme='http://www.blogger.com/atom/ns#' term='end of the world'/><category scheme='http://www.blogger.com/atom/ns#' term='collider'/><category scheme='http://www.blogger.com/atom/ns#' term='humor'/><title type='text'>CERN Powers Up The Large Hadron Collider Overnight</title><content type='html'>Well... On Wednesday, at 3:30AM EDT, the Large Hadron Collider will be powered up.&lt;br /&gt;&lt;br /&gt;I guess we will know shortly if it will unleash many tiny black holes that will consume the Earth.&lt;br /&gt;&lt;br /&gt;Or better yet, a time machine :)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.foxnews.com/story/0,2933,419404,00.html"&gt;http://www.foxnews.com/story/0,2933,419404,00.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;peace&lt;br /&gt;&lt;br /&gt;Look out for black holes...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413638223026049990-6328144190656060896?l=bobp1339.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bobp1339.blogspot.com/feeds/6328144190656060896/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413638223026049990&amp;postID=6328144190656060896' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/6328144190656060896'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/6328144190656060896'/><link rel='alternate' type='text/html' href='http://bobp1339.blogspot.com/2008/09/cern-powers-up-large-hadron-collider.html' title='CERN Powers Up The Large Hadron Collider Overnight'/><author><name>Bob Pearson</name><uri>http://www.blogger.com/profile/16528166535649336177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413638223026049990.post-8492139310430352064</id><published>2008-09-05T14:43:00.000-04:00</published><updated>2008-09-05T14:44:54.139-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wildcard'/><category scheme='http://www.blogger.com/atom/ns#' term='Script'/><category scheme='http://www.blogger.com/atom/ns#' term='ssis'/><category scheme='http://www.blogger.com/atom/ns#' term='file'/><category scheme='http://www.blogger.com/atom/ns#' term='flow control'/><category scheme='http://www.blogger.com/atom/ns#' term='BI'/><category scheme='http://www.blogger.com/atom/ns#' term='precedence constraint'/><category scheme='http://www.blogger.com/atom/ns#' term='exists'/><title type='text'>Determining if a File Exists in SSIS Using Wildcards</title><content type='html'>In some instances I have had to deal with files that did not have a set name.  In these cases, I have a handy script file to determine if the files are there.&lt;br /&gt;&lt;br /&gt;(Another way to handle this is to use the ForEach task and use a wildcard in there, but I am going to blog about that next week)&lt;br /&gt;&lt;br /&gt;First, I add a variable to my package.  I usually call this variable FileExists and set it as a Boolean, with a default value of False.&lt;br /&gt;&lt;br /&gt;I then add a script task to my control flow. In the Read/Write variable property, I add User::FileExists.&lt;br /&gt;&lt;br /&gt;In the script editor, I use this script:&lt;blockquote&gt;&lt;br /&gt;Imports System&lt;br /&gt;Imports System.Data&lt;br /&gt;Imports System.Math&lt;br /&gt;Imports Microsoft.SqlServer.Dts.Runtime&lt;br /&gt;Imports System.IO&lt;br /&gt;&lt;br /&gt;Public Class ScriptMain&lt;br /&gt;&lt;br /&gt;    Public Sub Main()&lt;br /&gt;&lt;br /&gt;        Dim di As DirectoryInfo = New DirectoryInfo("c:\")&lt;br /&gt;&lt;br /&gt;        Dim fi As FileInfo() = di.GetFiles("*.txt")&lt;br /&gt;&lt;br /&gt;        If fi.Length &gt; 0 Then&lt;br /&gt;            Dts.Variables("User::FileExists").Value = True&lt;br /&gt;        Else&lt;br /&gt;            Dts.Variables("User::FileExists").Value = False&lt;br /&gt;        End If&lt;br /&gt;&lt;br /&gt;        Dts.TaskResult = Dts.Results.Success&lt;br /&gt;    End Sub&lt;br /&gt;&lt;br /&gt;End Class&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;This searches c:\  for a file *.txt.  The Length property of FileInfo is the number of files found. If this is greater than zero, I set the FileExists variable to True.&lt;br /&gt;&lt;br /&gt;After closing the script editor, and clicking OK on the script task property window, I am ready to set up my precedence constraint.&lt;br /&gt;&lt;br /&gt;I then add my next task to the control flow and drag the flow control from the script task to the new task.  I right click on the constraint and select edit.  I select Expression in the Evaluation Operation drop down box.  For the expression I use: @[User::FileExists]==true.  This way, the only way the next task is executed is if files exist. If the don’t exists, the package ends gracefully.&lt;br /&gt;&lt;br /&gt;You could add another task to log the fact that there were no files, connect the script to that task, and set the expression to: @[User::FileExists]==false.&lt;br /&gt;&lt;br /&gt;peace&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413638223026049990-8492139310430352064?l=bobp1339.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bobp1339.blogspot.com/feeds/8492139310430352064/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413638223026049990&amp;postID=8492139310430352064' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/8492139310430352064'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/8492139310430352064'/><link rel='alternate' type='text/html' href='http://bobp1339.blogspot.com/2008/09/determining-if-file-exists-in-ssis.html' title='Determining if a File Exists in SSIS Using Wildcards'/><author><name>Bob Pearson</name><uri>http://www.blogger.com/profile/16528166535649336177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413638223026049990.post-3669238762183579978</id><published>2008-09-02T09:32:00.006-04:00</published><updated>2008-09-03T00:29:37.541-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Script'/><category scheme='http://www.blogger.com/atom/ns#' term='multiple'/><category scheme='http://www.blogger.com/atom/ns#' term='ssis'/><category scheme='http://www.blogger.com/atom/ns#' term='data source'/><category scheme='http://www.blogger.com/atom/ns#' term='how to'/><category scheme='http://www.blogger.com/atom/ns#' term='multi'/><category scheme='http://www.blogger.com/atom/ns#' term='resultset'/><title type='text'>How to Use the SSIS Script Component as a Data Source</title><content type='html'>Recently I had the pleasure of working with a data source that returned all of the transactions with 1 stored procedure. However, this meant the stored procedure returned 14 result sets, and an output parameter.&lt;br /&gt;&lt;br /&gt;The question was how to get the 15 result sets into SSIS.  The answer: Use a Script Component.&lt;br /&gt;&lt;br /&gt;Here is the path I took to handle this:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Making the Connection&lt;/strong&gt;&lt;br /&gt;All connections in SSIS are handled thru connection managers.  We will have to have a connection manager to connect to the source database to execute the stored procedure.&lt;br /&gt;&lt;br /&gt;In the Connection Manager tab of SSIS, right click and select New ADO.NET Connection…&lt;br /&gt;Setup your connection properties, click on Test Connection. Once you have a good connection, you are ready for the next step.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Setup a Script Component&lt;/strong&gt;&lt;br /&gt;I added a script component to my data flow task. When asked if it was a Source, Transformation or a Destination, I selected Source.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_Usa_vGfoYn0/SL1AzNhYmxI/AAAAAAAAAAk/1WIXpRrQf3c/s1600-h/Create+Script+Component.jpg"&gt;&lt;img style="float:center; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_Usa_vGfoYn0/SL1AzNhYmxI/AAAAAAAAAAk/1WIXpRrQf3c/s320/Create+Script+Component.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5241416789876316946" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I then added a total of 15 outputs. (14 for the result sets, 1 for the output parameter) To do this, I clicked on the Inputs and Outputs tab, and clicked on the Add Output button until I have 15 outputs.&lt;br /&gt;&lt;br /&gt;Then came the fun part: adding, naming and typing all of the columns for all of the outputs.  On the same Inputs and Outputs tab, I selected the first output, renamed it to the result set name.  Then I opened up the output in the tree view, and expanded the Output Columns folder.  I clicked on the Add Column button until I had as many columns as the first result set.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_Usa_vGfoYn0/SL1BB92Dn9I/AAAAAAAAAA0/q0ji5rXIeaA/s1600-h/Adding+Columns+and+Outputs.jpg"&gt;&lt;img style="float:center; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_Usa_vGfoYn0/SL1BB92Dn9I/AAAAAAAAAA0/q0ji5rXIeaA/s320/Adding+Columns+and+Outputs.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5241417043366092754" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Once the columns where in the tree view, I selected the first one, changed the name, set the data type and size, and moved onto the next column, until they were complete.&lt;br /&gt;&lt;br /&gt;Then I did the same for each output in the component.&lt;br /&gt;&lt;br /&gt;The final step here is to configure the script component to use your newly created connection manager.  To do this, click on the Connection tab and add a new connection.  Set the name, and then in the middle column, choose your connection manager.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_Usa_vGfoYn0/SL1A66EbRnI/AAAAAAAAAAs/rmrwEpy6LY4/s1600-h/Make+The+Connection.jpg"&gt;&lt;img style="float:center; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_Usa_vGfoYn0/SL1A66EbRnI/AAAAAAAAAAs/rmrwEpy6LY4/s320/Make+The+Connection.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5241416922093536882" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Scripting the Outputs&lt;/strong&gt;&lt;br /&gt;The next step is to tie together the stored procedure and the script component outputs.  To do this, click on the script tab and click the Design Script button to open the scripting window.&lt;br /&gt;&lt;br /&gt;I added 2 subroutines to handle opening the connection and executing the stored procedure:&lt;blockquote&gt;&lt;br /&gt;Public Class ScriptMain&lt;br /&gt;    Inherits UserComponent&lt;br /&gt;&lt;br /&gt;    Private connMgr As IDTSConnectionManager90&lt;br /&gt;    Private Conn As SqlConnection&lt;br /&gt;    Private Cmd As SqlCommand&lt;br /&gt;    Private sqlReader As SqlDataReader&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    Public Overrides Sub AcquireConnections(ByVal Transaction As Object)&lt;br /&gt;&lt;br /&gt;        connMgr = Me.Connections.Connection ‘This is the connection to your connection manager.&lt;br /&gt;        Conn = CType(connMgr.AcquireConnection(Nothing), SqlConnection)&lt;br /&gt;        &lt;br /&gt;    End Sub&lt;br /&gt;&lt;br /&gt;    Public Overrides Sub PreExecute()&lt;br /&gt;&lt;br /&gt;        Dim cmd As New SqlCommand("Declare @SessionID int;  Exec spgTransactions @SessionID OUTPUT; Select @SessionID", Conn)&lt;br /&gt;        sqlReader = cmd.ExecuteReader&lt;br /&gt;&lt;br /&gt;    End Sub&lt;/blockquote&gt;  &lt;br /&gt;The AcquireConnections subroutine is called by SSIS when it is ready to open the database connections. I override it to make sure the database connection is ready to use.&lt;br /&gt;&lt;br /&gt;Likewise, the PreExecute is called when it’s time to get the data.  (This should clear up some of the long running PreExecute issues out there.) I open our SQL Reader here and execute the source stored procedure.&lt;br /&gt;&lt;br /&gt;Now comes the fun part.  Linking the result sets to the output columns.&lt;br /&gt;&lt;br /&gt;This is done in the CreateNewOutputRows subroutine:&lt;blockquote&gt;    Public Overrides Sub CreateNewOutputRows()&lt;br /&gt;&lt;br /&gt;        'Invoice Header&lt;br /&gt;        Do While sqlReader.Read&lt;br /&gt;            With Me.InvoiceHeaderBuffer&lt;br /&gt;                .AddRow()&lt;br /&gt;                .InvoiceNumber = sqlReader.GetInt32(0)&lt;br /&gt;    .InvoiceDate = sqlReader.GetDate(1)&lt;br /&gt;  'etc, etc, etc for all columns.&lt;br /&gt;            End With&lt;br /&gt;        Loop&lt;br /&gt;&lt;br /&gt;        sqlReader.NextResult()&lt;br /&gt;&lt;br /&gt;        'Invoice Detail&lt;br /&gt;        Do While sqlReader.Read&lt;br /&gt;            With Me.InvoiceDetailBuffer&lt;br /&gt;                .AddRow()&lt;br /&gt;        ...&lt;br /&gt;        &lt;br /&gt;        'more outputs and more columns&lt;br /&gt;        ' until we get to the last result set which will be the output parameter (SessionID)&lt;br /&gt;&lt;br /&gt;        sqlReader.NextResult()&lt;br /&gt;&lt;br /&gt;        'Session ID&lt;br /&gt;        'We know this result set has only 1 row&lt;br /&gt;        sqlReader.Read&lt;br /&gt;        With Me.SessionIDBuffer&lt;br /&gt;            .AddRow()&lt;br /&gt;            .SessionID = sqlReader.GetInt32(0)&lt;br /&gt;        End With&lt;br /&gt;&lt;br /&gt;        sqlReader.Read  'Clear the read queue&lt;br /&gt;       &lt;br /&gt;     End Sub&lt;/blockquote&gt;&lt;br /&gt;This code goes thru each result set in the SQL Reader and assigns the value of the result set to the output column. I did not show all of the columns or all of the outputs since it’s the same concept for each.&lt;br /&gt;&lt;br /&gt;Once that is done, I clean up after myself:&lt;blockquote&gt; Public Overrides Sub PostExecute()&lt;br /&gt;&lt;br /&gt;        sqlReader.Close()&lt;br /&gt;&lt;br /&gt;    End Sub&lt;br /&gt;&lt;br /&gt;    Public Overrides Sub ReleaseConnections()&lt;br /&gt;&lt;br /&gt;        connMgr.ReleaseConnection(Conn)&lt;br /&gt;&lt;br /&gt;    End Sub&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;This closes the SQL Reader and releases the connection to the database.&lt;br /&gt;&lt;br /&gt;Once this is done, close the script window and click on OK on the script component properties.&lt;br /&gt;&lt;br /&gt;The script component will now have multiple outputs that you can select from when linking it to another data flow component.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br /&gt;I hope this will help you when you need to return multiple result sets from stored procedures into SSIS. If you are familiar with VB.NET coding, you should pick this up easily, and even if not, the example at least gives you the basic steps and something to copy from.&lt;br /&gt;&lt;br /&gt;peace&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413638223026049990-3669238762183579978?l=bobp1339.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bobp1339.blogspot.com/feeds/3669238762183579978/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413638223026049990&amp;postID=3669238762183579978' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/3669238762183579978'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/3669238762183579978'/><link rel='alternate' type='text/html' href='http://bobp1339.blogspot.com/2008/09/how-to-use-ssis-script-component-as.html' title='How to Use the SSIS Script Component as a Data Source'/><author><name>Bob Pearson</name><uri>http://www.blogger.com/profile/16528166535649336177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Usa_vGfoYn0/SL1AzNhYmxI/AAAAAAAAAAk/1WIXpRrQf3c/s72-c/Create+Script+Component.jpg' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413638223026049990.post-202515834271156061</id><published>2008-08-29T08:31:00.007-04:00</published><updated>2008-08-29T08:36:44.865-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='requirements'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='industry'/><category scheme='http://www.blogger.com/atom/ns#' term='humor'/><category scheme='http://www.blogger.com/atom/ns#' term='deadlines'/><title type='text'>Hug a Developer...</title><content type='html'>This would be a lot funnier if it weren't so true...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;embed src="http://blip.tv/play/gYwjwZJqjdEh" width="440" height="390" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true"&gt;&lt;/embed&gt;&lt;br /&gt;&lt;br /&gt;What are your thoughts?&lt;br /&gt;&lt;br /&gt;peace&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413638223026049990-202515834271156061?l=bobp1339.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bobp1339.blogspot.com/feeds/202515834271156061/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413638223026049990&amp;postID=202515834271156061' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/202515834271156061'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/202515834271156061'/><link rel='alternate' type='text/html' href='http://bobp1339.blogspot.com/2008/08/hug-developer.html' title='Hug a Developer...'/><author><name>Bob Pearson</name><uri>http://www.blogger.com/profile/16528166535649336177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413638223026049990.post-9156323627907052428</id><published>2008-08-28T08:52:00.003-04:00</published><updated>2008-08-28T08:55:54.976-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='ssis'/><category scheme='http://www.blogger.com/atom/ns#' term='industry'/><category scheme='http://www.blogger.com/atom/ns#' term='BI'/><category scheme='http://www.blogger.com/atom/ns#' term='2008'/><title type='text'>SSIS 2008 Sets Record</title><content type='html'>&lt;p&gt;First of all, hello from the depths of an enterprise ETL project!&lt;/p&gt;&lt;p&gt;I haven't been working on reporting at all in the last few months, dedicated to ETL and optimization.&lt;/p&gt;&lt;p&gt;Second, I realize that this article is from February, but I thought it was a really good read. &lt;br /&gt;&lt;a href="http://blogs.msdn.com/sqlperf/archive/2008/02/27/etl-world-record.aspx"&gt;http://blogs.msdn.com/sqlperf/archive/2008/02/27/etl-world-record.aspx&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;peace&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413638223026049990-9156323627907052428?l=bobp1339.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bobp1339.blogspot.com/feeds/9156323627907052428/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413638223026049990&amp;postID=9156323627907052428' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/9156323627907052428'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/9156323627907052428'/><link rel='alternate' type='text/html' href='http://bobp1339.blogspot.com/2008/08/ssis-2008-sets-record.html' title='SSIS 2008 Sets Record'/><author><name>Bob Pearson</name><uri>http://www.blogger.com/profile/16528166535649336177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413638223026049990.post-787876163351083888</id><published>2008-05-28T10:03:00.003-04:00</published><updated>2008-05-28T10:17:50.678-04:00</updated><title type='text'>Removing Recent Projects in .NET</title><content type='html'>I recently had a need to cleanup my "recent project list" in BIDS.&lt;br /&gt;&lt;br /&gt;Since you cannot do this from the .NET UI, you will have to resort to messing with the registry.  &lt;center&gt;&lt;br /&gt;&lt;h5&gt;&lt;br /&gt;*** Serious problems might occur if you modify the registry incorrectly!!! ***&lt;br /&gt;*** Modify the registry at your own risk!!! ***  &lt;/h5&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;That being said... Open up RegEdt32 using the Run command from the start menu.&lt;br /&gt;Navigate to: &lt;br /&gt;&lt;blockquote&gt;HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\8.0\ProjectMRUList&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;(for .NET 2003, use 7.1 instead of 8.0, for .NET 2002, use 7.0)&lt;br /&gt;&lt;br /&gt;Then, from the right hand window, select the values that you do not want, and press delete.  The value names are File1, File2, ... &lt;br /&gt;&lt;br /&gt;Be aware that you will need to renumber these to be in order from 1 on...&lt;br /&gt;If they are not in exact sequential order, they will not load on the start page. This is not documented on the Microsoft KB article (http://support.microsoft.com/kb/919486)&lt;br /&gt;&lt;br /&gt;peace&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413638223026049990-787876163351083888?l=bobp1339.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bobp1339.blogspot.com/feeds/787876163351083888/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413638223026049990&amp;postID=787876163351083888' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/787876163351083888'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/787876163351083888'/><link rel='alternate' type='text/html' href='http://bobp1339.blogspot.com/2008/05/removing-recent-projects-in-net.html' title='Removing Recent Projects in .NET'/><author><name>Bob Pearson</name><uri>http://www.blogger.com/profile/16528166535649336177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413638223026049990.post-4888484434774915912</id><published>2008-03-31T20:28:00.004-04:00</published><updated>2008-03-31T20:44:08.626-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='future'/><category scheme='http://www.blogger.com/atom/ns#' term='interesting'/><title type='text'>View of 1999...From the 1960's</title><content type='html'>Here is another interesting view of the future from the mid 60's... again, they seem to have gotten the concepts correct, but not the implementation...&lt;br /&gt;&lt;br /&gt;And they also didn't see the social norms changing. The wife does the shopping while the husband grimaces and pays for it!&lt;br /&gt;&lt;br /&gt;&lt;embed width="430" height="389" type="application/x-shockwave-flash" wmode="transparent" src="http://i166.photobucket.com/flash/player.swf?file=http://vid166.photobucket.com/albums/u90/snopesbinary/Techno/year1999.flv"&gt;&lt;/embed&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-size:78%;"&gt;From:&lt;br /&gt;&lt;/span&gt;&lt;a href="http://www.snopes.com/photos/technology/year1999.asp" target="_blank"&gt;&lt;span style="font-size:78%;"&gt;View of 1999 from the '60s&lt;/span&gt;&lt;/a&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;peace&lt;br /&gt;&lt;br /&gt;BobP&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413638223026049990-4888484434774915912?l=bobp1339.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bobp1339.blogspot.com/feeds/4888484434774915912/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413638223026049990&amp;postID=4888484434774915912' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/4888484434774915912'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/4888484434774915912'/><link rel='alternate' type='text/html' href='http://bobp1339.blogspot.com/2008/03/view-of-1999from-1960s.html' title='View of 1999...From the 1960&apos;s'/><author><name>Bob Pearson</name><uri>http://www.blogger.com/profile/16528166535649336177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413638223026049990.post-2666915129236775072</id><published>2008-03-31T13:48:00.003-04:00</published><updated>2008-03-31T13:57:35.006-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='ssis'/><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><category scheme='http://www.blogger.com/atom/ns#' term='ssrs'/><category scheme='http://www.blogger.com/atom/ns#' term='error'/><category scheme='http://www.blogger.com/atom/ns#' term='bug'/><category scheme='http://www.blogger.com/atom/ns#' term='connect'/><category scheme='http://www.blogger.com/atom/ns#' term='2008'/><title type='text'>New Small SSIS Features in 2008</title><content type='html'>I have posted on Microsoft connect to request new features and have met with about a 75% success rate.&lt;br /&gt;&lt;br /&gt;Among my requests: &lt;BR&gt;&lt;br /&gt;&lt;a href="http://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=285154" Target="_blank"&gt;Hide a column in a matrix&lt;/a&gt;&lt;BR&gt;&lt;br /&gt;&lt;a href="http://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=289362" target="_blanl"&gt;Problems with autohide tool boxes&lt;/a&gt;&lt;/br&gt;&lt;br /&gt;&lt;br /&gt;Here is a good write up on 2 new features for SSIS that Jamie Thomson requested via Connect and they will be in SSIS 2008:&lt;BR&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.conchango.com/jamiethomson/archive/2008/03/20/ssis-some-new-small-features-for-katmai.aspx" target="_blank"&gt;http://blogs.conchango.com/jamiethomson/archive/2008/03/20/ssis-some-new-small-features-for-katmai.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;peace&lt;br /&gt;&lt;br /&gt;BobP&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413638223026049990-2666915129236775072?l=bobp1339.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bobp1339.blogspot.com/feeds/2666915129236775072/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413638223026049990&amp;postID=2666915129236775072' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/2666915129236775072'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/2666915129236775072'/><link rel='alternate' type='text/html' href='http://bobp1339.blogspot.com/2008/03/new-small-ssis-features-in-2008.html' title='New Small SSIS Features in 2008'/><author><name>Bob Pearson</name><uri>http://www.blogger.com/profile/16528166535649336177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413638223026049990.post-8451288470863691469</id><published>2008-03-27T11:44:00.004-04:00</published><updated>2008-03-31T20:27:57.199-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='future'/><category scheme='http://www.blogger.com/atom/ns#' term='interesting'/><title type='text'>A view of 2008... from 1968</title><content type='html'>This is an interesting article from "Modern Mechanix" magazine from 1968.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blog.modernmechanix.com/2008/03/24/what-will-life-be-like-in-the-year-2008/?Qwd=./MechanixIllustrated/11-1968/forty_years_future&amp;Qif=forty_years_future_6.jpg&amp;Qiv=thumbs&amp;Qis=XL#qdig" target = "_Blank"&gt;Click here for article&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I find it very interesting that missing one small piece of information skews the entire article.  For example, he talks about "Not every family has its private computer. Many families reserve time on a city or regional computer to serve their needs." and "TV-telephone shopping is common." He did not see a computer in every home that is connected to every other computer via the internet. &lt;br /&gt;&lt;br /&gt;But apart from that, it is a good article, and many of the concepts are a reality today, although not in the same form as he anticipated.&lt;br /&gt;&lt;br /&gt;peace&lt;br /&gt;&lt;br /&gt;Bob&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413638223026049990-8451288470863691469?l=bobp1339.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bobp1339.blogspot.com/feeds/8451288470863691469/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413638223026049990&amp;postID=8451288470863691469' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/8451288470863691469'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/8451288470863691469'/><link rel='alternate' type='text/html' href='http://bobp1339.blogspot.com/2008/03/view-of-2008-from-1968.html' title='A view of 2008... from 1968'/><author><name>Bob Pearson</name><uri>http://www.blogger.com/profile/16528166535649336177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413638223026049990.post-7393433296925662675</id><published>2008-01-11T14:37:00.000-05:00</published><updated>2008-01-11T14:48:29.178-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='deploy'/><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='data source'/><category scheme='http://www.blogger.com/atom/ns#' term='reportingservice2005'/><category scheme='http://www.blogger.com/atom/ns#' term='ssrs'/><category scheme='http://www.blogger.com/atom/ns#' term='web service'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><category scheme='http://www.blogger.com/atom/ns#' term='utility'/><category scheme='http://www.blogger.com/atom/ns#' term='report'/><title type='text'>ReportingService2005 Web Service</title><content type='html'>Well, I know it’s been a while, but I am finally back after the holidays!  &lt;br /&gt;&lt;br /&gt;The next phase of our reporting project is about to take off, and I had a little down time while waiting on requirements.&lt;br /&gt;&lt;br /&gt;So, using the ReportingService2005 web service, I created a report deployment application in C#.&lt;br /&gt;&lt;br /&gt;It allows me to select the directory of my RDL/RDS files, and then select my report server and any folder on that server.&lt;br /&gt;&lt;br /&gt;Then it deploys the selected reports to the report server with the one button click.&lt;br /&gt;&lt;br /&gt;I can then change the report server, and deploy the same reports to that server.  This is helpful if you have multiple systems that should stay in sync.  Using dynamic web service connections allows me to change the target server within code. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Working with the web service was rather straightforward, and allowed me to do everything I needed to do as far as deploying reports and data sources.&lt;br /&gt;However, what I wanted to write about was a catch that had me stumped for a few minutes.&lt;br /&gt;&lt;br /&gt;When you use the CreateReport method of the web service, the data sources are not linked to the server data sources.  So what I did was use the GetItemDataSources method to get the report data sources, built a new data source in code, representing the server data source, and then used the SetItemDataSources method to update the report data sources.&lt;blockquote&gt;DataSource[] dataSources = rs.GetItemDataSources(TargetFolder + "/" + ReportName);&lt;br /&gt;&lt;br /&gt;   foreach (DataSource ds in dataSources)&lt;br /&gt;   {&lt;br /&gt;    if (ds.Item.GetType() == typeof(InvalidDataSourceReference))&lt;br /&gt;    {&lt;br /&gt;     string dsName = ds.Name.ToString();&lt;br /&gt;&lt;br /&gt;     DataSource serverDS = new DataSource();&lt;br /&gt;     DataSourceReference serverDSRef = new DataSourceReference();&lt;br /&gt;     serverDSRef.Reference = "/Data Sources/" + dsName;&lt;br /&gt;     serverDS.Item = serverDSRef;&lt;br /&gt;     serverDS.Name = dsName;&lt;br /&gt;     DataSource[] serverDataSources = new DataSource[] { serverDS };&lt;br /&gt;     rs.SetItemDataSources(TargetFolder + "/" + ReportName, serverDataSources);&lt;br /&gt;    }&lt;br /&gt;   }&lt;/blockquote&gt;&lt;br /&gt;This nicely updated the report data sources to use the server shared data sources.&lt;br /&gt;&lt;br /&gt;All in all, the 1½ days I spent writing this app were well worth it.  I learned about the deployment methods of the web service, and kept my coding skills up, plus I have a nice deployment utility for reports!&lt;br /&gt;&lt;br /&gt;peace&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413638223026049990-7393433296925662675?l=bobp1339.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bobp1339.blogspot.com/feeds/7393433296925662675/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413638223026049990&amp;postID=7393433296925662675' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/7393433296925662675'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/7393433296925662675'/><link rel='alternate' type='text/html' href='http://bobp1339.blogspot.com/2008/01/reportingservice2005-web-service.html' title='ReportingService2005 Web Service'/><author><name>Bob Pearson</name><uri>http://www.blogger.com/profile/16528166535649336177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413638223026049990.post-6874319593788999089</id><published>2007-12-21T16:23:00.000-05:00</published><updated>2008-01-08T07:48:58.609-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='ssis'/><category scheme='http://www.blogger.com/atom/ns#' term='expression'/><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><category scheme='http://www.blogger.com/atom/ns#' term='derived column'/><category scheme='http://www.blogger.com/atom/ns#' term='IF'/><category scheme='http://www.blogger.com/atom/ns#' term='how to'/><category scheme='http://www.blogger.com/atom/ns#' term='BI'/><category scheme='http://www.blogger.com/atom/ns#' term='IIF'/><title type='text'>SSIS Derived Column IIF/IF Expression</title><content type='html'>This is for my memory, but I figure if I have a hard time remembering, maybe someone else will...&lt;br /&gt;&lt;br /&gt;For those of you who are trying to remember how to do IF/IIF functionality in the SSIS Derived Column control:&lt;blockquote&gt;({comparison} ? {truepart} : {falsepart})&lt;/blockquote&gt;So, if I want to evaluate the similarity from a fuzzy lookup, it would look like this:&lt;blockquote&gt;(_Similarity &gt; .78 ? ID : "")&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Maybe someday Microsoft will standardize all of the expression languages in their BI tools!  &lt;br /&gt;&lt;br /&gt;peace&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413638223026049990-6874319593788999089?l=bobp1339.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bobp1339.blogspot.com/feeds/6874319593788999089/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413638223026049990&amp;postID=6874319593788999089' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/6874319593788999089'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/6874319593788999089'/><link rel='alternate' type='text/html' href='http://bobp1339.blogspot.com/2007/12/ssis-derived-column-iifif-expression.html' title='SSIS Derived Column IIF/IF Expression'/><author><name>Bob Pearson</name><uri>http://www.blogger.com/profile/16528166535649336177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413638223026049990.post-2214011871728099160</id><published>2007-12-18T13:23:00.000-05:00</published><updated>2008-01-08T07:48:58.613-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='missing'/><category scheme='http://www.blogger.com/atom/ns#' term='prompts'/><category scheme='http://www.blogger.com/atom/ns#' term='ssrs'/><category scheme='http://www.blogger.com/atom/ns#' term='bug'/><category scheme='http://www.blogger.com/atom/ns#' term='error'/><category scheme='http://www.blogger.com/atom/ns#' term='report'/><category scheme='http://www.blogger.com/atom/ns#' term='shortcoming'/><category scheme='http://www.blogger.com/atom/ns#' term='default'/><category scheme='http://www.blogger.com/atom/ns#' term='disappear'/><category scheme='http://www.blogger.com/atom/ns#' term='multivalue'/><category scheme='http://www.blogger.com/atom/ns#' term='workaround'/><category scheme='http://www.blogger.com/atom/ns#' term='BI'/><category scheme='http://www.blogger.com/atom/ns#' term='parameter'/><title type='text'>Disappearing Parameter Defaults</title><content type='html'>I ran into an interesting problem today with default parameter values. &lt;br /&gt;I had a report with 6 parameters. One of them, it happened to be &lt;a href= http://bobp1339.blogspot.com/2007/10/multi-language-reports.html&gt;Language&lt;/a&gt;, had a default value of 1 in the parameter window.  The rest had values from datasets. Once deployed, if you chose a data driven parameter, the language default would disappear and ask you to select a value.  This was very inconvenient, as it was a hidden parameter in this report.&lt;br /&gt;&lt;br /&gt;After googling and looking in the forums, I realized this is an ongoing issue in SSRS. So I had to come up with a workaround. &lt;br /&gt;&lt;br /&gt;I played around with it for a while, and figured out a way to make it work.  I created a dataset called DefaultLanguage, with the SQL: &lt;blockquote&gt;Select 1 as ID&lt;/blockquote&gt;  I then set the default for the language parameter to that dataset. &lt;br /&gt;&lt;br /&gt;Now when any other parameter is changed, the default language stays selected! &lt;br /&gt;&lt;br /&gt;peace&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413638223026049990-2214011871728099160?l=bobp1339.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bobp1339.blogspot.com/feeds/2214011871728099160/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413638223026049990&amp;postID=2214011871728099160' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/2214011871728099160'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/2214011871728099160'/><link rel='alternate' type='text/html' href='http://bobp1339.blogspot.com/2007/12/disappearing-parameter-defaults.html' title='Disappearing Parameter Defaults'/><author><name>Bob Pearson</name><uri>http://www.blogger.com/profile/16528166535649336177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413638223026049990.post-861017502877160056</id><published>2007-12-11T11:11:00.000-05:00</published><updated>2008-01-08T07:48:58.626-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='multiple'/><category scheme='http://www.blogger.com/atom/ns#' term='prompts'/><category scheme='http://www.blogger.com/atom/ns#' term='expression'/><category scheme='http://www.blogger.com/atom/ns#' term='ssrs'/><category scheme='http://www.blogger.com/atom/ns#' term='multilanguage'/><category scheme='http://www.blogger.com/atom/ns#' term='parameter'/><category scheme='http://www.blogger.com/atom/ns#' term='BI'/><category scheme='http://www.blogger.com/atom/ns#' term='report'/><category scheme='http://www.blogger.com/atom/ns#' term='language'/><category scheme='http://www.blogger.com/atom/ns#' term='2008'/><title type='text'>Parameter Prompts Go Prime Time</title><content type='html'>I just was reading Teo Lachev's blog and saw this entry: &lt;a href="http://prologika.com/CS/blogs/blog/archive/2007/10/18/parameterized-parameter-prompts.aspx"&gt;Parameterized Parameter Prompts.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;SQL 2008 will allow expressions on the parameter prompts!!!  This means that in my article &lt;a href="http://bobp1339.blogspot.com/2007/10/multi-language-reports.html"&gt;Multi Language Reports&lt;/a&gt;, you will be able to update the prompts to different languages. :-D&lt;br /&gt;&lt;br /&gt;Check out Teo's other blogs too... He has been working with the new features in SQL2008, something that I hope to be able to get around to soon.&lt;br /&gt;&lt;br /&gt;peace&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413638223026049990-861017502877160056?l=bobp1339.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bobp1339.blogspot.com/feeds/861017502877160056/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413638223026049990&amp;postID=861017502877160056' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/861017502877160056'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/861017502877160056'/><link rel='alternate' type='text/html' href='http://bobp1339.blogspot.com/2007/12/parameter-prompts-go-prime-time.html' title='Parameter Prompts Go Prime Time'/><author><name>Bob Pearson</name><uri>http://www.blogger.com/profile/16528166535649336177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413638223026049990.post-4637083355686248090</id><published>2007-12-05T08:33:00.000-05:00</published><updated>2008-01-08T07:48:58.629-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tricks'/><category scheme='http://www.blogger.com/atom/ns#' term='new window'/><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='pop up'/><category scheme='http://www.blogger.com/atom/ns#' term='_blank'/><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><category scheme='http://www.blogger.com/atom/ns#' term='ssrs'/><category scheme='http://www.blogger.com/atom/ns#' term='message box'/><category scheme='http://www.blogger.com/atom/ns#' term='BI'/><category scheme='http://www.blogger.com/atom/ns#' term='report'/><category scheme='http://www.blogger.com/atom/ns#' term='alert'/><title type='text'>Javascript in Jump To URL</title><content type='html'>You know that if you right click on a textbox, select Properties, and then click on the Navigation tab, you can put an URL into the Jump to URL textbox, and when the user clicks on the data in that textbox it will jump to that URL in the same window as the report. But did you know that you can use javascript in there as well?&lt;br /&gt;&lt;br /&gt;This allows you to open the link in a new browser window or display a pop up a message box.&lt;br /&gt;&lt;br /&gt;I will sometimes use pop up message boxes on the column headers to define what the data definition is. This is the syntax:&lt;br /&gt;&lt;blockquote&gt;="javascript:void alert('This is a test column header alert')"&lt;/blockquote&gt;&lt;br /&gt;To open the link in a new window, use syntax similar to this:&lt;br /&gt;&lt;blockquote&gt;="javascript:void window.open('http://servername/reportserver/pages/reportviewer.aspx?%2freportfolder%2fReport+Name&amp;amp;Parameter1=" &amp;amp; Fields!Field1.Value &amp;amp; "&amp;amp;Field2=" &amp;amp; Fields!Field2.Value &amp;amp; "&amp;amp;rs:Command=Render','_blank','resizeable=1,toolbar=0,status=0,menu=0,top=20,left=20,width=740,height=730')"&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;peace&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413638223026049990-4637083355686248090?l=bobp1339.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bobp1339.blogspot.com/feeds/4637083355686248090/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413638223026049990&amp;postID=4637083355686248090' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/4637083355686248090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/4637083355686248090'/><link rel='alternate' type='text/html' href='http://bobp1339.blogspot.com/2007/12/javascript-in-jump-to-url.html' title='Javascript in Jump To URL'/><author><name>Bob Pearson</name><uri>http://www.blogger.com/profile/16528166535649336177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413638223026049990.post-101452062434418477</id><published>2007-11-28T07:44:00.000-05:00</published><updated>2008-01-08T07:48:58.631-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mario theme music bass'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='BI'/><title type='text'>And now, for something completely different...</title><content type='html'>Came across this today and was totally blown away... &lt;br /&gt;&lt;br /&gt;Enjoy!&lt;br /&gt;&lt;br /&gt;&lt;a href=http://www.youtube.com/watch?v=yf56jYDv2fc target=_blank&gt;http://www.youtube.com/watch?v=yf56jYDv2fc&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;peace&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413638223026049990-101452062434418477?l=bobp1339.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bobp1339.blogspot.com/feeds/101452062434418477/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413638223026049990&amp;postID=101452062434418477' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/101452062434418477'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/101452062434418477'/><link rel='alternate' type='text/html' href='http://bobp1339.blogspot.com/2007/11/and-now-for-something-completely.html' title='And now, for something completely different...'/><author><name>Bob Pearson</name><uri>http://www.blogger.com/profile/16528166535649336177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413638223026049990.post-8593787124035715365</id><published>2007-11-27T09:20:00.000-05:00</published><updated>2008-01-08T07:48:58.638-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='multiple'/><category scheme='http://www.blogger.com/atom/ns#' term='value'/><category scheme='http://www.blogger.com/atom/ns#' term='filter'/><category scheme='http://www.blogger.com/atom/ns#' term='ssrs'/><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><category scheme='http://www.blogger.com/atom/ns#' term='list'/><category scheme='http://www.blogger.com/atom/ns#' term='report'/><category scheme='http://www.blogger.com/atom/ns#' term='multivalue'/><category scheme='http://www.blogger.com/atom/ns#' term='how to'/><category scheme='http://www.blogger.com/atom/ns#' term='BI'/><category scheme='http://www.blogger.com/atom/ns#' term='parameter'/><category scheme='http://www.blogger.com/atom/ns#' term='multi'/><title type='text'>More About Multi-Value Parameters</title><content type='html'>Just for fun, I am going to talk about multi value parameters again. In this blog, &lt;a href="http://bobp1339.blogspot.com/2007/10/2-shortcomings-of-multi-valued.html"&gt;Shortcomings of Multi-Value Parameters&lt;/a&gt;, I discuss two of the shortcomings. Now I am going to talk about how to use them in detail.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Overview&lt;br /&gt;&lt;/strong&gt;Many times you will need to have a parameter that allows the user to select more than one value. In this instance, when you are creating the parameter, check on the Multi-value check box in the Report Parameters window.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Available Values… Or Not!&lt;br /&gt;&lt;/strong&gt;If you have a set list of items that you want the user to be able to select from, you can establish this list in the Available Values section of the Report Parameters window. You can either use a dataset, or type in static values.&lt;br /&gt;&lt;br /&gt;To use a dataset to populate the available value, create the dataset in the data tab, making sure that you assign field names. Then in the Report Parameters window, click on your parameter, click on the From Query radio button in the available values section. Then select your dataset name, value column and label column. The value is what will be returned when referencing @Parameter in your SQL query, and the label is what will be shown in the drop down parameter. You can access both of these values in expressions: &lt;blockquote&gt;Parameters!Parm1.Value or Parameters!Parm1.Label&lt;/blockquote&gt;You can have a multi-value parameter with or without available values. For example, you may have a parameter for Color, with the available values being red, green and blue. In this case, when you preview the report, you will have a drop down check list, with Select All, Red, Green and Blue listed. Users can click on one or more checkboxes, and select the colors they want to filter on. (If you have SP1, you will not get the Select All check box. The fix for this is SP2.)&lt;br /&gt;&lt;br /&gt;If your multi-value parameter does not have any available values assigned to it when it is set up, your users are presented with a drop down multi line text box. The users can enter values, separated by a carriage return, and SSRS automatically formats it for an IN clause in SQL. The great thing about this: Users can copy a column of data from Excel and paste into the textbox! I had a client that worked with loans. They always needed information based on a list of loan numbers that someone had in an Excel spreadsheet. I developed a report that have a multi value parameter, they would copy the loan number column out of the spreadsheet, paste it into the parameter, run the report, export to Excel. It saved them from having to copy, look up, format, etc.&lt;br /&gt;&lt;br /&gt;When using a Multi-value parameter, you cannot have a null value returned. This means that the user will have to select or enter at least 1 value from the parameter list. When setting up the parameter, you will get an error if you try to select the Allow null value check box. If there are no available values, the user must enter at least 1 value into the textbox.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Using in SQL&lt;/strong&gt;&lt;br /&gt;If you are going to be passing a multi-value parameter to a stored procedure, you will have to pass it as 1 string, and parse it in the stored procedure. See the blog referenced above for more information about this.&lt;br /&gt;&lt;br /&gt;However, to use your multi-value parameter in a dataset SQL statement, just use the IN clause: &lt;blockquote&gt;Where ItemID in (@Item) &lt;/blockquote&gt;SSRS will automatically add the commas and format it for you.&lt;br /&gt;&lt;br /&gt;There is no way for you to tell if all of the values have been selected, or if the Select All was clicked on. This is an issue if you have a lot of values because the IN clause is worthless, but SQL still executes it, cost precious time and resources. If you expect to have a long list of values, or if you think that all of them will be selected most of the time, there is a workaround documented in the blog referenced at the top of this article.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Using in Expressions&lt;br /&gt;&lt;/strong&gt;To determine how many values have been selected or entered, use the Count property: &lt;blockquote&gt;=Parameters!Parm1.Count&lt;/blockquote&gt;To reference a value directly, use: &lt;blockquote&gt;=Parameters!Parm1.Value(arrayindex) &lt;/blockquote&gt;where the array index is less than the count.&lt;br /&gt;If you want to display the list of values selected/entered, use the Join function: &lt;blockquote&gt;=Join(Parameters!Parm1.Label, “, “)&lt;/blockquote&gt;&lt;br /&gt;The second argument is the delimiter; what character string is displayed between each parameter entry. You could also reference the parameter value.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Using in Code&lt;/strong&gt;&lt;br /&gt;You can reference multi-value parameters in embedded code as well. See my article about &lt;a href="http://bobp1339.blogspot.com/2007/10/multi-language-reports.html"&gt;multi language report labels&lt;/a&gt; for a look at how that is used.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Passing in URL&lt;/strong&gt;&lt;br /&gt;To pass the multi-value parameter values in an URL to report manager, repeat the parameter name.  For example: &lt;blockquote&gt;http://server/reportserver?/dir/Report&amp;rs:Command=Render&amp;Parm1=VALUE1&amp;Parm1=VALUE2&amp;Parm1=VALUE3&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;That’s all for now. I think this gives a lot of information. Hope it helps!&lt;br /&gt;&lt;br /&gt;peace&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413638223026049990-8593787124035715365?l=bobp1339.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bobp1339.blogspot.com/feeds/8593787124035715365/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413638223026049990&amp;postID=8593787124035715365' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/8593787124035715365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/8593787124035715365'/><link rel='alternate' type='text/html' href='http://bobp1339.blogspot.com/2007/11/more-about-multi-value-parameters.html' title='More About Multi-Value Parameters'/><author><name>Bob Pearson</name><uri>http://www.blogger.com/profile/16528166535649336177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413638223026049990.post-59539187399456050</id><published>2007-11-21T12:34:00.000-05:00</published><updated>2008-01-08T07:48:58.644-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dynamic'/><category scheme='http://www.blogger.com/atom/ns#' term='tricks'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='click thru'/><category scheme='http://www.blogger.com/atom/ns#' term='drill thru'/><category scheme='http://www.blogger.com/atom/ns#' term='ssrs'/><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><category scheme='http://www.blogger.com/atom/ns#' term='report'/><category scheme='http://www.blogger.com/atom/ns#' term='drill through'/><category scheme='http://www.blogger.com/atom/ns#' term='image'/><category scheme='http://www.blogger.com/atom/ns#' term='jpg'/><category scheme='http://www.blogger.com/atom/ns#' term='how to'/><category scheme='http://www.blogger.com/atom/ns#' term='BI'/><title type='text'>Dynamic Images in Reports (Slight Return)</title><content type='html'>Since dynamic images in reports are by far the most read topic of my blog, I am going to add some more information about them.&lt;br /&gt;&lt;br /&gt;The last post that I did about dynamic images concentrated on adding logos to the header, etc. This time I am going to talk more about adding images in the report body. Some of this may be redundant, but it may also give you some ideas for future reports.&lt;br /&gt;&lt;br /&gt;I am going to discuss adding an image preview/click thru example.&lt;br /&gt;&lt;br /&gt;Since you can read the URL from the database in the main dataset, you can put an image in every row of a table. On that control, you can set the sizing property to fit or fit proportional, and get a thumbnail image. You can then add a Jump to URL expression to have the user be able to click on the thumbnail and display the full size in a new browser window.&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;="javascript:void window.open('" &amp;amp; Fields!ImageURL.Value &amp;amp; "','_blank','resizeable=1,toolbar=0,status=0,menu=0,top=20,left=20,width=740,height=730')"&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Right click on the image control and select Properties. Then click on the Navigation tab and click on the Jump to URL radio button. Paste the above code into the expression text box. You can change the size, or leave out the width and height properties.&lt;br /&gt;&lt;br /&gt;This works great if the images are stored on a web server. (In my humble opinion, images should not be stored in the database, but that is a discussion for a different day. Feel free to comment on this!) But what if the images are stored in the database?&lt;br /&gt;&lt;br /&gt;Well, you would have to create another report, adding a lone image control, and maybe a caption text box. Add a parameter so that you can pass an image ID from the first report to this report.&lt;br /&gt;Create the dataset, using the parameter as a filter, to select the Image field from the database.&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Select ImageField, Caption from Images Where ImageID = @ImageID&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;When you add the image control to the report, select the dataset and field name, and put in the mime type. Put the caption field in the caption text box.&lt;br /&gt;&lt;br /&gt;Back in the original report, right click on the image control and select Properties. Click on the Navigation tab and select Jump To Report. Select the new report that you created. Click on the parameters button and assign the Image ID parameter with the image ID read from the database in the dataset.&lt;br /&gt;&lt;br /&gt;The only drawback with doing it this way is that it does not open in a new window.&lt;br /&gt;&lt;br /&gt;To open a report in a new window, use the Jump to URL select again, and then put this in the expression box:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;="javascript:void window.open('http://servername/reportserver/pages/reportviewer.aspx?%2fImageView&amp;amp;ImageID=" &amp;amp; Fields!ImageID.Value &amp;amp; "&amp;amp;rs:Command=Render','_blank','resizeable=1,toolbar=0,status=0,menu=0,top=20,left=20,width=740,height=730')"&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Now it will open the image report in a new browser window.&lt;br /&gt;&lt;br /&gt;If you would like more information on dynamic images, or if I can explain something a little clearer, post a comment or drop me an email.&lt;br /&gt;&lt;br /&gt;peace&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413638223026049990-59539187399456050?l=bobp1339.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bobp1339.blogspot.com/feeds/59539187399456050/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413638223026049990&amp;postID=59539187399456050' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/59539187399456050'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/59539187399456050'/><link rel='alternate' type='text/html' href='http://bobp1339.blogspot.com/2007/11/dynamic-images-in-reports-slight-return.html' title='Dynamic Images in Reports (Slight Return)'/><author><name>Bob Pearson</name><uri>http://www.blogger.com/profile/16528166535649336177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413638223026049990.post-4064852036185764031</id><published>2007-11-16T15:46:00.000-05:00</published><updated>2008-01-08T07:48:58.652-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='data'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='filter'/><category scheme='http://www.blogger.com/atom/ns#' term='row'/><category scheme='http://www.blogger.com/atom/ns#' term='ssrs'/><category scheme='http://www.blogger.com/atom/ns#' term='how to'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><category scheme='http://www.blogger.com/atom/ns#' term='BI'/><category scheme='http://www.blogger.com/atom/ns#' term='report'/><title type='text'>Data based, Row Level Security in Reporting</title><content type='html'>&lt;strong&gt;Overview&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Last month I promised an article on data based security. Well, after I ignored it for a month, someone asked for it. So here is what I am currently implementing in a project for a client.&lt;br /&gt;&lt;br /&gt;I import several transactional systems into a data mart of my own design. It is a star schema, and utilizes 4 fact tables and about 20 dimensions. One of the dimensions handles the primary focus of our reports. Let’s call it Orders. Each individual order is assigned an OrderKey that ties all of the fact tables together.&lt;br /&gt;&lt;br /&gt;To implement security, I assign OrderKeys to report user groups. The assignment is based on rules setup thru a front end .NET web application, and can be used to filter orders to users based on any field in the data mart. Then the report SQL checks to make sure that every order is in that security table for the user pulling the report.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;The Details&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;I have setup a data dictionary containing all of the metadata that I need to build a query for the fields. The admin application displays the fields to the admin user, and the admin user selects a field, an operator (=, &lt;, &gt;, &lt;&gt;, Like, etc) and then enters a value.&lt;br /&gt;&lt;br /&gt;So for instance, the admin user would select the CostCenter field, select the = operator, and then type in 1234. Stored in the database is the line: CostCenter = 1234.&lt;br /&gt;&lt;br /&gt;Once the admin user is done, they select a menu item to “build” the rules. Using the data dictionary, the application builds SQL statements to filter the OrderKeys. The statements look like this:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Insert into Security&lt;br /&gt;Select Distinct a1.*&lt;br /&gt;From&lt;br /&gt;(Select 1 as ProfileID, f.OrderKey as KeyVal&lt;br /&gt;From factOrderLine f (NOLOCK)&lt;br /&gt;inner join dimProduct d (NOLOCK)&lt;br /&gt;on f.ProductKey = d.ProductKey&lt;br /&gt;&lt;br /&gt;Where d.ProductID &lt;&gt; '555666') a1&lt;br /&gt;Inner Join&lt;br /&gt;(Select 1 as ProfileID, f.OrderKey as KeyVal&lt;br /&gt;From factOrderLine f (NOLOCK)&lt;br /&gt;inner join dimMFG d (NOLOCK)&lt;br /&gt;on f.MFGKey = d.MFGKey&lt;br /&gt;&lt;br /&gt;Where d.MFGID = 'PG') a2&lt;br /&gt;On a1.KeyVal = a2.KeyVal&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Because I am doing inner joins, this acts as an AND clause. So in the above query, I would get all orders that have a product ID not equal to 555666 and everything where the manufacturer ID is PG.&lt;br /&gt;&lt;br /&gt;The resultant list is a profile ID, and then order key itself.&lt;br /&gt;&lt;br /&gt;I put this into the Security table.&lt;br /&gt;&lt;br /&gt;When I code the SQL in the report, I add an EXISTS statement to the WHERE clause:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;and OrderKey in (Select OrderKey from Security where ProfileID = @ProfileID)&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;The @ProfileID parameter is being passed in by the app calling the reports. It is set when the user logs into the web front end.&lt;br /&gt;&lt;br /&gt;That in a nutshell is how I do data based row level security.&lt;br /&gt;&lt;br /&gt;This is a huge topic, and I have only scratched the surface in this blog. As I work on it some more, and add new features, I will blog them as well.&lt;br /&gt;&lt;br /&gt;In the meantime, if you have any questions or suggestions, please email me!&lt;br /&gt;&lt;br /&gt;peace&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413638223026049990-4064852036185764031?l=bobp1339.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bobp1339.blogspot.com/feeds/4064852036185764031/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413638223026049990&amp;postID=4064852036185764031' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/4064852036185764031'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/4064852036185764031'/><link rel='alternate' type='text/html' href='http://bobp1339.blogspot.com/2007/11/data-based-row-level-security-in.html' title='Data based, Row Level Security in Reporting'/><author><name>Bob Pearson</name><uri>http://www.blogger.com/profile/16528166535649336177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413638223026049990.post-1370546054064907724</id><published>2007-11-15T11:09:00.000-05:00</published><updated>2008-01-08T07:48:58.655-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='layout'/><category scheme='http://www.blogger.com/atom/ns#' term='lessons'/><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><category scheme='http://www.blogger.com/atom/ns#' term='ssrs'/><category scheme='http://www.blogger.com/atom/ns#' term='section'/><category scheme='http://www.blogger.com/atom/ns#' term='header'/><category scheme='http://www.blogger.com/atom/ns#' term='list'/><category scheme='http://www.blogger.com/atom/ns#' term='report'/><category scheme='http://www.blogger.com/atom/ns#' term='footer'/><category scheme='http://www.blogger.com/atom/ns#' term='format'/><category scheme='http://www.blogger.com/atom/ns#' term='detail'/><category scheme='http://www.blogger.com/atom/ns#' term='BI'/><category scheme='http://www.blogger.com/atom/ns#' term='table'/><title type='text'>Report Layout Basics</title><content type='html'>I thought I would go over some of the basics of report layouts since I have seen a few forum posts about basic layouts. This is by no means a comprehensive overview, but a starting place.&lt;br /&gt;&lt;br /&gt;The first thing to realize about the report layout is that the only sections you have to work with are the page header, page footer and the report body. There is no concept of a report header/footer, etc. But also, unlike Crystal Reports, the report sections are NOT tied to data.&lt;br /&gt;&lt;br /&gt;Instead, the report body holds the controls that can act as report sections. Here are some ideas:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Report Header&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;If you need a report header, you can place any control, like a text box, on the body of the report, and populate it with data, static text, etc. If you place these controls inside a rectangle, you can set the PageBreakAtEnd property to true, and then those text boxes will appear on a page by themselves.  If you dont use a rectangle in this manner, your report header will be on the same page as the start of your data area.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Report Footer&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;As with the report header, if you place controls at the bottom of the body section, in a rectangle, and set the PageBreakAtStart to true, you will have these on the last page of the report.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Multiple Body Sections&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;You can have multiple body sections just by adding multiple controls to the body section of the report. Say that you have 2 datasets in your report and you want to show them in separate sections of the report. Add a table for the first dataset. Set the PageBreakAtEnd property to true.&lt;br /&gt;Then add another table below that for the second dataset. When you render the report, you will have the first table displayed, a page break, and then the second table. Add the report header and footer from above, and you now have a 4 section report!&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Using the List Control&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;The list control is used to repeat a set of controls within it. You can place a list control on your report, set the dataset and the grouping on the list. Then place some text boxes in the list control and populate them with the fields from the dataset. The list will group the data as you set up, and populate the text boxes, repeating for every group.&lt;br /&gt;&lt;br /&gt;You can also put multiple tables in the list control. I will do this often when there is a lot of detail data to display, and I do not want to have to worry about the column layouts.&lt;br /&gt;&lt;br /&gt;Well, that was some basic layout ideas. I will add more soon&lt;br /&gt;&lt;br /&gt;peace&lt;br /&gt;&lt;br /&gt;BobP&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413638223026049990-1370546054064907724?l=bobp1339.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bobp1339.blogspot.com/feeds/1370546054064907724/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413638223026049990&amp;postID=1370546054064907724' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/1370546054064907724'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/1370546054064907724'/><link rel='alternate' type='text/html' href='http://bobp1339.blogspot.com/2007/11/report-layout-basics.html' title='Report Layout Basics'/><author><name>Bob Pearson</name><uri>http://www.blogger.com/profile/16528166535649336177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413638223026049990.post-1237034414034756888</id><published>2007-11-07T08:57:00.000-05:00</published><updated>2008-01-08T07:48:58.658-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='multiple'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='lessons'/><category scheme='http://www.blogger.com/atom/ns#' term='ssrs'/><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><category scheme='http://www.blogger.com/atom/ns#' term='web service'/><category scheme='http://www.blogger.com/atom/ns#' term='report'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='BI'/><category scheme='http://www.blogger.com/atom/ns#' term='parameter'/><title type='text'>Rendering SSRS 2005 Reports with the Web Service</title><content type='html'>Even though Report Manager is a decent way to deliver reports to your users, you may have the requirement to embed the report in an existing .NET application.  This is very simple using the web services provided with SSRS 2005.&lt;br /&gt;&lt;br /&gt;Here is a code sample that I use to show developers at my clients how to pull a report.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;string historyID = null;&lt;br /&gt;string deviceInfo = null;&lt;br /&gt;string format = "Excel"; //Can be XML, NULL, CSV, IMAGE, PDF, HTML4.0, HTML3.2, MHTML, EXCEL, and HTMLOWC&lt;br /&gt;Byte[] results;&lt;br /&gt;string encoding = String.Empty;&lt;br /&gt;string mimeType = String.Empty;&lt;br /&gt;string extension = String.Empty;&lt;br /&gt;ReportingExec.Warning[] warnings = null;&lt;br /&gt;string[] streamIDs = null;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;ReportExecutionService re = new ReportExecutionService();&lt;br /&gt;re.Credentials = System.Net.CredentialCache.DefaultCredentials;&lt;br /&gt;&lt;br /&gt;ExecutionInfo ei = re.LoadReport("/directory/ReportName”, historyID);&lt;br /&gt;&lt;br /&gt;ReportingExec.ParameterValue[] rptParameters = new ReportingExec.ParameterValue[1];&lt;br /&gt;    &lt;br /&gt;rptParameters[0] = new ReportingExec.ParameterValue();&lt;br /&gt;rptParameters[0].Name = "DateFormatID";&lt;br /&gt;rptParameters[0].Value = "fr-FR";&lt;br /&gt;&lt;br /&gt;re.SetExecutionParameters(rptParameters, "en-us");&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;results = re.Render(format, deviceInfo, out extension, out encoding, out mimeType, out warnings, out streamIDs);&lt;br /&gt;&lt;br /&gt;FileStream stream = File.Create("C:\\report.xls", results.Length);&lt;br /&gt;stream.Write(results, 0, results.Length);&lt;br /&gt;stream.Close();&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;You will need to set up the reference in your project.  The URL for this is:   http://servername/reportserver/ReportService2005.asmx &lt;br /&gt;&lt;br /&gt;This code, which I give to the developers in a web app, demonstrates the basic use of the web services.  It loads a report, adds a parameter value, and then renders the report and saves it to disk.  If you wanted to render it back to the user on a web page, you would add:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Response.AddHeader("content-disposition", "attachment; filename=File.xls");&lt;br /&gt;Response.OutputStream.Write(results, 0, results.Length);&lt;br /&gt;&lt;br /&gt;Response.End();&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;By taking this code a little further, you could easily send out an email with the report attached.  Or another commonly requested feature for SSRS:  emailing multiple reports on 1 email.&lt;br /&gt;&lt;br /&gt;You could loop thru a database table, reading the reports to send a user, render that report, save the file, attach it to a system.mail email, and then move to the next report. When the looping for that user is complete, send the email, delete the files, and move on to the next user in the table.&lt;br /&gt;&lt;br /&gt;I hope this helps clear up web services in SSRS 2005.  Most developers that I work with are not familiar with this web service, and this always gets them going in the right direction.  This is by far a VERY basic demonstration.  There is a lot more to the web services than just this. &lt;br /&gt;&lt;br /&gt;For more reading on the web services, visit: &lt;br /&gt; &lt;a href="http://msdn2.microsoft.com/en-us/library/ms155076.aspx"&gt;http://msdn2.microsoft.com/en-us/library/ms155076.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;peace&lt;br /&gt;&lt;br /&gt;BobP&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413638223026049990-1237034414034756888?l=bobp1339.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bobp1339.blogspot.com/feeds/1237034414034756888/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413638223026049990&amp;postID=1237034414034756888' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/1237034414034756888'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/1237034414034756888'/><link rel='alternate' type='text/html' href='http://bobp1339.blogspot.com/2007/11/rendering-ssrs-2005-reports-with-web.html' title='Rendering SSRS 2005 Reports with the Web Service'/><author><name>Bob Pearson</name><uri>http://www.blogger.com/profile/16528166535649336177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413638223026049990.post-333636383772951737</id><published>2007-11-03T11:28:00.000-04:00</published><updated>2008-01-08T07:48:58.661-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tricks'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='top'/><category scheme='http://www.blogger.com/atom/ns#' term='total'/><category scheme='http://www.blogger.com/atom/ns#' term='top n'/><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><category scheme='http://www.blogger.com/atom/ns#' term='ssrs'/><category scheme='http://www.blogger.com/atom/ns#' term='group'/><category scheme='http://www.blogger.com/atom/ns#' term='BI'/><category scheme='http://www.blogger.com/atom/ns#' term='report'/><title type='text'>Creating a Top N Report with ‘Others’</title><content type='html'>No, this is not a blog about “Lost” ;-)&lt;br /&gt;&lt;br /&gt;Often times I have been asked to create a Top N report.  This is relatively easy, as you can just add a TOP N to the SQL statement, and display the results in the detail of your SSRS table.&lt;br /&gt;&lt;br /&gt;However, once in a while I get a request for a Top N report, but include 1 line with a total of the “Others”&lt;br /&gt;&lt;br /&gt;After a lot of trial and error, some internet searching, and discussion with other SSRS folks, this is what I came up with and what I use every time now.&lt;br /&gt;&lt;br /&gt;First, in the SQL statement I rank my results, and then group that ranking into 2 groups.  The 2 groups represent Others and Non-Others.  &lt;br /&gt;&lt;br /&gt;Here is a sample SQL:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;SELECT &lt;br /&gt;Row_Number() Over (Order by Sum(TBL.Number) desc) as Rank,&lt;br /&gt;Case&lt;br /&gt;When Row_Number() Over (Order by Sum(TBL.Number) desc) &lt;= Convert(int,10) &lt;br /&gt;Then 1&lt;br /&gt;Else 2&lt;br /&gt;End as GroupNumber, &lt;br /&gt;Description,&lt;br /&gt;Number&lt;br /&gt;...&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Then I put a table in my report, and add a group with the GroupNumber field as the grouping field.&lt;br /&gt;&lt;br /&gt;I remove the group footer and put an expression on the Hidden property of the entire row:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;=iif(Fields!GroupNumber.Value = 1, true, false)&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;This hides the row if the GroupNumber = 1 (non others)&lt;br /&gt;&lt;br /&gt;I then put the string “Others” into a column, and the sum of the number field into another column.&lt;br /&gt;&lt;br /&gt;In the details row, I add an expression to the Hidden property:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;=iif(Fields!GroupNumber.Value = 1, false, true)&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;This hides the detail row if the GroupNumber = 2 (Others)&lt;br /&gt;&lt;br /&gt;I then put the description field into the column, and the number field into the other column.&lt;br /&gt;&lt;br /&gt;When you run the report, this is what you wind up seeing:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;City A                100  &lt;-- This is a detail row&lt;br /&gt;City B                 90  &lt;-- This is a detail row&lt;br /&gt;City C                 80  &lt;-- This is a detail row&lt;br /&gt;Others               230  &lt;-- This is the group header row.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;peace&lt;br /&gt;&lt;br /&gt;BobP&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413638223026049990-333636383772951737?l=bobp1339.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bobp1339.blogspot.com/feeds/333636383772951737/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413638223026049990&amp;postID=333636383772951737' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/333636383772951737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/333636383772951737'/><link rel='alternate' type='text/html' href='http://bobp1339.blogspot.com/2007/11/creating-top-n-report-with-others.html' title='Creating a Top N Report with ‘Others’'/><author><name>Bob Pearson</name><uri>http://www.blogger.com/profile/16528166535649336177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413638223026049990.post-9054352321828180055</id><published>2007-11-02T08:24:00.000-04:00</published><updated>2008-01-08T07:48:58.664-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tricks'/><category scheme='http://www.blogger.com/atom/ns#' term='deploy'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='integration'/><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='ssis'/><category scheme='http://www.blogger.com/atom/ns#' term='batch'/><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><category scheme='http://www.blogger.com/atom/ns#' term='subfolder'/><category scheme='http://www.blogger.com/atom/ns#' term='easy'/><category scheme='http://www.blogger.com/atom/ns#' term='BI'/><title type='text'>Deploying SSIS Packages</title><content type='html'>Today I am going to talk about easy SSIS package deployment.&lt;br /&gt;&lt;br /&gt;I generally am working with multiple data marts, and separate my projects by data mart.  However, if I have the same package name in 2 projects, and do a default deploy from SSIS, those files overwrite each other.&lt;br /&gt;&lt;br /&gt;You can create subfolders under MSDB in SQL Management Studio when logged into the SSIS instance, however, you have to manually deploy to these sub folders. &lt;br /&gt;&lt;br /&gt;Because I am lazy, I wrote a quick batch file to move a project from a development machine to the SSIS machine. The following batch file takes 1 argument, Servername, and copies all of the files from a project to that server.  The project path is hard coded in the batch file, so if you want to deploy multiple SSIS projects, just copy the batch file and change the path.&lt;br /&gt;&lt;br /&gt;&lt;hr width=75% align=center size=3&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;br /&gt;@Echo Off&lt;br /&gt;&lt;br /&gt;Echo.&lt;br /&gt;Echo.&lt;br /&gt;Echo   Test ETL SSIS Package Installation Script&lt;br /&gt;Echo   Written by BobP&lt;br /&gt;Echo   7/6/07&lt;br /&gt;Echo.&lt;br /&gt;&lt;br /&gt;if %1a == a goto Error&lt;br /&gt;&lt;br /&gt;Echo.&lt;br /&gt;Echo.&lt;br /&gt;Echo -----------------------------------------------------&lt;br /&gt;Echo --This will delete any Test ETL files&lt;br /&gt;Echo --on the server, and reinstall from the local machine&lt;br /&gt;Echo -----------------------------------------------------&lt;br /&gt;Pause&lt;br /&gt;&lt;br /&gt;REM   Remove Existing files and directory on Server&lt;br /&gt;for %%f in (C:\Projects\TestETL\TestETL\bin\*.dtsx) do dtutil /Q /SourceS %1 /SQL "\TestETL\\"%%~nf /Del&lt;br /&gt;dtutil /Q /SourceS %1 /FDe "SQL;\;TestETL"&lt;br /&gt;&lt;br /&gt;Echo.&lt;br /&gt;Echo Preparing to create folder&lt;br /&gt;Echo.&lt;br /&gt;pause&lt;br /&gt;&lt;br /&gt;REM   Create the Directory&lt;br /&gt;dtutil /Q /SourceS %1 /FC "SQL;\;TestETL"&lt;br /&gt;if errorlevel 1 goto End&lt;br /&gt;Echo.&lt;br /&gt;Echo Preparing to Copy Files to Server&lt;br /&gt;Echo.&lt;br /&gt;pause&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;REM   copy the all project packages to the server&lt;br /&gt;for %%f in (C:\Projects\TestETL\TestETL\bin\*.dtsx) do dtutil /Q /DestS %1 /Fi %%f /C "SQL;\TestETL\\"%%~nf&lt;br /&gt;&lt;br /&gt;Echo.&lt;br /&gt;Echo.&lt;br /&gt;Echo Installation Complete!&lt;br /&gt;Echo.&lt;br /&gt;Echo.&lt;br /&gt;Pause&lt;br /&gt;Goto End&lt;br /&gt;&lt;br /&gt;:Error&lt;br /&gt;Echo.   &lt;br /&gt;Echo. &lt;br /&gt;Echo Missing Servername!&lt;br /&gt;Echo Syntax: Deploy [targetservername]&lt;br /&gt;Echo.   &lt;br /&gt;Echo.   &lt;br /&gt;&lt;br /&gt;Pause&lt;br /&gt;&lt;br /&gt;:End&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;hr width=75% align=center size=3&gt;&lt;br /&gt;&lt;br /&gt;I have several copies of this, one for each of my projects, on my desktop.  When I want to deploy, all I have to do is double click.&lt;br /&gt;&lt;br /&gt;peace&lt;br /&gt;&lt;br /&gt;BobP&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413638223026049990-9054352321828180055?l=bobp1339.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bobp1339.blogspot.com/feeds/9054352321828180055/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413638223026049990&amp;postID=9054352321828180055' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/9054352321828180055'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/9054352321828180055'/><link rel='alternate' type='text/html' href='http://bobp1339.blogspot.com/2007/11/deploying-ssis-packages.html' title='Deploying SSIS Packages'/><author><name>Bob Pearson</name><uri>http://www.blogger.com/profile/16528166535649336177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413638223026049990.post-8956548370023241004</id><published>2007-11-01T10:43:00.000-04:00</published><updated>2008-01-08T07:48:58.666-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='interactive'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='image'/><category scheme='http://www.blogger.com/atom/ns#' term='missing'/><category scheme='http://www.blogger.com/atom/ns#' term='ssrs'/><category scheme='http://www.blogger.com/atom/ns#' term='BI'/><category scheme='http://www.blogger.com/atom/ns#' term='table'/><category scheme='http://www.blogger.com/atom/ns#' term='sort'/><category scheme='http://www.blogger.com/atom/ns#' term='report'/><category scheme='http://www.blogger.com/atom/ns#' term='button'/><title type='text'>Minimum Column Size for Interactive Sort</title><content type='html'>I have found out that in order to display the interactive sort button in SSRS, your table column must be at least 0.375in wide.  If it's any smaller, the button will not display.&lt;br /&gt;&lt;br /&gt;peace&lt;br /&gt;&lt;br /&gt;BobP&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413638223026049990-8956548370023241004?l=bobp1339.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bobp1339.blogspot.com/feeds/8956548370023241004/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413638223026049990&amp;postID=8956548370023241004' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/8956548370023241004'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/8956548370023241004'/><link rel='alternate' type='text/html' href='http://bobp1339.blogspot.com/2007/11/minimum-column-size-for-interactive.html' title='Minimum Column Size for Interactive Sort'/><author><name>Bob Pearson</name><uri>http://www.blogger.com/profile/16528166535649336177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413638223026049990.post-7914824212776010667</id><published>2007-10-30T12:41:00.001-04:00</published><updated>2008-01-08T07:48:58.669-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tricks'/><category scheme='http://www.blogger.com/atom/ns#' term='dynamic'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='image'/><category scheme='http://www.blogger.com/atom/ns#' term='users'/><category scheme='http://www.blogger.com/atom/ns#' term='jpg'/><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><category scheme='http://www.blogger.com/atom/ns#' term='ssrs'/><category scheme='http://www.blogger.com/atom/ns#' term='BI'/><category scheme='http://www.blogger.com/atom/ns#' term='report'/><title type='text'>Dynamic images in reports</title><content type='html'>Another question that comes up a lot is how to dynamically change the images in a report.&lt;br /&gt;I do this with client logos, and even the company logos that I put into report. Companies change their logos quite frequently, and you don’t want to update hundreds of reports when the logo changes.&lt;br /&gt;&lt;br /&gt;What I usually do is to put the logo out on a web server that is accessible to the report server. Then put the URL in a database table. This can be a static "config" table, or it could be your client table. (I use a table called Config, with 2 columns, ItemType, Item. I have a proc called GetConfigItem @ItemType. I pass in the item type and get back the item.)&lt;br /&gt;&lt;br /&gt;Then I create a dataset and a parameter for each logo path that I need. The parameter is populated from the dataset.&lt;br /&gt;&lt;br /&gt;Add an image control to your report (since you will populate the URL from a parameter, you can put the image control in the header/footer as well as the body)&lt;br /&gt;&lt;br /&gt;Set the source to External, and the Value property to an expression: =Parameters!LogoPath.Value&lt;br /&gt;If you set the image control to Fit Proportional, the logo should resize automatically.&lt;br /&gt;&lt;br /&gt;Now if you want to change the logo, you can place the new logo out on the web server, change the URL in the database, and all reports are updated!&lt;br /&gt;&lt;br /&gt;peace&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413638223026049990-7914824212776010667?l=bobp1339.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bobp1339.blogspot.com/feeds/7914824212776010667/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413638223026049990&amp;postID=7914824212776010667' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/7914824212776010667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/7914824212776010667'/><link rel='alternate' type='text/html' href='http://bobp1339.blogspot.com/2007/10/dynamic-images-in-reports.html' title='Dynamic images in reports'/><author><name>Bob Pearson</name><uri>http://www.blogger.com/profile/16528166535649336177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413638223026049990.post-8650858656437781457</id><published>2007-10-30T10:03:00.000-04:00</published><updated>2008-01-08T07:48:58.673-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='multiple'/><category scheme='http://www.blogger.com/atom/ns#' term='culture'/><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><category scheme='http://www.blogger.com/atom/ns#' term='ssrs'/><category scheme='http://www.blogger.com/atom/ns#' term='multilanguage'/><category scheme='http://www.blogger.com/atom/ns#' term='parameter'/><category scheme='http://www.blogger.com/atom/ns#' term='BI'/><category scheme='http://www.blogger.com/atom/ns#' term='report'/><category scheme='http://www.blogger.com/atom/ns#' term='language'/><title type='text'>Multi Language Reports</title><content type='html'>Well, I promised to write about handling multiple languages in SSRS so I thought I would at least get started on that. Judging from the visitor stats, that seems to be what a lot of people are looking for.&lt;br /&gt;&lt;br /&gt;As you may already be aware, SSRS does not inherently support multiple languages.  And what I am about to demonstrate does not apply to the data, just the labels and text that are pre-populated on a report.&lt;br /&gt;&lt;br /&gt;What I do is use database driven report text. I populate a parameter with the label text, and then use code to retrieve the label.  Since a parameter is nothing more than a key/value list, this works quite well.&lt;br /&gt;&lt;br /&gt;First, I create a master Label table. This will be the list of labels that I will have available to me. I have another table called Language.  This table obviously holds my list of available languages. And I have a third table called LabelText.  This table holds the actual text in the different languages that will be placed on the report.&lt;br /&gt;&lt;br /&gt;Here is the script:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;CREATE TABLE [dbo].[Label](&lt;br /&gt;            [LabelID] [int] IDENTITY(1,1) NOT NULL,&lt;br /&gt;            [Description] [varchar](900) NOT NULL)&lt;br /&gt;&lt;br /&gt;CREATE TABLE [dbo].[Language](&lt;br /&gt;            [LanguageID] [int] IDENTITY(1,1) NOT NULL,&lt;br /&gt;            [Language] [varchar](100) NOT NULL,&lt;br /&gt;[Active] [bit] NOT NULL)&lt;br /&gt;&lt;br /&gt;CREATE TABLE [dbo].[LabelText](&lt;br /&gt;            [LanguageID] [int] NOT NULL,&lt;br /&gt;            [LabelID] [int] NOT NULL,          &lt;br /&gt;            [LabelText] [nvarchar](max) NOT NULL)&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;I set the LabelText up as NVARCHAR to support Unicode character sets.&lt;br /&gt;&lt;br /&gt;Then I populate the Label table with all of the labels that I will need on the reports. Here is a short example:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;71         % Total&lt;br /&gt;75         Account&lt;br /&gt;120       Address 1&lt;br /&gt;121       Address 2&lt;br /&gt;122       Address 3&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;I also populate the Language table with the languages that will be available:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;1          English             1&lt;br /&gt;2          Spanish            0&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;The LabelText table really does all of the work. That contains the label text in the language of choice.&lt;br /&gt;&lt;br /&gt;I am fortunate enough to have a very good background as a software developer, so I created a web page to populate these two tables and the LabelText table. I let the business unit populate this table since my grasp of other languages is not the best.&lt;br /&gt;&lt;br /&gt;Once those are set up and populated, it’s time to turn to the report design.&lt;br /&gt;&lt;br /&gt;Create a dataset called Languages. Use it to retrieve the rows in the Language table.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;            Select   LanguageID,&lt;br /&gt;                        Language&lt;br /&gt;            From     Language&lt;br /&gt;            Where   Active = 1&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Since populating all of the labels in a new language may take some time, we only want to load languages that are set to Active.  This gives the business unit time to load the text, without giving the user the ability to select that language on a report.&lt;br /&gt;&lt;br /&gt;Create a parameter called Language. Populate it with the values from the Languages dataset. Pick a default if desired.&lt;br /&gt;&lt;br /&gt;Now create a dataset called Labels. This dataset is going to pull back the rows from label text for the selected language:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Select   LabelID,&lt;br /&gt;LabelText&lt;br /&gt;From     LabelText (NOLOCK)&lt;br /&gt;Where   LanguageID = @Language&lt;br /&gt;&lt;br /&gt;            union&lt;br /&gt;&lt;br /&gt;            Select   LabelID,&lt;br /&gt;                        LabelText&lt;br /&gt;            from      LabelText lt (NOLOCK)&lt;br /&gt;            Where   LanguageID = 1&lt;br /&gt;            and       Not Exists (       Select   1&lt;br /&gt;                                                From     LabelText z (NOLOCK)&lt;br /&gt;                                                Where   LanguageID = @LanguageID&lt;br /&gt;                                                and       z.LabelID = lt.LabelID)&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;This SQL pulls back all of the labels for the language selected, and then, for any labels missing in that language, unions the labels in language 1 (In my case, ID 1 is English)&lt;br /&gt;This way you always have a label returned.&lt;br /&gt;&lt;br /&gt;Go back to the report parameter screen and create a new parameter called Labels. This parameter should be internal, multi-value, and an integer.&lt;br /&gt;&lt;br /&gt;For the available values, populate from the Labels dataset, and do the same for the default values.  This gives us a parameter filled with the label ID and text, with all of them selected by default.  Since inside a report, you can only “see” selected parameter values, and not the populated values, this is an important step.&lt;br /&gt;&lt;br /&gt;In the report properties window, under the code tab, add code similar to this to loop through the selected values in the Labels parameter, and return the text for the ID passed in.  Since this parameter is loaded with the translated version, this is what will populate your labels.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Public Function GetLabel(Parm as Parameter, LabelID as Integer, Optional AddColon as Boolean=False) as String&lt;br /&gt;&lt;br /&gt;Dim t as Integer&lt;br /&gt;&lt;br /&gt;            For t = 0 to Ubound(Parm.Value)&lt;br /&gt;                        If (Parm.Value(t) = LabelID) Then&lt;br /&gt;                                    if AddColon = true then&lt;br /&gt;                                                Return Parm.Label(t) &amp;amp; ":"&lt;br /&gt;                                    else&lt;br /&gt;                                                Return Parm.Label(t)&lt;br /&gt;                                    end if&lt;br /&gt;                        End if&lt;br /&gt;            Next t&lt;br /&gt;&lt;br /&gt;            Return ""&lt;br /&gt;&lt;br /&gt;End Function&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Notice the AddColon parameter.  I put this in because I have a lot of fields in my reports that are setup like a data entry form:  Label:  Value.  Since I didn’t want to type +”:” in every textbox, I just added it to the routine. You can add as much custom code in here as you want.  This will make your job easier in the long run.&lt;br /&gt;&lt;br /&gt;The last step is to use your label table as a lookup (I usually load it into Excel and sort it alphabetically) and add this formula to every label textbox:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;           &lt;br /&gt;            =Code.GetLabel(Parameters!Labels, 105)&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;And if you wanted the colon:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;            =Code.GetLabel(Parameters!Labels,2, True)&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;And that’s it!  Now you have multi-language report labels.  On the downside, it makes the report harder to maintain, but if the requirement is multi-language, this works very well.&lt;br /&gt;&lt;br /&gt;Keep in mind; this will not work on parameter labels. I have not yet found a way to translate these. Probably the only way to do it is to have a custom front end, and create your own parameter display using a combination of your own code and the SSRS web services.&lt;br /&gt;&lt;br /&gt;Many thanks to Brian Welcker for the initial idea of using a parameter for the labels.  (&lt;a href="http://blogs.msdn.com/bwelcker/archive/2007/07/11/laser-guided-missiles-report-localization-through-parameters.aspx"&gt;http://blogs.msdn.com/bwelcker/archive/2007/07/11/laser-guided-missiles-report-localization-through-parameters.aspx&lt;/a&gt;)&lt;br /&gt;I was orignally calling a C# assembly to populate each label from the database. That generated way too much database activity. &lt;br /&gt;&lt;br /&gt;peace&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413638223026049990-8650858656437781457?l=bobp1339.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bobp1339.blogspot.com/feeds/8650858656437781457/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413638223026049990&amp;postID=8650858656437781457' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/8650858656437781457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/8650858656437781457'/><link rel='alternate' type='text/html' href='http://bobp1339.blogspot.com/2007/10/multi-language-reports.html' title='Multi Language Reports'/><author><name>Bob Pearson</name><uri>http://www.blogger.com/profile/16528166535649336177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413638223026049990.post-3261801900161211444</id><published>2007-10-26T23:07:00.000-04:00</published><updated>2008-01-08T07:48:58.676-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='ssrs'/><category scheme='http://www.blogger.com/atom/ns#' term='humor'/><category scheme='http://www.blogger.com/atom/ns#' term='BI'/><title type='text'>And I thought I had too much time on my hands...</title><content type='html'>Ok, so I was perusing the internet and came across this:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.geekologie.com/2007/10/japanese_lady_produces_unique.php"&gt;http://www.geekologie.com/2007/10/japanese_lady_produces_unique.php&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I really am speechless... Laughing too hard...&lt;br /&gt;&lt;br /&gt;Peace&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413638223026049990-3261801900161211444?l=bobp1339.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bobp1339.blogspot.com/feeds/3261801900161211444/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413638223026049990&amp;postID=3261801900161211444' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/3261801900161211444'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/3261801900161211444'/><link rel='alternate' type='text/html' href='http://bobp1339.blogspot.com/2007/10/and-i-thought-i-had-too-much-time-on-my.html' title='And I thought I had too much time on my hands...'/><author><name>Bob Pearson</name><uri>http://www.blogger.com/profile/16528166535649336177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413638223026049990.post-7080720521265336871</id><published>2007-10-26T16:31:00.000-04:00</published><updated>2008-01-08T07:48:58.683-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='RDL Editor'/><category scheme='http://www.blogger.com/atom/ns#' term='ssrs'/><category scheme='http://www.blogger.com/atom/ns#' term='BI'/><category scheme='http://www.blogger.com/atom/ns#' term='report'/><title type='text'>XML/RDL Editor</title><content type='html'>I am about 60% done with a project to help me edit RDL files. For those of you unfamiliar, these are the XML files in SSRS that control everything about the report.&lt;br /&gt;&lt;br /&gt;My goal in this project is to be able to drag and drop nodes between 2 list views, delete nodes, copy/paste nodes, etc.&lt;br /&gt;&lt;br /&gt;I am doing this because I have a need to copy standard parts of reports between almost 100 reports now. And that number is only going to grow in the future.&lt;br /&gt;&lt;br /&gt;My question: is there already a tool out there that will do this? I searched before developing, but did not find a decent one.&lt;br /&gt;&lt;br /&gt;And, if I did finish this, and thought about distributing it, would anyone else out there use it?&lt;br /&gt;&lt;br /&gt;On another subject, last Saturday, my project manager’s wife was hit and killed by a drunk driver.  She left behind Jim and their 3 sons. (&lt;a href="http://voluntaryredneck.mu.nu/archives/244552.php"&gt;http://voluntaryredneck.mu.nu/archives/244552.php&lt;/a&gt;) Please keep them in your thoughts and prayers.&lt;br /&gt;&lt;br /&gt;Peace&lt;br /&gt;&lt;br /&gt;BobP&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413638223026049990-7080720521265336871?l=bobp1339.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bobp1339.blogspot.com/feeds/7080720521265336871/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413638223026049990&amp;postID=7080720521265336871' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/7080720521265336871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/7080720521265336871'/><link rel='alternate' type='text/html' href='http://bobp1339.blogspot.com/2007/10/xmlrdl-editor.html' title='XML/RDL Editor'/><author><name>Bob Pearson</name><uri>http://www.blogger.com/profile/16528166535649336177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413638223026049990.post-3192909404765785412</id><published>2007-10-22T15:06:00.000-04:00</published><updated>2008-01-08T07:48:58.688-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='data'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='users'/><category scheme='http://www.blogger.com/atom/ns#' term='filter'/><category scheme='http://www.blogger.com/atom/ns#' term='ssrs'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><category scheme='http://www.blogger.com/atom/ns#' term='BI'/><category scheme='http://www.blogger.com/atom/ns#' term='report'/><title type='text'>Data Based Security in Reporting</title><content type='html'>I sometimes wonder if anyone actually reads these blogs :-P&lt;br /&gt;Well, here is my chance to find out.&lt;br /&gt;&lt;br /&gt;I am going to ask for feedback.&lt;br /&gt;&lt;br /&gt;In my position as a Business Intelligence Consultant, I have been asked before how to implement data based security (DBS).  By DBS I mean the ability for an admin user to restrict a row of data from a user based on a value in the database.&lt;br /&gt;&lt;br /&gt;For example, I, as an end user of a report, can only see transactions that occurred within my region: Georgia; whereas my peer across the country can only see transactions in Colorado.&lt;br /&gt;&lt;br /&gt;I could add a where clause to every report, but what if the admin wants the ability to filter by ANY field in the database.&lt;br /&gt;&lt;br /&gt;I have a solution that works quite well, but I am interested to know if anyone else has run into this request, and how they have solved it.&lt;br /&gt;&lt;br /&gt;I am going to post my solution later on this week.&lt;br /&gt;&lt;br /&gt;Peace&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413638223026049990-3192909404765785412?l=bobp1339.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bobp1339.blogspot.com/feeds/3192909404765785412/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413638223026049990&amp;postID=3192909404765785412' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/3192909404765785412'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/3192909404765785412'/><link rel='alternate' type='text/html' href='http://bobp1339.blogspot.com/2007/10/data-based-security-in-reporting.html' title='Data Based Security in Reporting'/><author><name>Bob Pearson</name><uri>http://www.blogger.com/profile/16528166535649336177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413638223026049990.post-1944158003309465753</id><published>2007-10-19T09:49:00.000-04:00</published><updated>2008-01-08T07:48:58.691-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='format'/><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><category scheme='http://www.blogger.com/atom/ns#' term='ssrs'/><category scheme='http://www.blogger.com/atom/ns#' term='hide'/><category scheme='http://www.blogger.com/atom/ns#' term='numbers'/><category scheme='http://www.blogger.com/atom/ns#' term='BI'/><category scheme='http://www.blogger.com/atom/ns#' term='zero'/><category scheme='http://www.blogger.com/atom/ns#' term='report'/><title type='text'>Formatting Zero Values</title><content type='html'>This entry is more for my memory than anything else, but I am sure someone else out there can use it.&lt;br /&gt;&lt;br /&gt;Did you know that you can custom format a zero value in a report?&lt;br /&gt;&lt;br /&gt;From what I have seen in the MSDN forums, not too many people do. Most people, and myself included, first set up a visibility formula like this:&lt;br /&gt;=iif(Fields!Data.Value = 0, true, false) &lt;-- Sets hidden to true if value is zero.&lt;br /&gt;&lt;br /&gt;And that does work great, unless you have any kind of formatting or borders in your cell. Then it hides them too.&lt;br /&gt;&lt;br /&gt;The better workaround is to use the Format property on the cell and use a custom format string.&lt;br /&gt;The custom format string has 3 parts separated by semicolons:&lt;br /&gt;Positive value format; Negative value format; Zero format&lt;br /&gt;&lt;br /&gt;So if you wanted to hide the zeros in a decimal number cell, the format string would look like:&lt;br /&gt;#,###.##;-#,###.##;””&lt;br /&gt;&lt;br /&gt;You could also use that to further document the zero value:&lt;br /&gt;#,##0.0;(#,##0.0);”Zero”&lt;br /&gt;&lt;br /&gt;The only limitation that I have found, and I am still looking for a workaround is if you are writing a multi-locale report. If you change the Language property, the number formatting will not change.&lt;br /&gt;&lt;br /&gt;I will post an update once I find a way to do this.&lt;br /&gt;&lt;br /&gt;Till then…&lt;br /&gt;&lt;br /&gt;Peace&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413638223026049990-1944158003309465753?l=bobp1339.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bobp1339.blogspot.com/feeds/1944158003309465753/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413638223026049990&amp;postID=1944158003309465753' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/1944158003309465753'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/1944158003309465753'/><link rel='alternate' type='text/html' href='http://bobp1339.blogspot.com/2007/10/formatting-zero-values.html' title='Formatting Zero Values'/><author><name>Bob Pearson</name><uri>http://www.blogger.com/profile/16528166535649336177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413638223026049990.post-3635592485748519814</id><published>2007-10-18T08:36:00.000-04:00</published><updated>2008-01-08T07:48:58.694-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='multivalue'/><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><category scheme='http://www.blogger.com/atom/ns#' term='ssrs'/><category scheme='http://www.blogger.com/atom/ns#' term='workaround'/><category scheme='http://www.blogger.com/atom/ns#' term='parameter'/><category scheme='http://www.blogger.com/atom/ns#' term='BI'/><category scheme='http://www.blogger.com/atom/ns#' term='shortcoming'/><category scheme='http://www.blogger.com/atom/ns#' term='report'/><title type='text'>2 Shortcomings of Multi Valued Parameters in SSRS</title><content type='html'>Wow. What a terrific morning!&lt;br /&gt;&lt;br /&gt;We are getting some rain that is so desperately needed (They say the reservoir that feeds Atlanta will dry up in 90 days if we don’t get some substantial rain soon. &lt;a href="http://abcnews.go.com/GMA/story?id=3730145&amp;amp;page=1"&gt;http://abcnews.go.com/GMA/story?id=3730145&amp;amp;page=1&lt;/a&gt;), I had an awesome rehearsal/jam with my band last night, and our production servers are ready to go online to be configured!&lt;br /&gt;&lt;br /&gt;So this morning I am going to discuss 2 shortcomings of the multi-valued parameter (MvP) without getting irritated.&lt;br /&gt;&lt;br /&gt;The first shortcoming, and in my opinion the most important, is the inability to pass a MvP to a stored procedure with out having to parse it out in the procedure. (See this blog for more information &lt;a href="http://otechnology.wordpress.com/2007/04/02/processing-csv-strings-t-sql/"&gt;http://otechnology.wordpress.com/2007/04/02/processing-csv-strings-t-sql/&lt;/a&gt; )&lt;br /&gt;I would think that since Microsoft was writing these 2 products together, they could have done a little collaboration and figured out a way to pass this. So far, I have not seen anything showing that this is being fixed in 2008, but I may have missed something. There is an entry in Connect about this, but there has been no activity (&lt;a href="https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=305511"&gt;https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=305511&lt;/a&gt; )&lt;br /&gt;&lt;br /&gt;For a workaround on this, I just put the SQL statement in the report. I know that forces a compile every time the report is run, however the processing time to parse up the parameters is much more than the compile.&lt;br /&gt;&lt;br /&gt;The second shortcoming is the Select All. I know that in SP1 some developer removed the Select All check box from MvPs and the entire SSRS community replied with a unified roar. I was one of them. So in SP2, the Select All was returned with a collective sigh of relief. BUT there is still one thing missing from the Select All. The ability to handle the All in the SQL query without listing out all in an IN clause. For example, if I have a list of airports of the world in a MvP, my Where clause looks like this: Where AirportCode in (@AirportCode)&lt;br /&gt;&lt;br /&gt;Now, if the user selects Atlanta, the SQL becomes: Where AirportCode in (‘ATL’)&lt;br /&gt;However, when the user chooses Select All, the SQL is a concatenation of every value in the MvP. So even though we know that there is no need to even filter on that parameter, the SQL is formed in a way that causes the query to slow way down, even on an indexed field.&lt;br /&gt;&lt;br /&gt;Well, here is my workaround for that. And while it is NOT elegant, it is effective.&lt;br /&gt;&lt;br /&gt;Suppose you have 1 MvP called Contacts.&lt;br /&gt;&lt;br /&gt;I set up a 2nd MvP called AllContacts. I populate it with the same dataset as Contacts, and then set the default values to the same dataset as well, effectively selecting all by default. I make this parameter internal.&lt;br /&gt;&lt;br /&gt;I then setup a third parameter, type of integer, names AllContactsSelected. I also make this internal. It is NOT multi value and there is nothing in the available values. For the default value I use this expression: =iif(Parameters!Contacts.Count = Parameters!AllContacts.Count,true,false)&lt;br /&gt;&lt;br /&gt;In my SQL where clause I add this:&lt;br /&gt;Where (@AllContactsSelected = 1 or Contact in (@Contacts))&lt;br /&gt;&lt;br /&gt;Make sure that you put it in that order, otherwise it will try to evaluate the IN clause. This way it will see that @AllContactsSelected = 1 and not even execute the IN.&lt;br /&gt;&lt;br /&gt;Well, that’s all for now. I sure would like to see these things fixed in SQL Server 2008, but I am not expecting it.&lt;br /&gt;&lt;br /&gt;For now, I will just go enjoy the rain…&lt;br /&gt;&lt;br /&gt;Peace&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413638223026049990-3635592485748519814?l=bobp1339.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bobp1339.blogspot.com/feeds/3635592485748519814/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413638223026049990&amp;postID=3635592485748519814' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/3635592485748519814'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/3635592485748519814'/><link rel='alternate' type='text/html' href='http://bobp1339.blogspot.com/2007/10/2-shortcomings-of-multi-valued.html' title='2 Shortcomings of Multi Valued Parameters in SSRS'/><author><name>Bob Pearson</name><uri>http://www.blogger.com/profile/16528166535649336177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413638223026049990.post-9087379499457545221</id><published>2007-10-17T07:52:00.000-04:00</published><updated>2008-01-08T07:48:58.696-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='users'/><category scheme='http://www.blogger.com/atom/ns#' term='lessons'/><category scheme='http://www.blogger.com/atom/ns#' term='industry'/><category scheme='http://www.blogger.com/atom/ns#' term='BI'/><category scheme='http://www.blogger.com/atom/ns#' term='report'/><category scheme='http://www.blogger.com/atom/ns#' term='business'/><title type='text'>Is the business view of IT changing?</title><content type='html'>Today, I am going to stray from SSRS again and discuss business.&lt;br /&gt;&lt;br /&gt;In my normal batch of morning email, I came across a link to an article&lt;br /&gt;(&lt;a href="http://www.networkworld.com/news/2007/101607-noncertified-it-pros-better-paid.html"&gt;http://www.networkworld.com/news/2007/101607-noncertified-it-pros-better-paid.html&lt;/a&gt;) with the headline being: Non-certified IT pros earn more than certified counterparts: survey.&lt;br /&gt;&lt;br /&gt;Being a non-certified professional, I was really happy to see that. But after reading it, I realized that the headline was not the only point to the article. It was just the one that would catch people’s eye. For me, the interesting message is that companies are tired of “techies.” They really want business people that can do a technical job.&lt;br /&gt;&lt;br /&gt;I have been working with business units for most of my career. My first true technology job offer was: “I can’t get any information out of IT; I want you to work for me, the CFO, and provide me with the reports that I need and can understand.” I understand from the business side how frustrating it is when you ask for a report, and a developer responds with technical jargon about primary keys and cross server queries. The average business person glazes over when they hear the first technical term.&lt;br /&gt;&lt;br /&gt;Don’t misunderstand me, I am a technical person. I am a geek. I love the inner workings of almost anything, not just software or gadgets. But first and foremost, I am a business person. I started my first business at age 7, selling lemonade. I made almost $10 in one day! (And I did it without a PC, without a large un-wieldy database application that took 2 years to implement and never worked right, without a tech-head telling me that I shouldn’t even be in business because my network platform was not on the cutting edge.) I have started and run several successful businesses outside of the technology realm, and a couple within. I have been in management, and in the ranks. I have seen a lot from the business side.&lt;br /&gt;&lt;br /&gt;So it was refreshing for me to read that more business people want this IT re-alignment. But, I have been hearing this for almost 20 years. Are things really starting to change?&lt;br /&gt;&lt;br /&gt;One can hope.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Peace&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413638223026049990-9087379499457545221?l=bobp1339.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bobp1339.blogspot.com/feeds/9087379499457545221/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413638223026049990&amp;postID=9087379499457545221' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/9087379499457545221'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/9087379499457545221'/><link rel='alternate' type='text/html' href='http://bobp1339.blogspot.com/2007/10/is-business-view-of-it-changing.html' title='Is the business view of IT changing?'/><author><name>Bob Pearson</name><uri>http://www.blogger.com/profile/16528166535649336177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413638223026049990.post-1121179829373023428</id><published>2007-10-15T14:25:00.000-04:00</published><updated>2008-01-08T07:48:58.710-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='url'/><category scheme='http://www.blogger.com/atom/ns#' term='multivalue'/><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><category scheme='http://www.blogger.com/atom/ns#' term='ssrs'/><category scheme='http://www.blogger.com/atom/ns#' term='parameter'/><category scheme='http://www.blogger.com/atom/ns#' term='BI'/><category scheme='http://www.blogger.com/atom/ns#' term='report'/><title type='text'>Passing SSRS Report Parameters in an URL</title><content type='html'>There is a lot of discussion on the forums about passing parameters to an SSRS report using an URL however one of the items that you rarely read about is the passing of multi valued parameters in an URL.&lt;br /&gt;&lt;br /&gt;To do this, just pass the name/value pair, separated by the ampersand.&lt;br /&gt;&lt;br /&gt;For Example:  http://server/reportserver?/dir/Report&amp;rs:Command=Render&amp;Parm1=VALUE1&amp;Parm1=VALUE2&amp;Parm1=VALUE3&lt;br /&gt;&lt;br /&gt;As long as the parameter Parm1 is set to multi value, and it contains those three values (VALUE1, VALUE2, VALUE3) all three will be selected.&lt;br /&gt;&lt;br /&gt;The only exception to this rule is if one of the name/value pairs is a null (Parm1:IsNull=True) &lt;br /&gt;That causes SSRS to ignore the rest of the values passed.&lt;br /&gt;&lt;br /&gt;Remember to pass the Value, and not the Label.&lt;br /&gt;&lt;br /&gt;Peace&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413638223026049990-1121179829373023428?l=bobp1339.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bobp1339.blogspot.com/feeds/1121179829373023428/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413638223026049990&amp;postID=1121179829373023428' title='17 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/1121179829373023428'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/1121179829373023428'/><link rel='alternate' type='text/html' href='http://bobp1339.blogspot.com/2007/10/passing-ssrs-report-parameters-in-url.html' title='Passing SSRS Report Parameters in an URL'/><author><name>Bob Pearson</name><uri>http://www.blogger.com/profile/16528166535649336177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>17</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413638223026049990.post-530677578918777081</id><published>2007-10-11T10:48:00.000-04:00</published><updated>2008-01-08T07:48:58.723-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='format'/><category scheme='http://www.blogger.com/atom/ns#' term='culture'/><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><category scheme='http://www.blogger.com/atom/ns#' term='ssrs'/><category scheme='http://www.blogger.com/atom/ns#' term='BI'/><category scheme='http://www.blogger.com/atom/ns#' term='date'/><category scheme='http://www.blogger.com/atom/ns#' term='currency'/><category scheme='http://www.blogger.com/atom/ns#' term='report'/><category scheme='http://www.blogger.com/atom/ns#' term='language'/><title type='text'>Multi-Language Tips in SSRS</title><content type='html'>In looking through the forums at Microsoft, I often see questions pertaining to the formats of dates, number and currency in a report.&lt;br /&gt;&lt;br /&gt;In my latest gig with a multinational travel management company, I have had a lot of exposure to the multi-language/culture formatting.&lt;br /&gt;&lt;br /&gt;I will cover multiple languages in a future blog, and today focus on the formatting of dates, numbers, and currency values.&lt;br /&gt;&lt;br /&gt;To start with, Microsoft has a good page explaining each of the terms used by them to customize the user interface to the user’s regional setting:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.microsoft.com/globaldev/getwr/steps/wrg_lclmdl.mspx"&gt;http://www.microsoft.com/globaldev/getwr/steps/wrg_lclmdl.mspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SSRS handles formatting the display of dates, numbers and currency by adding a property to a report and textbox: Language. This is misleading since it really does not change the language except on the verbose date formats. For example, changing a number from the US format: 1,234.56 to a French format: 1 234,56 really isn’t a language change, just a locale change, according to the link above.&lt;br /&gt;&lt;br /&gt;The language property displays the locale description, and behind that, the locale code.&lt;br /&gt;For example, the property displays English (United States), and the value behind that is en-US.&lt;br /&gt;&lt;br /&gt;I found a good list of these locale codes here:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/system.globalization.cultureinfo.aspx"&gt;http://msdn2.microsoft.com/en-us/library/system.globalization.cultureinfo.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I put these into a database table, so that I can use them as a parameter in my reports.&lt;br /&gt;&lt;br /&gt;In the reports that I create, I have a dataset called Locales in which I call a stored procedure that returns the locale code and the description, sorted by description.&lt;br /&gt;&lt;br /&gt;I then create a parameter called Locale. This is a String parameter that is setup to read available values from the Locales dataset, with the code as the value and the description as the label.&lt;br /&gt;&lt;br /&gt;Depending on the report target audience, I set a non-queried default value, usually en-US.&lt;br /&gt;&lt;br /&gt;In the report properties window (NOT the properties that show up when you select the menu items: Report, Properties. You have to click on the outlying yellowish area of the report designer and press F4), I set the language as an expression: =Parameters!Locale.Value&lt;br /&gt;&lt;br /&gt;Now you should format all of the textboxes that contain dates, numbers and currencies.&lt;br /&gt;&lt;br /&gt;You should use the standard formatting strings rather than hardcoding a format into the format property. For example, for a short date format, use d rather than d/M/yy, as this will always format the date d/M/yy no matter what you select for the language property.&lt;br /&gt;&lt;br /&gt;Here are some standard formatting codes:&lt;br /&gt;&lt;br /&gt;Date/Time: &lt;a href="http://msdn2.microsoft.com/en-us/library/az4se3k1(VS.71).aspx"&gt;http://msdn2.microsoft.com/en-us/library/az4se3k1(VS.71).aspx&lt;/a&gt;&lt;br /&gt;Numeric: &lt;a href="http://msdn2.microsoft.com/en-us/library/dwhawy9k(VS.71).aspx"&gt;http://msdn2.microsoft.com/en-us/library/dwhawy9k(VS.71).aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Note that some of the formatting strings are “InvariantCulture.” This means that they will not be affected by the language property.&lt;br /&gt;&lt;br /&gt;NOTE: When changing locales on currency fields, all this does is change the formatting of the displayed number. It does NOT do any currency conversion. For this reason, I usually do not format currencies as currency, but as a N2 (Numeric, 2 decimal places) and then display the ISO currency code (USD, EUR, JPY, etc) to indicate which currency is being displayed. I also use a separate parameter to select the currency based on this ISO code. Since the ISO currency codes and the Microsoft locale list do not tie in any way, it makes it a lot more difficult to use the language properties to format currency changes.&lt;br /&gt;&lt;br /&gt;The way parameters are displayed is controlled by the browser regional settings.  There is no way in reporting services to control that. However, the regional settings on a browser should be set to the way the user likes to see the dates, numbers, etc, so you should not have to worry about this setting.&lt;br /&gt;&lt;br /&gt;Well, that wraps up this tip. I hope that someone out there benefits from this. I have done a lot of research, as well as a lot of work on my own, to put this together. I use this extensively on existing reports and it works very well.&lt;br /&gt;&lt;br /&gt;Let me know what you think!&lt;br /&gt;&lt;br /&gt;Peace…&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413638223026049990-530677578918777081?l=bobp1339.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bobp1339.blogspot.com/feeds/530677578918777081/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413638223026049990&amp;postID=530677578918777081' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/530677578918777081'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/530677578918777081'/><link rel='alternate' type='text/html' href='http://bobp1339.blogspot.com/2007/10/multi-language-tips-in-ssrs.html' title='Multi-Language Tips in SSRS'/><author><name>Bob Pearson</name><uri>http://www.blogger.com/profile/16528166535649336177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413638223026049990.post-3647029980133761185</id><published>2007-10-10T08:11:00.000-04:00</published><updated>2008-01-08T07:48:58.735-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='requirements'/><category scheme='http://www.blogger.com/atom/ns#' term='customer'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='users'/><category scheme='http://www.blogger.com/atom/ns#' term='lessons'/><category scheme='http://www.blogger.com/atom/ns#' term='industry'/><category scheme='http://www.blogger.com/atom/ns#' term='deadlines'/><category scheme='http://www.blogger.com/atom/ns#' term='BI'/><category scheme='http://www.blogger.com/atom/ns#' term='mistakes'/><category scheme='http://www.blogger.com/atom/ns#' term='report'/><category scheme='http://www.blogger.com/atom/ns#' term='business'/><title type='text'>3 Lessons on Deadlines and Business Requirements</title><content type='html'>&lt;blockquote&gt;&lt;/blockquote&gt;Well, here I am again, back after a "Got to have it now, pull out all the stops" project has been completed.&lt;br /&gt;&lt;br /&gt;Let me give you a quick overview:&lt;br /&gt;&lt;br /&gt;I had a client come to me on Sept 27&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;th&lt;/span&gt; with an urgent request:&lt;br /&gt;&lt;blockquote&gt;"We have a new system going into beta with several very important clients and we need a quick data mart and 2 reports. And we need them by next Tuesday!" &lt;/blockquote&gt;&lt;p&gt;So with a fair amount of skepticism, I accepted the task. After all, this was a client that I have been dealing with for a while, and it was only 2 reports.&lt;/p&gt;&lt;p&gt;So, using &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;SSIS&lt;/span&gt; and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;SQL&lt;/span&gt; 2k5, I put together the data mart (I had already been working on some data marts for this client, so I was familiar with their business and data model) and started looking in depth at the reports. &lt;/p&gt;&lt;p&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;OOOOOPS&lt;/span&gt;!! Guess I should have done that first. By looking at the reports I could tell that the users had asked for some reports, the deadline aware project manager talked to the developers, who told the client that they only had time for 2 reports, not the 33 the users originally needed.&lt;/p&gt;&lt;p&gt;This was not 2 reports. It was "let's take all 33 reports, combine all of the parameters and fields and put them on 1 report, and then add 1 because we are allowed to."&lt;/p&gt;&lt;p&gt;So, I naturally did what any decent consultant would do. I balked. Not in a bad way, not rude or condescending, just factual:&lt;/p&gt;&lt;blockquote&gt;While this 1 master report will work, is it really fulfilling the users needs? Do they need 28 parameters in the parameter bar in the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;SSRS&lt;/span&gt; report manager? It takes up 80% of the maximized browser window. How do they view the report? Also, the report is very slow, because you are joining not only fact tables and dimensions, but also different atomic level fact tables. Let's talk to the users to see what they really need.&lt;/blockquote&gt;&lt;p&gt;So we did. And in doing so, we found out that they had indeed been told that they could only have 2 reports. So: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Lesson #1: If your users tell you they need X functionality, and you restrict them to only Y number of items, they WILL find a way to get X into the Y.&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;In talking with the user, we also found out that next Tuesday was NOT a hard fast deadline. &lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Lesson #2: Given the choice between crap in 2 days and gold in 2 weeks, most users will take the gold.&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;By giving the users my recommendations, they came to appreciate that someone was looking out for their best interests. They felt comfortable telling me their goals, their needs, as it pertains to these reports. I built up a relationship with these people. In turn, I made sure to try and understand what they needed, and provide it for them. &lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Lesson #3: Users are just people trying to get their job done. Respect that.&lt;/strong&gt; &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;And they will get it done with or without your software, reports, data, etc. It's your job to make theirs easier, and to contribute to the well being of the company as a whole.&lt;/p&gt;&lt;p&gt;These seem to be pretty basic lessons, right? However, as a consultant, I see these same mistakes being made everywhere. And yet it surprises me every time. We, as an Information Technology industry, should never let these lessons slip from our minds. They are fundamental to our jobs, and to our industry as a whole.&lt;/p&gt;&lt;p&gt;In summary, the users defined 4 reports that would meet their immediate needs, and I was able to produce those reports for the users in a couple of days, and everyone is happy. Sounds like a cheesy movie, huh? &lt;/p&gt;&lt;p&gt;Peace&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413638223026049990-3647029980133761185?l=bobp1339.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bobp1339.blogspot.com/feeds/3647029980133761185/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413638223026049990&amp;postID=3647029980133761185' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/3647029980133761185'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/3647029980133761185'/><link rel='alternate' type='text/html' href='http://bobp1339.blogspot.com/2007/10/deadlines-and-business-requirements.html' title='3 Lessons on Deadlines and Business Requirements'/><author><name>Bob Pearson</name><uri>http://www.blogger.com/profile/16528166535649336177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413638223026049990.post-3778541327262643947</id><published>2007-09-26T14:45:00.000-04:00</published><updated>2008-01-08T07:48:58.738-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='deploy'/><category scheme='http://www.blogger.com/atom/ns#' term='Business Intelligence'/><category scheme='http://www.blogger.com/atom/ns#' term='Script'/><category scheme='http://www.blogger.com/atom/ns#' term='failed to load'/><category scheme='http://www.blogger.com/atom/ns#' term='ssrs'/><category scheme='http://www.blogger.com/atom/ns#' term='error'/><category scheme='http://www.blogger.com/atom/ns#' term='64 bit'/><category scheme='http://www.blogger.com/atom/ns#' term='BI'/><category scheme='http://www.blogger.com/atom/ns#' term='report'/><title type='text'>FUN with SSIS Script Tasks and 64bit deployment</title><content type='html'>I am developing my SSIS packages on my 32 bit, Windows XP Pro SP2 laptop. Everything works fine. My project has a parent package and 26 child packages.&lt;br /&gt;&lt;br /&gt;In the child packages, I have a script task that sets the version number into a variable. Nothing big, 1 statement:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Dts.Variables.Item("User::Version").Value = Dts.Variables.Item("System::VersionMajor").Value.ToString() &amp;amp; _&lt;br /&gt;"." &amp;amp; Dts.Variables.Item("System::VersionMinor").Value.ToString() &amp;amp; _&lt;br /&gt;"." &amp;amp; Dts.Variables.Item("System::VersionBuild").Value.ToString()&lt;/blockquote&gt;&lt;br /&gt;So I created a "template" package that had my basic tasks in it, and started each child package from this template.&lt;br /&gt;&lt;br /&gt;Everything worked great on my laptop.&lt;br /&gt;&lt;br /&gt;Deployed to our 64-bit production platform and I get the following error when running the package:&lt;br /&gt;&lt;blockquote&gt;Precompiled script failed to load. The computer that is running the Script Task does not have a compiler capable of recompiling the script. To recompile the script, see the Microsoft Knowledge Base article, KB931846 (http://go.microsoft.com/fwlink/?LinkId=81885).&lt;/blockquote&gt;Naturally I follow the link in the error, after cleaning up the water that I spewed from the surprise I got from a very detailed error message in SSIS.&lt;br /&gt;&lt;br /&gt;It did not apply to me... I had SQL Server SP2 installed. I even re-installed after reading it, just to make sure. Did not fix it.&lt;br /&gt;&lt;br /&gt;Found this forum thread: &lt;a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=591709&amp;amp;SiteID=1"&gt;http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=591709&amp;amp;SiteID=1&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Read thru it... Had NO script tasks set to False for pre-compile.&lt;br /&gt;&lt;br /&gt;After looking thru my packages, confirming Precompile was set to True, I had an epiphany...&lt;br /&gt;&lt;br /&gt;Since I started from a template, I bet the script tasks were NOT being compiled, since I never opened them.&lt;br /&gt;&lt;br /&gt;So I went thru all 27 packages, opening up each script task (Control Flow) AND component (Data Flow), and then the script window. Closed the script window, and pressed ok on the script task window.&lt;br /&gt;&lt;br /&gt;Re-built and deployed... tested OK!&lt;br /&gt;&lt;br /&gt;So, if you use a "template" package with a script task or component, make sure you open the actual script screen and close it again to force a re-compile.&lt;br /&gt;&lt;br /&gt;BobP&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413638223026049990-3778541327262643947?l=bobp1339.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bobp1339.blogspot.com/feeds/3778541327262643947/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413638223026049990&amp;postID=3778541327262643947' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/3778541327262643947'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/3778541327262643947'/><link rel='alternate' type='text/html' href='http://bobp1339.blogspot.com/2007/09/fun-with-ssis-script-tasks-and-64bit.html' title='FUN with SSIS Script Tasks and 64bit deployment'/><author><name>Bob Pearson</name><uri>http://www.blogger.com/profile/16528166535649336177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8413638223026049990.post-7939370246092402906</id><published>2007-09-20T13:47:00.000-04:00</published><updated>2007-10-30T16:00:30.579-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tips'/><category scheme='http://www.blogger.com/atom/ns#' term='ssrs'/><category scheme='http://www.blogger.com/atom/ns#' term='welcome'/><category scheme='http://www.blogger.com/atom/ns#' term='report'/><title type='text'>Welcome to my SSRS blog!</title><content type='html'>&lt;span style="color:#000000;"&gt;&lt;span style="font-family:arial;"&gt;Hello!&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Welcome to my SSRS (and sometimes other subjects) blog.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;I have been working with Microsoft Reporting Services since mid 2003, and the SQL Server 2005 BI tools since mid 2005.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;I am constantly coming up with work-arounds, and never think to share that knowledge.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;Well, here is my attempt. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;I hope someone out there benefits from this blog. And remember, if you have a question, do not hesitate to ask it!&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;Thanks!&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;BobP&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8413638223026049990-7939370246092402906?l=bobp1339.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bobp1339.blogspot.com/feeds/7939370246092402906/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8413638223026049990&amp;postID=7939370246092402906' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/7939370246092402906'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8413638223026049990/posts/default/7939370246092402906'/><link rel='alternate' type='text/html' href='http://bobp1339.blogspot.com/2007/09/welcome-to-my-ssrs-blog.html' title='Welcome to my SSRS blog!'/><author><name>Bob Pearson</name><uri>http://www.blogger.com/profile/16528166535649336177</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry></feed>
