2010-07-20 20 views
14

Tengo un montón de nombres de procedimientos almacenados. Quiero exportar el script de creación para cada uno de los procedimientos almacenados. ¿Cuál es la mejor manera de hacerlo?t-sql procedimiento almacenado crear scripts

Ahora estoy seleccionando manualmente el proceso almacenado en SSMS y seleccionando "Script stored procedure as -> Drop and Create to". Esto parece tedioso Espero que haya una mejor manera de lidiar con esto. Gracias.

Respuesta

21

Puede hacer clic con el botón derecho en la base de datos en el Explorador de objetos y hacer una Tarea> Generar secuencias de comandos.

alt text http://i25.tinypic.com/2khmr8.png

Eso le permite elegir un montón de objetos a ser escrito (por ejemplo, tablas, vistas, procedimientos almacenados) y se puede almacenar aquellos en un solo archivo grande SQL o un archivo SQL por objeto. ¡Funciona realmente bien!

Actualización: si usted quiere hacer esto en la aplicación SQL Server Management Studio, puede utilizar esta secuencia de comandos SQL para encontrar los procedimientos almacenados y sus definiciones - no se puede sin embargo tener SQL Server Gestión de Estudio escribir los archivos de disco, eso no funciona, pero puede copiar los resultados en, por ejemplo, Sobresalir.

SELECT 
    pr.name , 
    pr.type_desc , 
    pr.create_date , 
    mod.definition 
FROM sys.procedures pr 
INNER JOIN sys.sql_modules mod ON pr.object_id = mod.object_id 
WHERE pr.Is_MS_Shipped = 0 
+0

gracias marc. En realidad, tengo un montón de informes de SSRS y una utilidad para extraer los nombres de proc almacenados. ya que habrá más de estos informes llegando a intervalos frecuentes, estaba pensando en un script t-sql que puede tomar la lista de procedimientos almacenados y generar un archivo de script. ¿Es eso posible? – stackoverflowuser

+3

Gracias. Exactamente lo que estaba buscando. – stackoverflowuser

2

Si selecciona Ver -> Resumen

haga clic en "procedimientos almacenados" desde el explorador de objetos que le proporcionará una lista de todos los procedimientos almacenados que se puede Ctrl/Shift Select (seleccionar múltiplos). Luego, desde allí puede crear todas las secuencias de comandos de una vez y luego crear todas las secuencias de comandos. Esta es una de las muchas peculiaridades que he encontrado con SSMS.

Nota: Otra característica útil es la opción de filtro, que le permite filtrar fácilmente los procedimientos almacenados/tablas. Simplemente haga clic derecho en el explorador de objetos para que aparezca el menú.

+0

Gracias por informar acerca de la función de filtro. voto de mi parte. – stackoverflowuser

8

Para escribir todos los que coincidan con un criterio en particular, podría utilizar algo como el siguiente.

DECLARE @t VARCHAR(max) = ''; 
SELECT @t = @t + 
'If OBJECT_ID(''' + QUOTENAME(OBJECT_SCHEMA_NAME(object_id)) + '.' + QUOTENAME(OBJECT_NAME(object_id)) + ''',''p'') IS NOT NULL 
    DROP PROCEDURE ' + QUOTENAME(OBJECT_SCHEMA_NAME(object_id)) + '.' + QUOTENAME(OBJECT_NAME(object_id)) + ' 
GO 

SET ANSI_NULLS ' 
      + CASE 
       WHEN uses_ansi_nulls = 1 THEN 'ON' 
       ELSE 'OFF' 
       END 
      + ' 
GO 

SET QUOTED_IDENTIFIER ' 
      + CASE 
       WHEN uses_quoted_identifier = 1 THEN 'ON' 
       ELSE 'OFF' 
       END 
      + ' 
GO 

' + definition + ' 
GO 

' 
FROM [sys].[sql_modules] 
WHERE OBJECTPROPERTY (object_id,'IsProcedure')=1 
     AND OBJECT_NAME(object_id) LIKE '%some_patttern%' 


/*Stops the long text from getting truncated in SSMS*/ 
SELECT @t AS [processing-instruction(x)] 
FOR XML PATH('') 
+0

¿Cómo funciona esto? ¿Debo configurar @t a una lista de nombres de procesos almacenados separados por comas? – stackoverflowuser

+0

@stack - No, pero podrías deshacerte del 'LIKE' y utilizar un' in' para eso. –

+0

impresionante, exactamente lo que necesitaba y requería ningún ratón-clic. – dividius

1

Puede consultar sp_helptext para obtener algunas ideas sobre cómo aprovechar eso para crear sus scripts.

+0

buena idea. Gracias. – stackoverflowuser

1

Visual Studio 2008 Database Professional Edition y Visual Studio 2010 Professional (y superior) admiten tipos de proyectos especiales para SQL Server 2005/2008. Estos proyectos admiten la creación automática de scripts de cambios, que contienen todos los cambios entre el proyecto actual y una base de datos de destino especificada.

AFAIK RedGate también proporciona algunas herramientas como esta, sin embargo, no tengo ninguna experiencia con ellas.

2

Algo como esto te ayudaría.

Usando sql dinámico y cursores puede generar script, cada uno en un archivo separado con extensión .sql.

Este script generará guión de todos los procedimientos cuyos nombres son mención en la cláusula IN:

DECLARE @name varchar(100) 
DECLARE @Definition varchar(max) 
DECLARE @sql varchar(300) 
DECLARE @schema varchar(10) 
CREATE TABLE TEMPTABLE (ID INT IDENTITY(1,1), def varchar(max)) 
DECLARE script CURSOR 
FOR 
SELECT OBJECT_NAME(SYS.SQL_MODULES.OBJECT_ID), [DEFINITION] FROM SYS.SQL_MODULES 
INNER JOIN SYS.OBJECTS ON SYS.OBJECTS.OBJECT_ID = SYS.SQL_MODULES.OBJECT_ID WHERE SYS.OBJECTS.TYPE='P' 
--AND [NAME] IN('SOME PROC 1','SOME PROC 2','SOME PROC 3','SOME PROC 4') --<------ Mention Proc names you want to generate scripts for 
OPEN script 
FETCH NEXT FROM script INTO @name, @Definition 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    FETCH NEXT FROM script INTO @name, @Definition 
    SET @schema = (select SYS.SCHEMAS.[NAME] from SYS.OBJECTS 
       INNER JOIN SYS.SCHEMAS ON SYS.OBJECTS.SCHEMA_ID = SYS.SCHEMAS.SCHEMA_ID 
       WHERE SYS.OBJECTS.[NAME]='' + @name + '') 
    SET @sql = 'IF EXISTS (SELECT * FROM ' + (@schema) + 
      '.PROCEDURES WHERE [NAME] = ''' + @name + ''')' + CHAR(10) 
    SET @sql = @sql + 'DROP PROCEDURE ' + @schema + '.' + @name + CHAR(10) + 'GO' + CHAR(10) 
    PRINT @sql 
    INSERT INTO TEMPTABLE VALUES(@sql + @definition) 
    SET @Sql = ('BCP "SELECT TOP 1 def FROM TEMPTABLE ORDER BY ID DESC" queryout "D:\' + @name + '.sql" -c -T') 
    EXEC XP_CmdShell @Sql --<---- Export to file 
END 
CLOSE script 
DEALLOCATE script 
SELECT * FROM TEMPTABLE --<----------- Optional 
DROP TABLE TEMPTABLE 
0
C:\>BCP "Select '--'+pr.name, 
    pr.type_desc, pr.create_date, pr.modify_date, CHAR(13)+mod.definition 
    from DATABASE_NAME.sys.objects pr 
    INNER JOIN DATABASE_NAME.sys.sql_modules mod ON pr.object_id = mod.object_id 
    where type='p'" queryout "C:/output.sql" -c -T -S SERVER_NAME 

ejecutar de la línea de comandos ...que devolverá todos los procedimientos almacenados en un archivo con marcas de tiempo con SP con la fecha de creación/modificación

1

A continuación se va a generar secuencias de comandos para un conjunto de nombres de procedimiento almacenado. Los scripts se guardarán como una serie de archivos .sql. Inserte los nombres de los procedimientos para script en @Table.

-- Script Multiple SPROC as drop and create 

-- SPROCS to script 
DECLARE @Table TABLE (Name VARCHAR(MAX)); 
INSERT INTO @Table (Name) VALUES ('StoredProcedure1'), ('StoredProcedure2') 

-- Drop TempTable if extant: http://stackoverflow.com/questions/659051/check-if-a-temporary-table-exists-and-delete-if-it-exists-before-creating-a-temp 
IF OBJECT_ID('tempdb..##Temp') IS NOT NULL DROP TABLE dbo.##Temp 

-- Loop through SPROCs  
-- Cursor: https://www.mssqltips.com/sqlservertip/1599/sql-server-cursor-example/ 
-- Substring: http://stackoverflow.com/questions/4662496/trim-left-characters-in-sql-server 
DECLARE @item VARCHAR(MAX); -- SPROC Name 
DECLARE db_cursor CURSOR FOR 
SELECT Name FROM @Table WHERE 1=1 

OPEN db_cursor 
FETCH NEXT FROM db_cursor INTO @item 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    -- Execute 
    -- Print to file using Temp Table: http://stackoverflow.com/questions/10568975/can-i-specify-an-input-sql-file-with-bcp 
    -- Script SPROC via XML: http://stackoverflow.com/a/3292693/5301903 
    -- ANSI_NULLS and QUOTED_IDENTIFIER retain current settings. 
    -- Prepare Temp Table 
    SELECT 
'IF EXISTS(SELECT * FROM sys.procedures WHERE Name = '''+Object_name(object_id)+''') 
    DROP PROCEDURE [dbo].['+Object_name(object_id)+'] 
GO 

SET ANSI_NULLS '+CASE WHEN CAST(ISNULL(OBJECTPROPERTYEX(object_id,N'ExecIsAnsiNullsOn'),0) AS bit) = 1 THEN 'ON' ELSE 'OFF' END+' 
GO 

SET QUOTED_IDENTIFIER '+CASE WHEN CAST(ISNULL(OBJECTPROPERTYEX(object_id,N'ExecIsQuotedIdentOn'),0) AS bit) = 1 THEN 'ON' ELSE 'OFF' END+' 
GO 

' + definition + ' 
GO' AS Text 
INTO dbo.##Temp 
FROM [sys].[sql_modules] 
WHERE 1=1 
--AND OBJECTPROPERTY (object_id,'IsProcedure')=1 
--AND OBJECTPROPERTY (object_id,'IsTable')=1 
--AND Object_name(object_id) LIKE @name 
AND Object_name(object_id) = @item 

    -- Print to text https://social.msdn.microsoft.com/Forums/en-US/71aefd98-ee46-48fe-a129-60791c583555/output-results-to-text-file-using-tsql?forum=transactsql 
    DECLARE @CMD VARCHAR(1000) = 'bcp "SELECT * FROM ##Temp" queryout C:\temp\'[email protected]+'.sql -c -T -S '+ @@servername 
    EXECUTE Master.dbo.xp_CmdShell @Cmd 

    -- Clean up 
    DROP TABLE dbo.##Temp 

    -- End Execute 
    FETCH NEXT FROM db_cursor INTO @item 
END 

CLOSE db_cursor 
DEALLOCATE db_cursor 
Cuestiones relacionadas