2011-03-08 18 views
49

Tengo 10 scripts transact SQL que crean una tabla y la completan con datos.TransactSQL para ejecutar otra secuencia de comandos de TransactSQL

Estoy intentando crear 1 secuencia de comandos master sql que ejecutará cada uno de los otros 10 scripts.

¿Existe alguna forma con TSQL/TRANSACTSQL para Microsoft SQL Server 2008 de ejecutar otro script tsql desde el script tsql actual?

Esto está diseñado para ejecutarse a través de SQL Server Management Studio (SSMS).

Gracias!

+1

cuando se dice la escritura Qué quiere decir un archivo sql? –

+1

sí, me refiero a un archivo .sql. ¡Gracias! –

Respuesta

83

Pruebe esto si usted está tratando de ejecutar un archivo .sql en SSMS:

:r C:\Scripts\Script1.sql 
:r C:\Scripts\Script2.sql 
:r C:\Scripts\Script3.sql 
... 

nota: para esto para ejecutar su vez en el modo de comandos SQL (consulta> Modo SQLCMD)

Si estos son secuencias de comandos se ejecutan con bastante frecuencia se podrían considerar colocándolos en un procedimiento almacenado y funcionando de esa manera ...

también puede hacerlo a través de sqlcmd (que creo que es más común):

sqlcmd -S serverName\instanceName -i C:\Scripts\Script1.sql 
+3

¿Qué hace el ': r'? ¿Dónde está documentado? ¿Podrías proporcionar un enlace? – Oded

+34

Nota: Usar: r en SSMS requiere activar el modo SQLCMD: menú Consulta -> Modo SQLCMD. –

+2

@Oded, dale una lectura: http://msdn.microsoft.com/en-us/library/ms174187.aspx ': r' importa y ejecuta un archivo. –

0

Suponiendo que desea mantener los 10 scripts en sus propios archivos individuales, diría que la manera más fácil de hacer lo que desea sería crear un archivo por lotes que ejecute osql.exe para ejecutar los 10 scripts en el orden en que querer.

+1

Es mejor usar SQLCMD con SQL 2005 y versiones posteriores. Admite todas las características OSQL (e ISQL), junto con algunas funciones nuevas y complementos. –

+0

@Philip Kelley: Gracias por el consejo. No estoy seguro de cómo me perdí esa. Supongo que ya que no hago mucho desde la línea de comando. –

+0

Desde que llegué a una diferencia oculta pero fundamental entre isql y osql, los comprobé cuando se lanza una nueva versión –

3

La manera más simple sería hacer que los scripts guarden los procedimientos, y llamar (a través del comando EXECUTE) cada procedimiento a su vez desde un procedimiento central. Esto es ideal si va a ejecutar exactamente el mismo script (s) una y otra vez (o el mismo script con diferentes parámetros pasados).

Si sus scripts son archivos .sql (o cualquier tipo de texto), como @Abe Miesller dice (upvoted) puede ejecutarlos desde SSMS a través del comando: r, cuando el modo SQLCMD está habilitado. Debería conocer y escribir la ruta y el nombre exactos del archivo. Esto no se puede hacer desde dentro de un procedimiento almacenado.

Una última alternativa, utilizable con nombres de archivo "conocidos" y necesaria para nombres de archivo arbitrarios (por ejemplo, todos los archivos cargados actualmente en una subcarpeta) es aprovechar la potencia del procedimiento extendido XP_CMDSHELL. Estas soluciones pueden obtener compelx bastante rápido (usarlo para recuperar la lista de archivos, compilar y ejecutar a través de xp_cmdshell una cadena que llame a SQLCMD para cada archivo, administrar resultados y errores a través de archivos de salida, etc.) así que solo haz esto como último recurso.

3

Puede usar osql o mejor aún el sqlcmd más nuevo de manera casi intercambiable. Estoy usando osql en este ejemplo solo porque tuve una muestra de código pero en producción estoy usando sqlcmd. Aquí hay un código eliminado de un procedimiento más grande que utilizo para ejecutar scripts de actualización contra bases de datos. Se ordenan por mayor, menor, versión, compilación como yo nombro mis guiones usando esa convención para rastrear lanzamientos. Obviamente, se está perdiendo todo el manejo de errores, las partes donde extraigo las secuencias de comandos disponibles de la base de datos, las variables de configuración, etc., pero aún puede resultar útil este fragmento.

La parte principal que me gusta de usar osql o sqlcmd es que puede ejecutar este código en sms, o en un procedimiento almacenado (llamado tal vez de forma programada) o desde un archivo por lotes. Muy flexible.

--Use cursor to run upgrade scripts 
DECLARE OSQL_cursor CURSOR 
READ_ONLY 
FOR SELECT FileName 
FROM #Scripts 
ORDER BY Major, Minor, Release, Build 

OPEN OSQL_cursor 

FETCH NEXT FROM OSQL_cursor INTO @name 
WHILE (@@fetch_status <> -1) 
BEGIN 
    IF ((@@fetch_status <> -2) AND (@result = 0)) 
    BEGIN 
     SET @CommandString = 'osql -S ' + @@ServerName + ' -E -n -b -d ' + @DbName + ' -i "' + @Dir + @name + '"' 
     EXEC @result = master.dbo.xp_cmdshell @CommandString, NO_OUTPUT 
     IF (@result = 0) 
     BEGIN 
      SET @Seconds = DATEDIFF(s, @LastTime, GETDATE()) 
      SET @Minutes = @Seconds/60 
      SET @Seconds = @Seconds - (@Minutes * 60) 
      PRINT 'Successfully applied ' + @name + ' in ' + cast(@Minutes as varchar) 
       + ' minutes ' + cast(@Seconds as varchar) + ' seconds.' 
      SET @LastTime = GETDATE() 
     END 
     ELSE 
     BEGIN 
      SET @errMessage = 'Error applying ' + @name + '! The database is in an unknown state and the schema may not match the version.' 
      SET @errMessage = @errMessage + char(13) + 'To find the error restore the database to version ' + @StartingVersion 
      SET @errMessage = @errMessage + ', set @UpToVersion = the last version successfully applied, then run ' + @name 
      SET @errMessage = @errMessage + ' manually in Query Analyzer.' 
     END 
     IF @name = (@UpToVersion + '.sql') 
      GOTO CleanUpCursor --Quit if the final script specified has been run. 
    END 
    FETCH ENDT FROM OSQL_cursor INTO @name 
END 
1

o simplemente utilizar OPENROWSET para leer la secuencia de comandos en una variable y ejecutarlo:

DECLARE @SQL varchar(MAX) 
SELECT @SQL = BulkColumn 
FROM OPENROWSET 
    ( BULK 'MeinPfad\MeinSkript.sql' 
    , SINGLE_BLOB) AS MYTABLE 

--PRINT @sql 
EXEC (@sql) 
Cuestiones relacionadas