2009-02-20 13 views
8

Mi piacerebbe salvare le mie stored procedure di MS SQL Server 2005 in file .sql automaticamente (preferirei uno strumento che posso chiamare tramite .bat) quindi non devo fare clic ogni singolo sproc manualmente e salvarlo.come salvare le stored procedure SQL in file .sql tramite batch

Ho già trovato SMOscript da devio IT, ma raccoglie tutte le tabelle e sproc che richiede un po 'di tempo. Esiste uno strumento simile in cui posso definire quale sproc (s) esportare? Inoltre mi manca la clausola USE che SMOScript non aggiunge al file esportato in contrasto con l'esportazione manuale come script sproc per CREATE.

migliori saluti sean

risposta

5

Creare file batch con lo script (dispiace per la formattazione, ma è in realtà dovrebbe essere in linea per l'esecuzione batch):

osql -U %1 -P %2 -S %3 -d %4 -h-1 -Q "SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.Routines WHERE ROUTINE_TYPE = 'PROCEDURE'" -n -o "sp_list.txt" 
for /f %%a in (sp_list.txt) do osql -U %1 -P %2 -S %3 -d %4 -h-1 -Q "SELECT ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.Routines WHERE ROUTINE_NAME = '%%a'" -n -o "%%a.sql" 

nome è "run.bat". Ora, per l'esecuzione di batch di uso params:
run.bat [nome utente] [password] [nomeserver] [Database]
su esempio:
run.bat sa pwd111 localhost \ maestro SQLEXPRESS
nomi primo all stored procedure verrà memorizzato nel file sp_list.txt, quindi uno alla volta in file di script separati. L'unico problema - ultima riga di ogni script con conteggio risultato - sto Workin' su di esso :)

modificati: bug nella query risolto

Rimozione "righe interessate" linea
Ok, ora abbiamo bisogno di creare un altro lotto:

type %1 | findstr /V /i %2 > xxxtmpfile 
copy xxxtmpfile %1 /y /v 
del xxxtmpfile 

Nome "line_del.bat". Vedi, il primo parametro è il file da elaborare, la seconda stringa per cercare le linee da rimuovere.Ora modificare il lotto principale (di nuovo, mi dispiace per la formattazione):

osql -U %1 -P %2 -S %3 -d %4 -h-1 -Q "SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.Routines WHERE ROUTINE_TYPE = 'PROCEDURE'" -n -o "sp_list.txt" 
call line_del sp_list.txt "rows affected" 
call line_del sp_list.txt "row affected" 
for /f %%a in (sp_list.txt) do osql -U %1 -P %2 -S %3 -d %4 -h-1 -Q "SELECT ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.Routines WHERE ROUTINE_NAME = '%%a'" -n -o "%%a.sql" 
for /f %%a in (sp_list.txt) do call line_del %%a.sql "rows affected" 
for /f %%a in (sp_list.txt) do call line_del %%a.sql "row affected" 

Vedi articoli correlati:
Simple programming commands in a batch environment
osql Utility
MSSQL: How do you script Stored Procedure creation with code?
Delete certain lines in a txt file via a batch file

:) si può notare, ultimi due sono da COSÌ!

+0

Grazie mille! Ho provato un po 'in giro, ma ho qualche problema con l'autenticazione (osql can connect). Darei un altro tentativo nei prossimi giorni ... cordiali saluti – seansilver

+1

Non si romperebbe per procs di grandi dimensioni? Quando eseguo: SELEZIONA ROUTINE_NAME, max (len (ROUTINE_DEFINITION)) FROM INFORMATION_SCHEMA.Routines raggruppa per ROUTINE_NAME ordina per 2 desc; Ho un sacco di procs che sono 4000 caratteri. Abbastanza sicuro di aver bisogno di uscire da sys.comments per ottenere i dati giusti. – jcollum

+0

Oops, che dovrebbe essere syscomments nel commento sopra. – jcollum

2

C'è un'alternativa in SQL Server Management Studio, script del database ...

espandere la visualizzazione Esplora oggetti per trovare il database, fare clic destro e selezionare "Compiti: Genera Script "

Da lì è possibile scrivere tutto l'oggetto, solo le preocedure memorizzate, di qualsiasi cosa nel mezzo. Ci sono alcune opzioni su una pagina, anche se quella principale che cambio è: - "Includi SE NON ESISTE"

Facendo quell'opzione "FALSE", si ottiene solo un intero elenco di istruzioni CREATE.

È quindi possibile scegliere di scrivere gli oggetti in una nuova finestra di query o in un file.

+0

Grazie per il suggerimento, purtroppo questo ha alcuni svantaggi per me - devo passare attraverso tutte le fasi di volta in volta a mano (senza auto/batch) - tutte le stored procedure selezionate vengono salvati in un unico Sql file - nessun commento viene salvato – seansilver

0

Ho usato sqlcmd e -E anziché utente, passaggio. Questo funziona bene fino ad ora, solo le stored procedure più lungo di 4000 caratteri avrà una linea di rottura

sqlcmd -E -S SERVER -d DB -h-1 -Q "SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.Routines WHERE ROUTINE_TYPE = 'PROCEDURE'" -o "sp_list.txt" 
call line_del sp_list.txt "rows affected" 
call line_del sp_list.txt "row affected" 
for /f %%a in (sp_list.txt) do sqlcmd -E -S SERVER -d DB -h-1 -Q "SELECT text from dbo.syscomments WHERE id = OBJECT_ID('%%a')" -o "%%a.sql" 
for /f %%a in (sp_list.txt) do call line_del %%a.sql "rows affected" 
for /f %%a in (sp_list.txt) do call line_del %%a.sql "row affected" 

migliori saluti sean

0

ho aggiunto SET NOCOUNT ON per eliminare la necessità di line_del.bat. Sostituito anche syscomments con sys.sql_modules (SQL 2005). Potrei anche aver usato la funzione OBJECT_DEFINITION ma è stata più lenta di sys.sql_modules.

sqlcmd -E -S SERVER -d DB -h-1 -Q "SET NOCOUNT ON SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.Routines WHERE ROUTINE_TYPE = 'PROCEDURE'" -o "sp_list.txt" for /f %%a in (sp_list.txt) do sqlcmd -E -S SERVER -d DB -h-1 -Q "SET NOCOUNT ON SELECT definition from sys.sql_modules WHERE object_id = OBJECT_ID('%%a')" -o "%%a.sql" 
+0

Non una risposta autonoma, dovrebbe essere un commento sulla risposta di cui stai parlando. – jcollum

1

Aggiunta SET NOCOUNT ON ha effettivamente eliminare la necessità per il line_del.bat, ma sostituendo syscomments con sys.sql_modules portato in ogni procedura immagazzinata troncati a 258 caratteri. Quindi, per i migliori risultati il ​​codice che ho usato è stato:

sqlcmd -E -S SERVER-d DB -h-1 -Q "SET NOCOUNT ON SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.Routines WHERE ROUTINE_TYPE = 'PROCEDURE'" -o "sp_list.txt" 
for /f %%a in (sp_list.txt) do sqlcmd -E -S SERVER-d DB -h-1 -Q "SET NOCOUNT ON SELECT text from dbo.syscomments WHERE id = OBJECT_ID('%%a')" -o "%%a.sql" 

che ha funzionato, e non aveva bisogno l'uso del line_del.bat. Quello che mi hanno dato quando ho fatto l'esportazione manuale utilizzando la procedura guidata di SQL Server Management Studio (Compiti/generare script/stored procedure/Seleziona tutto) è stato il:

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

all'inizio di ogni Sql, e il comando finale GO anche . Non incredibilmente importante ma qualcosa da notare. Grazie a Max Gontar, Seansilver e Lee per i tuoi contributi! Ora posso automatizzare il backup delle stored procedure nel database e applicare il controllo della versione.

0

Grazie a tutti per l'aiuto e lasciando questo qui per altri noob sqlcmd come me da trovare. Funziona su SQL Server 2005. objectName è una procedura, visualizza il nome ecc.

:reset 

-- :setvar ObjectName "objectName" -- works 
:setvar ObjectName objectName -- works too 
declare @sql varchar(max); 
set @sql = 'select text from dbo.syscomments where id = object_id(upper("' + '$(ObjectName)' + '"))'; 
-- exec sp_helptext $(ObjectName) -- quick n easy but gets chopped to 256 width 
/* 4000 byte limit 
set @sql = 
    'select view_definition 
    from information_schema.views 
    where upper(table_name) = upper("' + '$(ObjectName)' + '")'; 
*/ 
:out $(ObjectName).sql 

exec(@sql) 
go 

:out stdout 
Problemi correlati