procedimientos - ¿Es posible ejecutar un archivo de texto desde una consulta SQL?
procedimientos y funciones oracle pl/sql (6)
Esto es lo que uso Funciona bien y es fácil de reutilizar. Se puede cambiar para leer todos los archivos en el directorio, pero de esta manera puedo controlar cuáles ejecutar.
/*
execute a list of .sql files against the server and DB specified
*/
SET NOCOUNT ON
SET XACT_ABORT ON
BEGIN TRAN
DECLARE @DBServerName VARCHAR(100) = ''servername''
DECLARE @DBName VARCHAR(100) = ''db name''
DECLARE @FilePath VARCHAR(200) = ''path to scrips/'
/*
create a holder for all filenames to be executed
*/
DECLARE @FileList TABLE (Files NVARCHAR(MAX))
INSERT INTO @FileList VALUES (''script 1.sql'')
INSERT INTO @FileList VALUES (''script 2.sql'')
INSERT INTO @FileList VALUES (''script X.sql'')
WHILE (SELECT COUNT(Files) FROM @FileList) > 0
BEGIN
/*
execute each file one at a time
*/
DECLARE @FileName NVARCHAR(MAX) = (SELECT TOP(1) Files FROM @FileList)
DECLARE @command VARCHAR(500) = ''sqlcmd -S '' + @DBServerName + '' -d '' + @DBName + '' -i "'' + @FilePath + @Filename +''"''
EXEC xp_cmdshell @command
PRINT ''EXECUTED: '' + @FileName
DELETE FROM @FileList WHERE Files = @FileName
END
COMMIT TRAN
Tengo una cantidad de archivos .sql generados que quiero ejecutar en sucesión. Me gustaría ejecutarlos desde una declaración SQL en una consulta (es decir, Query Analyzer / Server Management Studio).
¿Es posible hacer algo como esto y, en caso afirmativo, cuál es la sintaxis para hacer esto?
Estoy esperando algo como:
exec ''c:/temp/file01.sql''
exec ''c:/temp/file02.sql''
Estoy usando SQL Server 2005 y ejecutando consultas en el estudio de administración.
Eche un vistazo a OSQL. Esta utilidad te permite ejecutar SQL desde el símbolo del sistema. Es fácil de instalar en un sistema, creo que viene con el SQL Server Express gratis.
Una búsqueda rápida de "OSQL" en el desbordamiento de la pila muestra que hay muchas cosas disponibles.
Lo principal para manejar correctamente es el usuario y los parámetros de la cuenta de contraseña que se pasan en la línea de comando. He visto archivos por lotes que usan permisos de acceso a archivos NT para controlar el archivo con la contraseña y luego usar el contenido de este archivo para iniciar el script. También puede escribir un programa rápido C # o VB para ejecutarlo utilizando la clase Process.
No recomendaría hacer esto, pero si realmente lo necesita, entonces el procedimiento almacenado extendido xp_cmdshell
es lo que desea. Primero tendrá que leer los contenidos del archivo en una variable y luego usar algo como esto:
DECLARE @cmd sysname, @var sysname
SET @var = ''Hello world''
SET @cmd = ''echo '' + @var + '' > var_out.txt''
EXEC master..xp_cmdshell @cmd
Nota: xp_cmdshell ejecuta comandos en segundo plano, debido a esto, no debe usarse para ejecutar programas que requieren la entrada del usuario.
use xp_cmdshell y sqlcmd
EXEC xp_cmdshell ''sqlcmd -S '' + @DBServerName + '' -d '' + @DBName + '' -i '' + @FilePathName
O simplemente use openrowset para leer su script en una variable y ejecutarlo (lo siento por revivir un tema de hace 8 años):
DECLARE @SQL varchar(MAX)
SELECT @SQL = BulkColumn
FROM OPENROWSET
( BULK ''MeinPfad/MeinSkript.sql''
, SINGLE_BLOB ) AS MYTABLE
--PRINT @sql
EXEC (@sql)
Muy útil gracias, vea también este enlace: Ejecutar scripts de SQL Server para un ejemplo similar. Para activar y desactivar xp_cmdshell
consulte a continuación:
En
SET NOCOUNT ON
EXEC master.dbo.sp_configure ''show advanced options'', 1
RECONFIGURE
EXEC master.dbo.sp_configure ''xp_cmdshell'', 1
RECONFIGURE
Apagado
EXEC master.dbo.sp_configure ''xp_cmdshell'', 0
RECONFIGURE
EXEC master.dbo.sp_configure ''show advanced options'', 0
RECONFIGURE
SET NOCOUNT OFF