Ich habe eine benutzerdefinierte Funktion in SQL Server (in .NET geschrieben), die Text bereinigt. Ich frage mich, wie man mit Null-Eingaben umgehen kann. HierSQL Server - Umgang mit Null-Eingabe in benutzerdefinierten CLR-Funktion (UDF) mit OnNullCall
ist die Funktion in C#:
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlChars cleanEstActText(SqlChars input)
{
SqlChars cascadingSqlChar = removeNBSP(input);
cascadingSqlChar = optimizeFontTags(cascadingSqlChar);
return cascadingSqlChar;
}
Dies ist der Fehler in SQL, wenn die Funktion jede Null-Daten bekommt:
A .NET Framework error occurred during execution of user-defined routine or aggregate "removeNBSP":
System.Data.SqlTypes.SqlNullValueException: Data is Null. This method or property cannot be called on Null values.
System.Data.SqlTypes.SqlNullValueException:
at System.Data.SqlTypes.SqlChars.get_Value()
at UserDefinedFunctions.removeNBSP(SqlChars input)
Lesen auf SO und Google führte mich zum OnNullCall Attribut Das sieht vielversprechend aus.
Von MSDN:
true, wenn die Methode aufgerufen wird, wenn null (Nothing in Visual Basic) Eingabeargumente in dem Methodenaufruf angegeben werden; false, wenn die Methode einen NULL-Wert (Nothing in Visual Basic) zurückgibt, wenn einer ihrer Eingabeparameter null ist (Nothing in Visual Basic).
Klingt genau wie, was ich will; Wenn ich null bekomme, pass einfach null durch. Ich bin mir nicht ganz sicher, wie ich es implementieren soll, also überprüfe ich MSDN erneut (http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.server.sqlmethodattribute.aspx), und überschreibe die erste Zeile von meine Funktion von
[Microsoft.SqlServer.Server.SqlFunction]
zu
[Microsoft.SqlServer.Server.SqlMethod(OnNullCall = false, IsMutator = false, InvokeIfReceiverIsNull = false)]
Wenn ich das tue, ich erhalte eine Fehlermeldung in SQL jedes Mal, wenn ich es verwenden:
Cannot find either column "dbo" or the user-defined function or aggregate "dbo.cleanEstActText", or the name is ambiguous.
Bin ich falsch Umsetzung OnNullCall? Sollte ich etwas anderes machen? Gibt es wirklich einen guten Weg, um meine Funktion durch Null gehen zu lassen?
Bei den beiden oben genannten Lösungen handelt es sich lediglich um Problemumgehungen, die das Problem nicht beheben. Haris Antwort ist die richtige. – alphadogg
@alphadogg und Hari, das ist tatsächlich _not_ die richtige Antwort. Zumindest nicht im Zusammenhang mit der Frage. Es ist nur die richtige Antwort, wenn mehrere Eingabeparameter vorhanden sind und mindestens einer von ihnen einen NULL-Wert gültig übergeben kann. Andernfalls sollten Sie 'WITH RETURNS NULL ON NULL INPUT' in der' CREATE FUNCTION' verwenden, wie in meiner Antwort beschrieben. –