variable una sp_executesql salida resultado procedimiento parametros para mostrar guardar fecha ejemplos ejemplo ejecutar datos con almacenado sql-server ssms

sql-server - una - procedimiento almacenado sql server select



Cómo detener a SSMS 2012 de los SP de scripting usando sp_executesql (5)

Finalmente después de buscar muchos artículos encontré una solución que

Debes hacer "dos pases" al hacer un scripting . Durante la primera pasada ,

  • seleccione las opciones para verificar la existencia Y solo para el script DROP.
  • Luego, en el segundo paso , de-select la de-select la opción Comprobar la existencia y seleccione la secuencia de comandos CREATE .
    • Además, utiliza la opción Append To File . Luego, cuando ejecute los scripts de generación en el segundo paso , desactive la opción "Overwrite File" . Esto solo funcionará si está generando un archivo separado para cada objeto.

¿Me doy cuenta de que esta es una pregunta muy similar para detener el SSMS de los SP de scripting usando sp_executesql?

Sin embargo, parece que han cambiado el comportamiento con SSMS 2012.

Si tiene seleccionada la opción ''Verificar la existencia'', como en:

... ahora genera un IF NOT EXISTS para el proceso que se va a crear, así como un IF EXISTS para el anterior proceso de extracción, si, como normalmente lo hago, selecciono la opción DROP y CREAR:

Esto lo obliga a escribir el CREATE utilizando sp_executesql. No tiene sentido, ya que no necesita el control SI NO EXISTE en CREAR, si el DROP lo ha abandonado.

No parece posible tener lo uno sin lo otro.

¿Algunas ideas?


He encontrado una buena solución a este problema. Debes hacer "dos pases" al hacer un script. Durante el primer paso, seleccione las opciones para verificar la existencia Y solo para el script DROP. Luego, en el segundo paso, anule la selección de la opción Comprobar la existencia y seleccione la secuencia de comandos CREAR. Además, utiliza la opción Anexar al archivo. Luego, cuando ejecute los scripts de generación en el segundo paso, desactive la opción "Sobrescribir archivo". Esto solo funcionará si está generando un archivo separado para cada objeto.


Lo más cerca que puede llegar a esta funcionalidad es ir bajo Herramientas, opciones, SQL Server Object Explorer, Scripting, y luego establecer la Verificación de objeto existente en falso.

El inconveniente es que si lo hace, entonces se eliminarán y crearán siempre intentarán eliminarse incluso si el objeto no existe. La solución ideal sería una configuración que permitiera que su secuencia de comandos se pareciera al ejemplo a continuación para crear vistas, procedimientos y funciones definidas por el usuario.

/****** Object: View [dbo].[vEmployees] Script Date: 9/14/2012 9:18:57 AM ******/ IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N''[dbo].[vEmployees]'')) DROP VIEW [dbo].[vEmployees] GO CREATE VIEW [dbo].[vEmployees] AS SELECT DISTINCT Employees.EmployeeID, FirstName, LastName from Employees JOIN Sales on Employees.EmployeeID=Sales.EmployeeID GO

En resumen, si el motor de secuencias de comandos piensa en la eliminación y crear juntos para verificar la existencia del objeto, no necesita poner la condición en la creación.


No puede hacer esto sin el SQL dinámico porque un procedimiento almacenado debe estar en su propio lote. Por lo tanto no puedes decir:

IF <some condition> <start a new batch>

La única manera de mantener eso en el mismo lote es usar sp_executesql .

Si va a ejecutar el DROP y CREATE simultáneamente, simplemente hágalo sin verificar la existencia del objeto. Esto te dará:

DROP PROCEDURE ...; GO CREATE PROCEDURE ...; GO

¿A quién le importa si el DROP falla? (No debería, ¡porque acabas de escribir desde él!)

Si está ejecutando este script para otro sistema que pueda tener el objeto, aparecerá un mensaje de error para el DROP cuando no lo tenga, pero CREATE seguirá ocurriendo, por lo que puede ignorar los errores DROP . Si realmente desea, puede ajustar manualmente las declaraciones DROP en TRY/CATCH pero no creo que sea necesario.

Si necesita hacer esto por muchos procedimientos, o si realmente necesita el proceso para no generar errores benignos, le sugiero que abandone las opciones de scripting primitivas de Management Studio y utilice una herramienta de terceros para esto. Ya habrán abordado muchos de los problemas con los que aún no se ha topado, pero lo harán. He blogeado sobre esto:

http://bertrandaaron.wordpress.com/2012/04/20/re-blog-the-cost-of-reinventing-the-wheel/


También luché con el mismo problema. Si necesita realizar un script de los objetos para una base de datos completa, es posible que desee considerar ApexSQL Script. Probé varias herramientas y ApexSQL guionó los objetos exactamente como lo necesitaba. (si el objeto existe, entonces suelte. cree el objeto). Creo que también funciona desde la línea de comandos. Tenga en cuenta, es shareware; Solo he usado la versión de evaluación porque solo la he necesitado varias veces.

A continuación se muestra un ejemplo de la salida de un procedimiento después de alguna configuración.

IF (EXISTS(SELECT * FROM sys.objects WHERE [object_id] = OBJECT_ID(N''[dbo].[myProcedure]'') AND [type]=''P'')) DROP PROCEDURE [dbo].[myProcedure] GO SET ANSI_NULLS ON SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE dbo.myProcedure AS select 1 as a GO