February 2008 Archives
The last two posts have touched on some issues related to Reporting Services and XML transforms. Now I'll go back and put the pieces together, flesh in some more detail, and try to give a coherent picture of what I was trying to accomplish and how it worked out. Doing so will require a sub-series of posts, call them parts 3.x to the "RS and XSLT" series.
Problem: A customer has asked for a report, in plain ASCII text, that will contain a header record, a bunch of pipe delimited detail records, and a trailer record. Reporting Services' subscription capabilities are ideal for the report delivery, but does not have any built-in way to support this kind of output. One can use CSV export, but:
Problem: you try to deploy your xslt file from Visual Studio, and get an error saying "Value for the parameter 'MimeType' is not specified. it is either missing from the function call, or it is set to null".
Solution: In Solution Explorer, click on the xsl file. Then switch to the Properties pane and enter "text/xml" as the MimeType. Note: this is not required when deploying the xsl through Report Manager's upload button.
It was driving me nuts — my transforms just wouldn't apply. I tried working with some fake data, from my little-used O'Reilly XML in a Nutshell, and that worked fine. So why couldn't I transform my Reporting Services output? After banging my head against this one for a while, I finally decided to mess around with the root <Report ... /> node, first by removing all the extra elements (because my samples did not have any elements in the root node). Voilà, the transform now works. Why is that?
Problem: periodically, one of my SSIS packages was throwing an error saying "The
buffer manager cannot create a temporary storage file on any path in the BufferTempStoragePath
property. There is an incorrect file name or no permission." The package in question then
would hang, locking a file that it was trying to import.
I was looking at a query today that has an inline expression in it, something similar to
CASE WHEN myTable.myColumn < 5 THEN NULL ELSE myTable.myColumn END
This particular piece of business logic is used in many different places (well, not literally, since I made up a fake example), so I created a UDF to simplify the queries that use this statement. Suppose that UDF is called dbo.fnNulifyMyColumn.