2011-01-15 20 views
12

Debo tener algunos permisos incorrectos, pero no puedo entender cómo. El siguiente código se simplifica, sino que ni siquiera puede conseguir que esto funcioneSQLServer no puede encontrar mi función definida por el usuario en el procedimiento almacenado

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

    SELECT @Result = @myParm + 1 

    RETURN @Result 
END 
GO 

Entonces yo sólo quiero ser capaz de llamar a la función de un procedimiento almacenado:

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

SQLServer me dice que no puede encontrar dbo.ufTest. Se muestra en [DB] \ Programmability \ Functions \ Scalar-Valoured Functions pero no entiendo cómo usarlo.

¿Alguien tiene alguna idea de lo que estoy haciendo mal?

+1

¿Estás seguro de que se está creando en el esquema 'dbo'? Se pondrá en cualquiera que sea su esquema predeterminado. –

+0

¿Qué sucede cuando intenta ejecutar el código del SP por sí mismo como un lote (con un valor codificado o lo que sea)? –

+0

El proceso almacenado funciona bien. Solo tengo un código en muchos procs almacenados diferentes que quiero mover a una función. Esto realmente no debería ser tan difícil. Estoy empezando a pensar que es algo malo con la instalación –

Respuesta

10

Funciona para mí.

Trate CREATE FUNCTION dbo.ufTest ...

Asumo el esquema por defecto no puede ser dbo y se está terminando en un esquema diferente. De lo contrario, la única explicación que puedo pensar es que podría necesitar otorgarle permisos.

+1

+1: También funciona en 2005 para mí. Si el procedimiento se crea en una base de datos diferente, la función necesitará la notación de tres nombres para que se haga referencia a ella correctamente. –

+0

Sin dados. Si notas el final de mi publicación original. Se muestra bajo la base de datos adecuada en Management Studio. –

+3

¿Puede hacer clic con el botón derecho en la función escalar en SSMS debajo de la cuenta que usa para crear estos objetos, elegir "función de guión como seleccionar para ..." Rellenar el valor del parámetro y ejecutarlo de forma independiente? En caso afirmativo, ¿puede ejecutarlo desde el procedimiento almacenado en SSMS bajo esa misma cuenta? Si es así y el problema está en su aplicación, tendrá que hacer 'GRANT EXECUTE ON [dbo]. [UfTest]' TO '[username]' ¿no está simplemente saliendo de lo que Intellisense afirma? –

3

Escriba el UDF y compruebe el nombre del esquema. Probablemente no sea dbo. Cambiaría la definición UDF para incluir específicamente dbo. En otras palabras:

CREATE FUNCTION dbo.ufTest 
+0

Fue creado como dbo.ufTest, pero intenté agregarlo y todavía no hay dados. –

0

Intente llamarlo con un seleccionar en lugar de un conjunto. ¿Y has comprobado que pertenece al esquema dbo?

+0

Probé el truco de selección también, pero eso solo es apropiado si devuelve una Tabla –

+0

O al asignar múltiples valores a la vez o cuando usa una cláusula where o cuando está dentro de una función llamada ufTest;) Pero aparte de eso, maneja null valores de manera diferente que su caso está utilizando, así que valió la pena intentarlo. Tienes un loco problema no replicable allí, ¡mucha suerte! – Malk

+0

¿Qué quiere decir exactamente al asignar valores múltiples? ¿Múltiples argumentos de salida? En realidad, resultó que solo SSMS daba un error falso en el editor de consultas, por lo que nunca intenté ejecutarlo. –

0

Parece que podría ser un error en el editor de consultas. La función aparece en el árbol en el lugar correcto, pero incluso nombrando la función dbo.xxxxxx, la función no aparece en el editor de consultas hasta que cierre y abra una nueva sesión, y luego aparece si escribe dbo.

Si cambia el nombre de la función, la antigua función no existente está disponible, pero no el nuevo nombre. Actualizar no soluciona esto solo al cerrar la sesión y comenzar una nueva.

Por qué digo que esto podría ser un error es que las propiedades de permisos para la función de tabla incluyen un enlace azul a las propiedades del esquema, pero las funciones escalares no lo hacen. Por lo tanto, puede ser un error de mentira más profundo en la forma en que se establece el esquema en primer lugar para el cual puede haber un trabajo alternativo. O tal vez el esquema en la base de datos en que estoy trabajando no se haya configurado correctamente.

Esperemos que alguien más pueda arrojar algo de luz sobre este tema.

0

Tuve exactamente el mismo problema y el mío se solucionó simplemente reiniciando SQL Server Management Studio.

Solo publicando esto en caso de que alguien más haya hecho todo bien y todavía no pueda llamar a su función.

0

Como último complejo si cualquiera de los anteriores y especialmente @ respuesta de jrdev22 no le sirvió de nada (y dejó que ni idea de por qué), reinicie el servidor SQL Server servicio en Configuration Manager ya reiniciar el SSMS solas, a veces no se restablece todo (por ejemplo, similar a cuando se crea una nueva instancia de inicio de sesión pero no se puede iniciar sesión con ella).

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

Si no puede encontrar la función que acaba de crear, hay dos razones para ello.

  1. Si está utilizando el nombre de función incorrecto, necesita agregar dbo.function name para obtenerlo.
  2. También he encontrado un problema más, aunque se haya ingresado el nombre correcto y también existe en el explorador de objetos después de la actualización, no puede encontrarlo cuando está tratando de usar la función.

En este caso simplemente cierre el servidor sql y vuélvalo a abrir y debería poder ver la función.

Cuestiones relacionadas