Analysis Services has a built in member for each dimension called (by default) “Unknown.” This is to simplify the process of dealing with facts that have the property of Unknown for a particular dimension. If a dimension member comes to the fact table after failing a lookup in the SSIS package and contains a null for the surrogate key, Analysis Services assigns it to this special Unknown Member and moves forward.
There are three steps to this situation. First, the dimension itself has a property called UnknownMember that describes the usage of this unknown member. It can be set to Visible, Hidden, or None. Next, the dimension member set with the usage of Key has a property called NullProcessing that is set to UnknownMember. This tells the dimension what to do in case of coming across a null surrogate key in the fact table. Third, in the Dimension Usage screen of the cube, for each dimension in use, there is a setting under Advanced that once again describes NullProcessing. This also can be set to describe behavior when processing a null dimension surrogate key. Here is a link to a description of all the options. This is a reference to Analysis Services Scripting, but it was the only place I could find these options described. http://msdn.microsoft.com/en-us/library/ms127041.aspx
I think that this unknown member is a very convenient inclusion by the Analysis Services team, but I think I’ll pass on using it. There is some syntactic sugar in MDX that allows the usage of a member called UNKNOWNMEMBER that seems nice, but what this scenario does not allow is an unknown member in the relational store. If you don’t ever plan on querying the relational store, then the only place you will need an unknown member will be Analysis Services. You can then pass unknown members to the fact table as null and allow AS to process accordingly.
I like to leave the relational store in as query-able state as possible. Report writers might later have a reason to use it and having null in the fact table for surrogate keys will cause problems. Report writers will have to use LEFT JOIN and then derive an unknown member at query time.
I think in this situation, creating an unknown member in the dimension with a surrogate key of 1, 0, or -1 (a special number of your choosing) is a good solution.
You’ll have to go and turn off the unknown member in the dimension, change NullProcessing in the key attribute for the dimension and change NullProcessing in the dimension usage of the cube to enable it. But I think you’ll find that this is a good compromise when the relational store needs to be as query-able as possible.