I created some sample content and then running a full index of my farm. SharePoint was able to discover some new Crawled Properties during this process, which I was hoping to turn into Managed Properies. However, when clicking on any of the new Crawled Properties, I get an error "Unable to cast object of type 'System.DBNull' to type 'System.String'":
Using my newly working SharePoint logs, I found the following error message:
SchemaDatabase.GetSamples:Error occurred when reading [SampleUrl] System.InvalidCastException: Unable to cast object of type 'System.DBNull' to type 'System.String'. at Microsoft.Office.Server.Search.Administration.SchemaDatabase.GetSamples(CrawledProperty crawledProperty, Int32 sampleCount)
I then opened up Reflector to find what was going on in that method. It turns out to be a very simple method that just calls a stored procedure. I fired up SQL Server Profiler and tracked down this call, which ultimately was breaking the page:
exec dbo.proc_MSS_GetCrawledPropertySamplesByPropertyID @CrawledPropertyId=334,@SampleCount=5
So, as it turns out, this SProc does handle NULLs, just not as robustly as we might want! Here is the SProc, which I found in the Search_Service_Application_PropertyStoreDB_{GUID} database:
CREATE PROCEDURE dbo.proc_MSS_GetCrawledPropertySamplesByPropertyID @CrawledPropertyId int, @SampleCount int AS set RowCount @SampleCount SELECT ( DP.strVal + ISNULL(cast(DP.strVal2 AS nvarchar(2000)), '') ) as 'SampleURL' FROM dbo.MSSDocProps as DP INNER JOIN dbo.MSSCrawledPropSamples as CPS on CPS.DocId = DP.DocId WHERE CPS.CrawledPropertyId = @CrawledPropertyId AND DP.Pid = 7 ORDER BY DP.strVal set RowCount 0
Normally I wouldn't dream of altering a SharePoint SProc, but seeing as we are still in beta and I'm approaching a deadline, I decided to make a slight adjustment:
alter PROCEDURE dbo.proc_MSS_GetCrawledPropertySamplesByPropertyID @CrawledPropertyId int, @SampleCount int AS set RowCount @SampleCount SELECT ( ISNULL(DP.strVal,'') + ISNULL(cast(DP.strVal2 AS nvarchar(2000)), '') ) as 'SampleURL' FROM dbo.MSSDocProps as DP INNER JOIN dbo.MSSCrawledPropSamples as CPS on CPS.DocId = DP.DocId WHERE CPS.CrawledPropertyId = @CrawledPropertyId AND DP.Pid = 7 ORDER BY DP.strVal set RowCount 0
Now, when clicking on my Crawled Property, I get a proper page:
No comments:
Post a Comment