¿Obtener el nombre del procedimiento almacenado actual?

¿Obtener el nombre del procedimiento almacenado actual?

Dentro de mis procedimientos almacenados, siempre tengo una línea de comentarios para probar mi procedimiento almacenado:

/*
EXEC [schema].[uspNameOfSP]
*/

Quiero simplificar esto un poco, para poder copiarlo y pegarlo en otros procedimientos almacenados sin tener que cambiar el nombre cada vez. Quiero hacer algo como esto:

/*
EXEC @thisStoredProceduresName
*/

¿Es posible algo así?

Mostrar la mejor respuesta

Sugerencia: es útil etiquetar las preguntas de la base de datos con el software apropiado (MySQL, Oracle, DB2, ...) y la versión, p. sql-server-2014. Las diferencias en la sintaxis y las características a menudo afectan las respuestas. Tenga en cuenta que tsql reduce las opciones, pero no especifica la base de datos.

@HABO Agregó la versión.

¿No sería más fácil tener todas sus declaraciones EXEC en un archivo .sql separado, resaltar la que desea y presionar F5?

@MatSnow eso realmente no funcionará y no estoy de acuerdo con que sea un duplicado. El OP quiere que el nombre aparezca automáticamente dentro del cuerpo del procedimiento almacenado en reposo, no en la salida cuando se ejecuta el procedimiento.

Si entiendo lo que quiere decir, que desea que la llamada ejecutiva comentada se coloque en el cuerpo de cada procedimiento almacenado, podría usar un desencadenador DDL en el evento CREATE_PROCEDURE, manipular el cuerpo y luego ejecutar un ALTER (y tal vez incorpore una lógica que verifique si el autor del procedimiento almacenado ya colocó ese comentario allí manualmente, evite un doble sello). Pero, ¿cómo es útil esa línea, excepto en el caso de que un procedimiento almacenado tome parámetros cero?

@HardCode Estamos hablando de muchos cientos de procedimientos almacenados en más de 20 bases de datos, en un equipo de unas 10 personas. Es más fácil para nosotros tener la línea de prueba en el propio procedimiento almacenado que mantener una lista extensa de todos los nombres de procedimientos almacenados y sus respectivos parámetros, si los tienen.

@AaronBertrand Otro problema con esa solución: ¿qué sucede si se cambia el nombre del procedimiento almacenado?

@AaronBertrand Está bien, lo tengo.

@noClue, ¿está cambiando su requisito, ahora también necesita la lista de parámetros? Si solo necesita una lista de todos los procedimientos y sus parámetros, puede obtenerla fácilmente en cualquier momento consultando sys.objects y sys.parameters, e incluso creando llamadas de muestra a partir de esto: esto es todo en los metadatos, no tiene que documentar manualmente todo lo que crea.

Los cambios de nombre de @noClue también se pueden manejar a través del activador DDL, pero ¿con qué frecuencia cambia el nombre de las cosas? Encuentro que es más limpio dejar el viejo y crear uno nuevo.

Aparte: Esperemos que los nombres de sus SP no comiencen realmente con el prefijo sp. Eso pertenece a Microsoft.

@HABO Pequeño error tipográfico: p Por lo general, prefijo los nombres con usp.

Ummm.... ¿no son bastante visibles el nombre y todos los parámetros? Está justo ahí después de "Crear procedimiento". Por extraño que parezca, todos los parámetros están justo después de eso. ¿Qué beneficio proporciona tener un comentario en el cuerpo del procedimiento? Toda la información está ahí.

@AaronBertrand Los requisitos no cambiaron, todo lo que quiero es usar una especie de variable para obtener el nombre del procedimiento, por lo que no tengo que agregar manualmente el nombre del procedimiento. Si necesito tener parámetros después es irrelevante. Obviamente, tendría que cambiar ligeramente la línea para incluir los parámetros de prueba en los procedimientos que requieren parámetros, pero aún obtendría el nombre del procedimiento.

@SeanLange Para evitar el molesto trabajo de copiar y pegar. Es más fácil pegar un fragmento de código universal en varios procedimientos que copiar y modificar una línea en cada procedimiento. También quería asegurarme de que la línea de prueba sea correcta incluso si cambia el nombre del procedimiento.

@HABO Creo que quisiste decir sp_, que el OP no usó. Y no pertenece a Microsoft, solo hay un impacto de rendimiento minúsculo si lo usa.

Pero ¿en beneficio de qué? Todavía tienes que copiar y pegar, ¿verdad? Deberá proporcionar valores para los parámetros para probarlo. En serio, estamos hablando de unos segundos de tiempo ahorrado en el mejor de los casos. Y lo que está preguntando es si es posible que el servidor sql cree procedimientos autodocumentados. Este tipo de cosas es increíblemente difícil en tiempo de compilación. Ni siquiera es fácil en tiempo de ejecución. Piense en la reflexión en dotnet. Básicamente, está buscando un reflejo del tiempo de compilación.

@SeanLange Tal vez soy una minoría aquí (probablemente), pero encuentro que mi método es mucho más fácil de hacer y menos propenso a errores. Sí, aún tendría que agregar los parámetros manualmente, pero al menos puedo comenzar con una línea de código que sea universal en todos los procedimientos (si existiera).

No, veo a dónde vas con eso. Pero está buscando un código autodocumentado. Simplemente no veo que esto sea posible.

@SeanLange Ya temía que no existiera, solo quería asegurarme de no perderme nada. Stackoverflow es solo una garantía en este punto.

No puedes.

La razón es que cuando lo ejecuta para probar, solo está seleccionando y ejecutando esa única línea de código, por lo que no es parte de un procedimiento almacenado ni está en él cuando se ejecuta.

Creo que es una mala idea, pero logra lo que estás buscando.

USE some_db;
GO

CREATE PROCEDURE /*EXECUTE */ usp_Proc AS
BEGIN
  SELECT 1;
END

Tenía mis dudas, pero ejecuté la declaración CREATE, luego escribí el proceso y la declaración EXECUTE comentada se atascó.