Tengo un script SQL que debe ejecutarse cada vez que un cliente ejecuta la funcionalidad de "gestión de bases de datos". El script incluye la creación de procedimientos almacenados en la base de datos del cliente. Es posible que algunos de estos clientes ya tengan el procedimiento almacenado al ejecutar el script, y algunos no. Necesito agregar los procedimientos almacenados que faltan a la base de datos del cliente, pero no importa cuánto intente doblar la sintaxis T-SQL, obtengo
CREATE / ALTER PROCEDURE 'debe ser la primera instrucción en un lote de consulta
Lo he leído antes de crear trabajos, pero no me gusta hacerlo de esa manera.
IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'MyProc')
DROP PROCEDURE MyProc
GO
CREATE PROCEDURE MyProc
...
¿Cómo puedo agregar una verificación de la existencia de un procedimiento almacenado y crearlo si no existe, pero modificarlo si existe?
fuente
Respuestas:
Puede ejecutar código de procedimiento en cualquier lugar donde pueda ejecutar una consulta.
Simplemente copie todo después de
AS
:Este código hace exactamente lo mismo que haría un proceso almacenado, pero no se almacena en el lado de la base de datos.
Eso es muy parecido a lo que se llama procedimiento anónimo en
PL/SQL
.Actualizar:
El título de su pregunta es un poco confuso.
Si solo necesita crear un procedimiento si no existe, entonces su código está bien.
Esto es lo que se
SSMS
muestra en el script de creación:Actualizar:
Ejemplo de cómo hacerlo cuando se incluye el esquema:
En el ejemplo anterior, dbo es el esquema.
Actualizar:
En SQL Server 2016+, solo puedes hacer
CREATE OR ALTER PROCEDURE dbo.MyProc
fuente
@astander
: también puede llamar a código anónimo desde los procedimientos almacenados. Para usar su salida en unINSERT
, necesitará usarOPENROWSET
oOPENQUERY
que también funcione con el código anónimo. Por supuesto, hay inconvenientes en el código anónimo: por ejemplo, solo se ejecuta bajo los privilegios de la persona que llama. Mi punto es que es posible, no es la forma preferida de hacer las cosas :)Me doy cuenta de que esto ya se ha marcado como respondido, pero solíamos hacerlo así:
Solo para evitar perder el procedimiento.
fuente
GRANT
declaraciones sean explícitas en el script en caso de que cambien ; así que todavía hay justificación para usar enDROP
lugar deALTER
.Si está buscando la forma más simple de verificar la existencia de un objeto de base de datos antes de eliminarlo, aquí hay una manera (el ejemplo usa un SPROC, al igual que su ejemplo anterior, pero podría modificarse para tablas, índices, etc.):
Esto es rápido y elegante, pero debe asegurarse de tener nombres de objeto únicos en todos los tipos de objetos, ya que no lo tiene en cuenta.
¡Espero que esto ayude!
fuente
Sé que desea "alterar un procedimiento si existe y solo eliminarlo si no existe", pero creo que es más simple simplemente abandonar el procedimiento y volver a crearlo. Aquí le mostramos cómo descartar el procedimiento solo si ya existe:
El segundo parámetro le dice
OBJECT_ID
que solo busque objetos conobject_type = 'P'
, que son procedimientos almacenados:Puede obtener la lista completa de opciones a través de:
fuente
A partir de SQL SERVER 2016 puede usar el nuevo
DROP PROCEDURE IF EXISTS
.DROP { PROC | PROCEDURE } [ IF EXISTS ] { [ schema_name. ] procedure } [ ,...n ]
Referencia: https://msdn.microsoft.com/en-us/library/ms174969.aspx
fuente
Sé que es una publicación muy antigua, pero dado que esto aparece en los principales resultados de búsqueda, por lo tanto, agrego la última actualización para aquellos que usan SQL Server 2016 SP1 :
Esto crea un Procedimiento almacenado si aún no existe, pero lo modifica si existe.
Referencia
fuente
DROP IF EXISTS es una nueva característica de SQL Server 2016
https://blogs.msdn.microsoft.com/sqlserverstorageengine/2015/11/03/drop-if-exists-new-thing-in-sql-server-2016/
fuente
Yo tenía el mismo error. Sé que este hilo ya está muerto, pero quiero establecer otra opción además del "procedimiento anónimo".
Lo resolví así:
Compruebe si existe el procedimiento almacenado:
Sin embargo, el
"CREATE/ALTER PROCEDURE' must be the first statement in a query batch"
todavía está allí. Lo resolví así:Termino con este código:
fuente
Aquí hay un método y algunas razones para usarlo de esta manera. No es tan bonito editar el proceso almacenado, pero hay ventajas y desventajas ...
ACTUALIZACIÓN: También puede completar esta llamada completa en una TRANSACCIÓN. Incluyendo muchos procedimientos almacenados en una sola transacción que pueden comprometerse o revertirse. ¡Otra ventaja de envolver en una transacción es que el procedimiento almacenado siempre existe para otras conexiones SQL, siempre y cuando no utilicen el nivel de aislamiento de transacción LEÍDO NO COMPROMETIDO!
1) Para evitar alteraciones solo como una decisión del proceso. Nuestros procesos son siempre SI EXISTE GOTA LUEGO CREAR. Si sigue el mismo patrón de suponer que el nuevo PROC es el proceso deseado, atender las modificaciones es un poco más difícil porque tendría un SI EXISTE ALTERAR OTRA CREACIÓN.
2) Debe colocar CREATE / ALTER como la primera llamada en un lote para que no pueda ajustar una secuencia de actualizaciones de procedimientos en una transacción fuera de SQL dinámico. Básicamente, si desea ejecutar una pila completa de actualizaciones de procedimientos o revertirlas todas sin restaurar una copia de seguridad de la base de datos, esta es una manera de hacer todo en un solo lote.
fuente
En SQL Server 2008 en adelante, puede usar "
INFORMATION_SCHEMA.ROUTINES
"fuente
Aparentemente no tengo la reputación requerida para votar o comentar, pero solo quería decir que la respuesta de Geoff usando EXEC (sp_executesql podría ser mejor) es definitivamente el camino a seguir. Dejar y volver a crear el procedimiento almacenado hace el trabajo al final, pero hay un momento en el tiempo en que el procedimiento almacenado no existe en absoluto, y eso puede ser muy malo, especialmente si esto es algo que será correr repetidamente Estaba teniendo todo tipo de problemas con mi aplicación porque un subproceso en segundo plano estaba haciendo una GOTA SI EXISTE ... CREAR al mismo tiempo que otro subproceso estaba tratando de usar el procedimiento almacenado.
fuente
** La forma más sencilla de soltar y recrear un proceso almacenado en T-Sql es **
fuente
Aquí está el script que uso. Con él, evito dejar caer innecesariamente y recrear los procesos almacenados.
fuente
Verifique si existe para el procedimiento almacenado
Marque IF Exist for Trigger, Function también haciendo clic en el siguiente enlace http://www.gurujipoint.com/2017/05/check-if-exist-for-trigger-function-and.html
fuente
¿Por qué no vas de la manera simple como
..........
fuente
%
, así que seLIKE
comporta como un=
Además de la respuesta de @Geoff , he creado una herramienta simple que genera un archivo SQL que declara procedimientos almacenados, vistas, funciones y disparadores.
Ver MyDbUtils @ CodePlex .
fuente
¡Me pregunto! ¿Por qué no escribo toda la consulta como
ya sé que ya existen los primeros dos procedimientos, sql ejecutará la consulta dará el error de los dos primeros procedimientos, pero aún así creará el último procedimiento SQl se está encargando de lo que ya existe, esto es lo que siempre hago a todos mis ¡clientela!
fuente
CREAR Procedimiento SI NO EXISTE 'Su nombre de proceso' () COMIENZA ... FIN
fuente