Folgender Fall… Eine Liste mit sehr vielen Spalten (Grenzwerte für die max. Anzahl von Spalten je Datentyp werden eingehalten; ebenso der Grenzwert für die Anzahl zulässiger Lookup-Spalten). Soweit so gut… Jetzt kommt man irgendwann auf die Idee, die Spalten-Anzahl innerhalb der Liste zu reduzieren und entfernt diverse Felder. Lesende Zugriffe funktionieren nach wie vor… ebenso auch das Update von vorhandenen Listeneinträgen. Wenn man allerdings einen neuen Listeneintrag hinzufügen will, krachts und man findet in etwa folgende Einträge im Log:
Critical Unknown SQL Exception 515 occurred. Additional error information from SQL Server is included below. Der Wert NULL kann in die tp_DocId-Spalte, dbo.AllUserData-Tabelle nicht eingefügt werden. Die Spalte lässt NULL-Werte nicht zu. Fehler bei INSERT. Die Anweisung wurde beendet.
System.Runtime.InteropServices.COMException: Exception from HRESULT: 0x80131904 at Microsoft.SharePoint.Library.SPRequestInternalClass.AddOrUpdateItem…
In den meisten Fällen verweist der Error-Code „0x80131904“ auf Speicherknappheit innerhalb der Content-Datenbank. Ganz so einfach ist das Ganze dann hier allerdings nicht…
Entscheidend ist der vorangegangene Fehler innerhalb des SQL-Servers („Der Wert NULL kann in die tp_DocId-Spalte, dbo.AllUserData-Tabelle nicht eingefügt werden.“).
In SharePoint werden die Inhalte aller Listen innerhalb der gleichen Tabelle in der Content-DB („AllUserData“) speichert. Bei einer Liste, die sehr viele Spalten enthält wird ein einzelner Listeneintrag allerdings auf mehrere Zeilen innerhalb dieser Content-DB-Tabelle verteilt. Welche Listenspalte dabei in welche Zeile in der Content-DB-Tabelle geschrieben wird, entscheidet der Parameter „RowOrdinal“ (standardmäßig „0“) der jeweiligen Listenspalte. Entscheidend hierbei ist, das innerhalb der Listendefinition die erste Spalte immer einen „RowOrdinal=0″ haben muss. Ist dies nicht der Fall, kommt es zu o.g. Fehlermeldung. So eine Konstellation kann leider entstehen, wenn aus einer Liste mit einer hohen Anzahl von Spalten (d.h. es sind Spalten mit RowOrdinal>0 enthalten) mehrere Spalten wieder gelöscht werden und dadurch die erste Spalte in der Listendefinition einen RowOrdinal>0 behält. Nachzuvollziehen ist das Ganze entweder über den SharePoint-Manager (dieser kann allerdings nur auf einem der Farm-Server genutzt werden), oder aber indem man die Liste als Vorlage speichert, das dadurch erzeugte „.stp“-File aus dem Listenvorlagen-Katalog herunter lädt, in „.cab“ umbenennt und sich die Manifest.xml anschaut.
Hier hilft nur, die Spaltenreihenfolge innerhalb der Listen-Konfiguration anzupassen, sodass die erste Spalte unbedingt einen RowOrdinal-Value von „0“ hat oder aber die „führenden“ Spalten mit RowOrdinal>0 zu entfernen und neu anzulegen. Was sagt uns das? Für „BigData“ ist SharePoint nicht wirklich geeignet… das gilt sowohl für die Listenbreite als auch für die Anzahl der Listeneinträge.