2 Stimmen

Das Schreiben einer SQLServer-Benutzerdefinierten Funktion in C#

Ich habe Schwierigkeiten, viele Informationen zu diesem Thema zu finden, deshalb frage ich mich, ob jemand von euch mich aufklären kann.

Grundsätzlich habe ich eine Minianwendung in C# geschrieben, die einen String akzeptiert, einige Manipulationen daran durchführt und dann das Ergebnis zurückgibt. Jetzt möchte ich diese Funktion in SQLServer erstellen, damit ich sie leicht auf Datensätzen in meinen Tabellen ausführen kann.

Ich weiß, wie man SQLServer-UDFs in C# erstellt und ausführt (d.h. die .dll in SQLServer registriert, bevor man eine Funktion dafür erstellt), aber ich kann scheinbar keine Ausgabe von meinen Funktionen erhalten. Wenn mein C#-Funktion zum Beispiel so aussieht...

using System;
using Microsoft.SqlServer.Server;

public static class MyClrUdfClass
{
    [SqlFunction]
    public static string HelloWorld(string myString)
    {
        return (myString);
    }
}

Und ich es in SQLServer so ausführe...

USE [AdventureWorksDW2008R2]
GO
EXEC [dbo].HelloWorld'Hello World, this is my string!'
GO

Die einzige Ausgabe, die ich in SQLServer erhalte, wenn ich die Funktion ausführe, ist "Befehl erfolgreich abgeschlossen". Also, wo ist myString? Ich erwarte, dass etwas SQL benötigt wird, um das Ergebnis tatsächlich auszugeben, bin mir aber nicht sicher.

Dies hat wahrscheinlich eine sehr einfache Lösung, aber wie ich bereits erwähnte, habe ich wirklich Schwierigkeiten, hilfreiche Informationen dazu zu finden.

4voto

Sebastian Piu Punkte 7608

Sie fehlen die Klammern:

SELECT [dbo].HelloWorld ('Hallo Welt, das ist mein String!')

oder versuchen Sie es auf diese Weise:

declare @a varchar(max)
exec @a = [dbo].HelloWorld 'Hallo Welt, das ist mein String!' 
print @a

0voto

Hast du es versucht:

VERWENDE [AdventureWorksDW2008R2]
GEHE
wähle [dbo].HelloWorld('Hallo Welt, das ist mein String!')
GEHE

?

-1voto

RonSanderson Punkte 41

"Sie haben die Klammer vergessen"

Ich denke, das ist irreführend. Das Beispiel zeigt sowohl die parenthetische als auch die nicht-parenthetische Methode, die Funktion aufzurufen.

Der eigentliche Punkt ist, dass die Ausgabe nie einer Variable zugewiesen wurde und daher verworfen wurde, wie in diesem Beispiel gezeigt.

EXEC [dbo].HelloWorld 'Hallo Welt, das ist mein String!'

Indem das Wort SELECT vor dem Funktionsaufruf hinzugefügt wird oder indem es einer Variablen zugewiesen wird (wie in "exec @a ="), wird der zurückgegebene Wert des Funktionsaufrufs einer lokalen Variablen zugewiesen und steht zur Verwendung durch den aufrufenden Code zur Verfügung. (Im Falle der SELECT-Variante wird die lokale Variable hinter den Kulissen erstellt und dann intern vom Abfrage-Editor verwendet, damit das Ergebnis angezeigt werden kann.)

Der Funktionsaufruf hat die ganze Zeit funktioniert, aber der Code-Schnipsel hat nichts getan, um die Ausgabe davon zu erfassen.

(Entschuldigung, dass ich das nicht als Kommentar unter Sebastians Antwort posten konnte, aber ich habe nicht genug Reputationpunkte, um das zu tun.)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X