Supongamos que tengo un procedimiento almacenado que está duplicado, con algunas modificaciones, en varias bases de datos. Y quiero hacer referencia a la base de datos en la que se almacena el procedimiento almacenado, incluso si se ejecuta en otra base de datos.
¿Hay alguna manera de recuperar la ruta completa (..) o recuperar la base de datos en la que se almacena el procedimiento almacenado, en lugar de la base de datos actual?
sql-server
stored-procedures
Jim Clark
fuente
fuente
Respuestas:
Simplemente use nombres de una o dos partes en el procedimiento almacenado, y hará referencia a objetos en la base de datos que contiene el procedimiento almacenado. En particular,
Para SQL estático en un procedimiento almacenado:
Los nombres de objetos no calificados se resolverán en relación con el esquema que contiene el procedimiento almacenado.
Los nombres de dos partes se resolverán en relación con la base de datos que contiene el procedimiento almacenado.
Para SQL dinámico en un procedimiento almacenado:
Los nombres de objetos no calificados se resolverán en relación con el esquema predeterminado de la identidad del usuario que ejecuta el procedimiento almacenado (de forma predeterminada, la persona que llama).
Los nombres de dos partes se resolverán en relación con la base de datos que contiene el procedimiento almacenado.
La función db_name () devolverá el nombre de la base de datos que contiene el procedimiento almacenado en ambos casos.
fuente
Aquí hay un ejemplo rápido que reuní mostrando funciones comunes utilizadas para acercarse a lo que está buscando.
fuente
Agregando a la excelente respuesta de David Browne :
Estás de suerte porque así es como los procedimientos regulares / permanentes, no almacenados en el sistema, ya funcionan de esta manera, y en realidad debes hacer todo lo posible para que los objetos funcionen en la base de datos actual. Así es como funcionan las funciones también, es solo que con los procedimientos almacenados, tiene opciones, marcándolas como "procedimientos almacenados del sistema" o creando procedimientos almacenados temporales, que no tiene con funciones / vistas / disparadores / etc.
Debido a que las funciones integradas se comportan de manera ligeramente diferente que el SQL estático en los procedimientos almacenados temporales, el siguiente ejemplo usa una tabla no temporal para hacer referencia tanto en UDF como en Inline-TVF. Es cierto que el siguiente ejemplo en realidad no prueba los procedimientos almacenados temporales, pero la razón por la que utilicé la tabla no temporal es porque, dado que tenemos una instancia de comportamiento diferente, debemos asegurarnos de que tal comportamiento no ocurra aquí. En el siguiente ejemplo, si cualquier tipo de función conocía la base de datos "actual", entonces la referencia a la tabla no temporal causaría un error.
PREPARAR
PRUEBA
fuente