2010-07-20 9 views
14

Ho un mucchio di nomi di stored procedure. Voglio esportare lo script di creazione per ciascuna stored procedure. Qual'è il miglior modo di farlo?La stored procedure t-sql crea gli script

In questo momento sto selezionando manualmente il processo memorizzato in SSMS e selezionando "Script stored procedure as -> Drop and Create to". Questo sembra noioso. Spero che ci sia un modo migliore per affrontare questo. Grazie.

risposta

21

È possibile fare clic con il pulsante destro del mouse sul database in Esplora oggetti ed eseguire un'operazione> Genera script.

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

che permette di scegliere un sacco di oggetti da inserire nello script (ad esempio tabelle, viste, stored procedure) e si può memorizzare quelli in un unico file grande SQL, o un file SQL per oggetto. Funziona davvero molto bene!

Update: se si vuole fare questo in applicazione SQL Server Management Studio, è possibile utilizzare questo script SQL per trovare le stored procedure e le loro definizioni - non si può comunque disporre di SQL Server Mgmt Studio scrivere i file da disco, che non funziona - ma è possibile copiare i risultati in es Eccellere.

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

grazie marc. In realtà ho un sacco di report SSRS e un'utilità per estrarre i nomi dei processi memorizzati. dato che ci saranno un maggior numero di questi rapporti a intervalli frequenti, stavo pensando a uno script t-sql che può prendere l'elenco delle stored procedure e generare un file di script. È possibile? – stackoverflowuser

+3

Grazie. Esattamente quello che stavo cercando. – stackoverflowuser

2

Se si seleziona Visualizza -> Sommario

poi cliccare su "Procedure memorizzate" dal esploratore oggetto che vi fornirà un elenco di tutte le stored procedure che è possibile ctrl/shift select (selezionare multipli). Quindi da lì è possibile creare tutti gli script di rilascio contemporaneamente e tutti gli script di creazione. Questa è una delle molte stranezze che ho trovato con SSMS.

Nota: Un'altra opzione accurata è l'opzione di filtro, che consente di filtrare facilmente le procedure memorizzate/tabelle. È sufficiente fare clic con il pulsante destro del mouse su Esplora oggetti per visualizzare il menu.

+0

Grazie per aver informato sulla funzione del filtro. upvote da me. – stackoverflowuser

8

Per escludere tutti quelli che corrispondono a un particolare criterio, è possibile utilizzare qualcosa come il seguente.

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

Come funziona? Devo impostare @t su un elenco di nomi proc memorizzati separati da virgole? – stackoverflowuser

+0

@stack - No, ma potresti liberarti di 'LIKE' e usare un' in' per quello. –

+0

Impressionante, esattamente quello di cui avevo bisogno e non avevo bisogno di fare clic con il mouse. – dividius

1

Si potrebbe dare un'occhiata a sp_helptext per alcune idee su come si può sfruttare tale per creare i propri script.

+0

buona idea. Grazie. – stackoverflowuser

1

Visual Studio 2008 Database Professional Edition e Visual Studio 2010 Professional (e versioni successive) supportano tipi di progetti speciali per SQL Server 2005/2008. Questi progetti supportano la creazione automatica di script di modifica, contenenti tutte le modifiche tra il progetto corrente e un database di destinazione specificato.

AFAIK RedGate fornisce anche alcuni strumenti come questo, tuttavia, non ho alcuna esperienza con loro.

2

Qualcosa del genere potrebbe aiutarti.

Utilizzando sql dinamico e cursori è possibile generare script, ciascuno in un file separato con estensione .sql.

Questo script genera lo script per tutte le procedure i cui nomi sono menzione nella clausola 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 

Esegui dal prompt dei comandi ...restituirà tutte le stored procedure in un file con data e ora con SP con data di creazione/modifica

1

Quanto segue genererà script per un insieme di nomi di stored procedure. Gli script verranno salvati come una serie di file .sql. Inserisci i nomi delle procedure per lo script in @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 
Problemi correlati