2011-01-15 10 views
12

Devo avere alcune autorizzazioni errate, ma non riesco a capire come. Il seguente codice è semplificato, ma non può nemmeno arrivare a questo lavoroSQLServer non trova la funzione funzione definita dall'utente nella procedura memorizzata

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

    SELECT @Result = @myParm + 1 

    RETURN @Result 
END 
GO 

Poi voglio solo essere in grado di chiamare la funzione da una stored procedure:

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

SQLServer continua a dirmi che non riesce a trovare dbo.ufTest. Si presenta sotto [DB] \ Programmabilità \ Funzioni \ Funzioni scalari ma non riesco a capire come usarlo.

Qualcuno ha idea di cosa sto facendo male?

+1

Sei sicuro che sia stato creato nello schema 'dbo'? Verrà inserito in qualunque sia lo schema predefinito. –

+0

Cosa succede quando si tenta di eseguire il codice dall'SP da solo come batch (con un valore hardcoded o altro)? –

+0

Il proc memorizzato viene eseguito correttamente. Ho solo un po 'di codice in un sacco di diversi stored process che voglio passare a una funzione. Questo non dovrebbe essere così difficile. Sto iniziando a pensare che sia qualcosa di sbagliato con l'installazione –

risposta

10

Lavori per me.

Prova CREATE FUNCTION dbo.ufTest ...

Presumo lo schema di default non può essere dbo e sta finendo in uno schema diverso. Altrimenti, l'unica spiegazione che posso pensare è che potrebbe essere necessario concedere le autorizzazioni su di esso.

+1

+1: funziona anche per il 2005. Se la procedura viene creata in un altro database, la funzione avrà bisogno di tre notazioni di nomi per essere referenziate correttamente. –

+0

Nessun dado. Se noti la fine del mio post originale. Viene mostrato sotto il database corretto in Management Studio. –

+3

Puoi fare clic con il tasto destro sulla funzione scalare in SSMS sotto l'account che utilizzi per creare questi oggetti, scegliere "funzione di script come seleziona per ...". Compila il valore del parametro ed eseguilo da solo? Se sì, è possibile eseguirlo dalla stored procedure in SSMS con lo stesso account? Se Sì e il problema è nella tua applicazione, dovrai eseguire 'GRANT EXECUTE ON [dbo]. [UfTest]' TO '[username]' Inoltre non stai semplicemente andando fuori ciò che sostiene l'intellisense? –

3

Script l'UDF e controllare il nome dello schema. Probabilmente non è un dbo. Vorrei cambiare la definizione UDF per includere specificamente dbo. In altre parole:

CREATE FUNCTION dbo.ufTest 
+0

E 'stato creato come dbo.ufTest, ma ho provato ad aggiungerlo e ancora nessun dado. –

0

Provare a chiamarlo con una selezione anziché un set. E hai controllato che appartiene allo schema dbo?

+0

Provato anche il trucco di selezione, ma questo è davvero appropriato solo se stai restituendo una tabella –

+0

Oppure quando assegni più valori contemporaneamente o quando usi una clausola where o all'interno di una funzione chiamata ufTest;) Ma a parte questo gestisce null valori diversi che il tuo caso sta usando, quindi valeva la pena sparare. Hai un pazzo problema non replicabile lì, buona fortuna! – Malk

+0

Cosa intendi esattamente assegnando più valori? Argomenti multipli? In realtà si è scoperto che era solo SSMS a dare un falso errore nell'editor di query, quindi non ho mai provato a farlo funzionare. –

0

Sembra che potrebbe essere un bug nell'editor di query. La funzione viene visualizzata nell'albero nel punto giusto, ma anche nominando la funzione dbo.xxxxxx la funzione non viene visualizzata nell'editor delle query finché non si chiude e si apre una nuova sessione, quindi viene visualizzata se si digita dbo.

Se si modifica il nome della funzione, la vecchia funzione non esistente è disponibile ma non il nuovo nome. L'aggiornamento non risolve questo solo chiudendo la sessione e iniziando una nuova.

Perché dico che questo potrebbe essere un bug è che le proprietà delle autorizzazioni per la funzione Tabella includono un collegamento blu alle proprietà dello schema ma le funzioni scalari non lo fanno. Quindi potrebbe essere un insetto bug più profondo nel modo in cui lo schema è impostato in primo luogo per il quale potrebbe esserci un problema. O forse lo schema nel database su cui sto lavorando non è stato impostato correttamente.

Speriamo che qualcun altro possa far luce su questo problema.

0

Lo stesso identico problema e il problema sono stati risolti semplicemente riavviando SQL Server Management Studio.

Pubblicare questo nel caso in cui qualcun altro ha fatto tutto bene e non è ancora in grado di chiamare la sua funzione.

0

Come ultima resort se una di queste e, in particolare @ risposta di jrdev22 non ha aiutato voi (e di sinistra si perplessi perché), riavviare il server SQL servizio in Configuration Manager dal riavvio dei SSMS da solo a volte non si ripristina tutto (ad esempio, simile a quando si crea una nuova istanza di accesso ma non è possibile accedere con esso).

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

Se non si riesce a trovare la funzione che avete appena creato ci sono due ragioni per questo.

  1. si sta utilizzando il nome della funzione errata è necessario aggiungere nome dbo.function per ottenerlo.
  2. Ho anche trovato un altro problema come anche se è stato immesso il nome corretto ed è già presente nell'Explorer oggetti dopo l'aggiornamento non è possibile trovarlo quando si sta tentando di utilizzare la funzione.

In questo caso basta chiudere il server sql e riaprirlo e si dovrebbe essere in grado di vedere la funzione.

Problemi correlati