2011-01-15 2 views
12

Ich muss einige Berechtigungen falsch haben, aber ich kann nicht herausfinden, wie. Der folgende Code wird vereinfacht, aber ich kann nicht einmal das ich will nur in der Lage, die Funktion aus einer gespeicherten Prozedur aufzurufenSQLServer kann meine benutzerdefinierte Funktion Funktion in gespeicherten Prozedur nicht finden

CREATE FUNCTION ufTest 
(
    @myParm int 
) 
RETURNS int 
AS 
BEGIN 
    DECLARE @Result int 

    SELECT @Result = @myParm + 1 

    RETURN @Result 
END 
GO 

Dann an die Arbeit:

CREATE PROCEDURE dbo.[uspGetGroupProfileService] 
@id  int 
AS 
BEGIN 
    SET NOCOUNT ON; 
    DECLARE @otherId int; 
    SET @otherId = dbo.ufTest(@id); 
END 

SQLServer hält mir zu sagen, dass Es kann dbo.ufTest nicht finden. Es erscheint unter [DB] \ Programmability \ Functions \ Scalar-valued Functions, aber ich kann nicht herausfinden, wie man es benutzt.

Hat jemand eine Idee, was ich falsch mache?

+1

Sind Sie sicher, dass es im 'dbo' Schema erstellt wird? Es wird in das eingefügt, was dein Standardschema ist. –

+0

Was passiert, wenn Sie versuchen, den Code vom SP selbst als Stapel auszuführen (mit einem fest codierten Wert oder was auch immer)? –

+0

Der gespeicherte Proc läuft einwandfrei. Ich habe nur einen Code in vielen verschiedenen gespeicherten Procs, die ich in eine Funktion verschieben möchte. Das sollte wirklich nicht so schwer sein. Ich fange an zu denken, dass es etwas falsch mit der Installation ist –

Antwort

10

Funktioniert für mich.

Versuchen CREATE FUNCTION dbo.ufTest ...

ich Ihr Standardschema übernehmen nicht dbo sein kann und es in einem anderen Schema endet. Ansonsten ist die einzige Erklärung, die ich mir vorstellen kann, dass Sie möglicherweise Berechtigungen dafür erteilen müssen.

+1

+1: Arbeitet auch 2005 für mich. Wenn die Prozedur in einer anderen Datenbank erstellt wird, benötigt die Funktion drei Namen, um ordnungsgemäß referenziert zu werden. –

+0

Kein Würfel. Wenn Sie das Ende meines ursprünglichen Posts bemerken. Es wird unter der richtigen Datenbank in Management Studio angezeigt. –

+3

Können Sie mit der rechten Maustaste auf die Skalarfunktion in SSMS unter dem Konto klicken, das Sie zum Erstellen dieser Objekte verwenden, wählen Sie "script function as select to ..." Geben Sie den Parameterwert ein und führen Sie ihn eigenständig aus? Wenn ja, können Sie es von der gespeicherten Prozedur in SSMS unter demselben Konto ausführen? Wenn ja und das Problem in Ihrer Anwendung ist, müssen Sie tun, GRANT EXECUTE ON [dbo]. [UFTEST] 'TO' [Benutzername] 'auch Sie gehen nicht nur aus was Intellisense Ansprüche? –

3

Skript aus der UDF und überprüfen Sie den Schemanamen. Es ist wahrscheinlich nicht dbo. Ich würde die UDF-Definition ändern, um spezifisch dbo einzuschließen. Mit anderen Worten:

CREATE FUNCTION dbo.ufTest 
+0

Es wurde als dbo.ufTest erstellt, aber ich habe versucht, es zu addieren und immer noch keine Würfel. –

0

Versuchen Sie es mit einem Select anstelle eines Satzes aufrufen. Und Sie haben überprüft, dass das zum dbo-Schema gehört?

+0

Versuchte den Auswahltrick auch, aber das ist wirklich nur angemessen, wenn Sie eine Tabelle –

+0

zurückgeben oder wenn Sie mehrere Werte auf einmal zuweisen, oder wenn Sie eine where-Klausel verwenden oder innerhalb einer Funktion namens ufTest;) Aber abgesehen davon behandelt es null Werte anders, die Ihr Fall verwendet, also war einen Versuch wert. Du hast dort ein verrücktes, nicht reproduzierbares Problem, viel Glück! – Malk

+0

Was genau meinen Sie damit, wenn Sie mehrere Werte zuweisen? Mehrfache Argumente? Tatsächlich stellte sich heraus, dass nur SSMS einen falschen Fehler im Abfrage-Editor gab, also habe ich nie versucht, es auszuführen. –

0

Es scheint, es könnte ein Fehler im Abfrageeditor sein. Die Funktion wird in der Baumstruktur an der richtigen Stelle angezeigt, aber selbst wenn Sie die Funktion dbo.xxxxxx benennen, wird die Funktion erst im Abfrageeditor angezeigt, wenn Sie eine neue Sitzung schließen und öffnen. Anschließend wird sie angezeigt, wenn Sie dbo eingeben.

Wenn Sie den Namen der Funktion ändern, ist die alte nicht existierende Funktion verfügbar, aber nicht der neue Name. Aktualisieren behebt das nicht nur das Schließen der Sitzung und das Starten einer neuen Sitzung.

Warum ich sage, dass dies möglicherweise ein Fehler ist, ist, dass die Berechtigungen -Eigenschaften für die Tabellenfunktion einen blauen Link zu den Schemaeigenschaften enthält, aber die Scalar-Funktionen nicht. Es könnte also ein tiefer liegender Fehler in der Art und Weise sein, in der das Schema an erster Stelle aufgestellt wird, für die es möglicherweise eine Arbeit gibt. Oder vielleicht ist das Schema in der Datenbank, an der ich arbeite, nicht korrekt eingerichtet.

Hoffentlich kann jemand anderes etwas Licht in dieses Thema bringen.

0

Hatte das genau gleiche Problem und mir wurde behoben, indem Sie einfach SQL Server Management Studio neu starten.

Einfach nur posten, falls jemand anderes alles richtig gemacht hat und immer noch nicht in der Lage ist, seine Funktion anzurufen.

0

Als letztes Resort, wenn eine der oben genannten und besonders @ jrdev22 Antwort hat dir nicht helfen (und links, warum stapfst), den SQL Server Dienst in Configuration Manager neu starten, da die SSMS Neustart allein manchmal nicht nicht zurück alles (z. B. beim Erstellen einer neuen Login-Instanz, aber nicht beim Login).

SQL Server Configuration Manager> SQL Server Services > SQL Server > Restart 
0

Wenn Sie nicht in der Lage sind, die Funktion zu finden, die Sie gerade erstellt haben, gibt es zwei Gründe.

  1. Sie verwenden den falschen Funktionsnamen, den Sie hinzufügen müssen, um dbo.function name zu erhalten.
  2. Ich habe auch ein weiteres Problem gefunden, obwohl der korrekte Name eingegeben wurde und auch im Objekt Explorer nach der Aktualisierung vorhanden ist, können Sie es nicht finden, wenn Sie versuchen, die Funktion zu verwenden.

In diesem Fall schließen Sie einfach den SQL-Server und öffnen Sie es erneut, und Sie sollten in der Lage sein, die Funktion zu sehen.

Verwandte Themen