procesos - como saber que se esta ejecutando en sql server
TransactSQL para ejecutar otra secuencia de comandos de TransactSQL (5)
Intente esto si está intentando ejecutar un archivo .sql en SSMS:
:r C:/Scripts/Script1.sql
:r C:/Scripts/Script2.sql
:r C:/Scripts/Script3.sql
...
nota: para que esto se ejecute, active el modo de comando sql (Consulta> Modo SQLCMD)
Si estos son scripts que ejecuta con bastante frecuencia, podría considerar dejarlos en un proceso almacenado y ejecutarlos 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
Tengo 10 scripts transact SQL que crean una tabla y la completan con datos.
Estoy intentando crear 1 script maestro SQL que ejecutará cada uno de los otros 10 scripts.
¿Hay alguna forma con TSQL / TRANSACTSQL para Microsoft SQL Server 2008 de ejecutar otro script tsql desde el script tsql actual?
Esto está destinado a ejecutarse a través de SQL Server Management Studio (SSMS).
¡Gracias!
La forma más simple sería hacer que los scripts almacenan 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 dice @Abe Miesller (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 archivos 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.
O simplemente usa openrowset para leer tu script 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)
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 puedes ejecutar este código en sms, o en un procedimiento almacenado (llamado de forma programada tal vez) 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
Suponiendo que quiera 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 que desee.