2011-08-26 8 views
7

SQL Server 2008Scripts todos los procedimientos almacenados a la vez con la gota y crear

Objetivo: Para generar secuencias de comandos para la creación de procedimientos almacenados que ya están en la base de datos. Debe ser una secuencia de comandos por archivo.

Sé que simplemente puedo hacer clic con el botón derecho en la base de datos y en "Tareas> Generar secuencias de comandos", pero eso no procesa el sproc en la plantilla que quiero.

Necesito que sproc se escriba en la misma plantilla que obtiene cuando hace clic derecho en el sproc del explorador de objetos y 'Procedimiento almacenado de script como> DROP y CREAR'.

Es cierto que obtiene una versión similar de este a través de 'las tareas> generar scripts', pero la principal diferencia es el método de las 'tareas> generar scripts' crea la secuencia de comandos a través del comando dbo.sp_executesql porque no se puede anidar un CREATE PROCEDURE interior de un IF bloquear

tareas> Generar produce esto:

USE someDB 
GO 

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'somesproc') AND type in (N'P', N'PC')) 
DROP PROCEDURE someSproc 
GO 

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'someSproc') AND type in (N'P', N'PC')) 
BEGIN 
EXEC dbo.sp_executesql @statement = N'-- ============================================= 
CREATE PROCEDURE 
AS 
BEGIN 

END 
' 
END 
GO 

Pero esto requiere (como se encuentra de hacer clic derecho en el sproc):

USE someDB 
GO 

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'someSproc') AND type in (N'P', N'PC')) 
DROP PROCEDURE someSproc 
GO 

USE someDB 
GO 

SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

CREATE PROCEDURE someSproc 

AS 
BEGIN 
    SET NOCOUNT ON; 

END 

GO 

¿Alguna idea?

+4

Esto se soluciona con CREA O REEMPLAZA: ¿has votado/comentado?:-) http://connect.microsoft.com/SQLServer/feedback/details/127219/create-or-replace –

+0

Algunas preguntas sobre su salida deseada. ¿Necesitas 'USE someDB' entre cada declaración? Supongo que está bien ignorar los permisos y el orden de dependencia, ese tipo de cosas? –

+0

Solo necesita el único 'USE someDB'. Y sí, esos dos pueden ser ignorados. –

Respuesta

5

el fin de crear los guiones de SSMS ...

Paso 1 - creación de secuencias de comandos del procedimiento almacenado:

IF EXISTS (
    SELECT * 
    FROM sys.objects 
    WHERE object_id = OBJECT_ID(N'[dbo].[usp_ScriptProcedure]') 
    AND type in (N'P', N'PC')) 
DROP PROCEDURE [dbo].[usp_ScriptProcedure] 
GO 

CREATE PROCEDURE [dbo].[usp_ScriptProcedure] (
    @ObjectID INT, 
    @Name NVARCHAR(128), 
    @SchemaID INT 
) 
AS 

DECLARE 
    @code VARCHAR(MAX), 
    @newLine CHAR(2) 

SET @newLine = CHAR(13) + CHAR(10) 

SET @code = 
    'USE [' + DB_NAME() + ']' + @newLine + 'GO' + @newLine + @newLine 
    + 'IF EXISTS (SELECT * FROM sys.objects WHERE object_id = ' 
    + 'OBJECT_ID(N''[' + SCHEMA_NAME(@schemaID) + '].[' + @Name + ']'') ' 
    + 'AND type IN (N''P'', N''PC''))' + @newLine 
    + 'DROP PROCEDURE [' + SCHEMA_NAME(@schemaID) + '].[' + @name + ']' 
    + @newLine + @newLine + 'SET ANSI_NULLS ON' + @newLine + 'GO' 
    + @newLine + @newLine + 'SET QUOTED_IDENTIFIER ON' + @newLine + 'GO' 
    + @newLine + @newLine 
    + OBJECT_DEFINITION(@ObjectID) + @newLine + 'GO' 
    + @newLine + @newLine + 'SET ANSI_NULLS OFF' + @newLine + 'GO' 
    + @newLine + @newLine + 'SET QUOTED_IDENTIFIER OFF' + @newLine + 'GO' 

WHILE @code <> '' 
BEGIN 
    PRINT LEFT(@code,8000) 
    SET @code = SUBSTRING(@code, 8001, LEN(@code)) 
END 
GO 

Paso 2 - Activar Xp_cmdshell

EXEC sp_configure 'show advanced options', 1 
GO 
RECONFIGURE 
GO 
EXEC sp_configure 'xp_cmdshell', 1 
GO 
RECONFIGURE 
GO 

Paso 3 - ejecutar el script a continuación (asegúrese de configurar el nombre del servidor y la carpeta de destino)

DECLARE 
    @name sysname, 
    @objID int, 
    @schemaID int, 
    @cmd varchar(1000), 
    @folder varchar(128), 
    @server varchar(128) 

SET @server = 'MSSQL' 
SET @folder = 'C:\Scripts' 

DECLARE procs CURSOR FOR 
SELECT name, object_id, schema_id 
FROM sys.procedures 
WHERE is_ms_shipped = 0 
ORDER BY [name] 
OPEN procs 

FETCH NEXT FROM procs 
INTO @name, @objID, @schemaID 

WHILE @@FETCH_STATUS = 0 
BEGIN 

    SET @cmd = 'sqlcmd -S .\' + @server + ' -d ' + DB_NAME() 
      + ' -Q "EXEC usp_ScriptProcedure ' 
      + CONVERT(VARCHAR(20), @objID) + ', N''' 
      + @name + ''', ' + CONVERT(VARCHAR(20), @schemaID) 
      + '" > ' + @folder + '\' + @name + '.sql' 

    EXEC xp_cmdshell @cmd 

    FETCH NEXT FROM procs 
    INTO @name, @objID, @schemaID 

END 

CLOSE procs 
DEALLOCATE procs 

Referencias:

0

Esto funcionó para mí:

he modificado el procedimiento almacenado para generar secuencias de comandos para las tablas como esta:

DECLARE tabls CURSOR FOR 
SELECT name, object_id, schema_id 
FROM sys.Tables 
WHERE is_ms_shipped = 0 
ORDER BY [name] 
OPEN tabls 

FETCH NEXT FROM tabls 
INTO @name, @objID, @schemaID 

WHILE @@FETCH_STATUS = 0 
BEGIN 

    SET @cmd = 'sqlcmd -S .\' + @server + ' -d ' + DB_NAME() 
      + ' -Q "EXEC usp_ScriptProcedure ' 
      + CONVERT(VARCHAR(20), @objID) + ', N''' 
      + @name + ''', ' + CONVERT(VARCHAR(20), @schemaID) 
      + '" > ' + @folder_Tbl + '\' + @name + '.sql' 

    EXEC xp_cmdshell @cmd 

    FETCH NEXT FROM tabls 
    INTO @name, @objID, @schemaID 

END 

CLOSE tabls 
DEALLOCATE tabls 
Cuestiones relacionadas