J'ai un certain nombre de fichiers .sql générés que je veux exécuter successivement. J'aimerais les exécuter à partir d'une instruction SQL dans une requête (c'est-à-dire Query Analyzer/Server Management Studio).
Est-il possible de faire quelque chose comme ceci et si oui quelle est la syntaxe pour le faire?
J'espère quelque chose comme:
exec 'c:\temp\file01.sql'
exec 'c:\temp\file02.sql'
J'utilise SQL Server 2005 et j'exécute des requêtes dans le studio de gestion.
utilisez xp_cmdshell et sqlcmd
EXEC xp_cmdshell 'sqlcmd -S ' + @DBServerName + ' -d ' + @DBName + ' -i ' + @FilePathName
Très utile merci, voir aussi ce lien: Exécutez les scripts SQL Server Pour un exemple similaire . Pour activer et désactiver xp_cmdshell
, voir ci-dessous:
Sur
SET NOCOUNT ON
EXEC master.dbo.sp_configure 'show advanced options', 1
RECONFIGURE
EXEC master.dbo.sp_configure 'xp_cmdshell', 1
RECONFIGURE
Off
EXEC master.dbo.sp_configure 'xp_cmdshell', 0
RECONFIGURE
EXEC master.dbo.sp_configure 'show advanced options', 0
RECONFIGURE
SET NOCOUNT OFF
C'est ce que j'utilise. Fonctionne bien et est simple à réutiliser. Il peut être modifié pour lire tous les fichiers du répertoire, mais de cette façon, je peux contrôler ceux qui vont être exécutés.
/*
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
Ou utilisez simplement openrowset pour lire votre script dans une variable et l'exécuter (désolée de faire revivre un sujet de 8 ans):
DECLARE @SQL varchar(MAX)
SELECT @SQL = BulkColumn
FROM OPENROWSET
( BULK 'MeinPfad\MeinSkript.sql'
, SINGLE_BLOB ) AS MYTABLE
--PRINT @sql
EXEC (@sql)
Je ne vous le recommanderais pas, mais si vous devez réellement utiliser la procédure stockée étendue xp_cmdshell
, c'est ce que vous voulez. Vous devrez d'abord lire le contenu du fichier dans une variable, puis utiliser quelque chose comme ceci:
DECLARE @cmd sysname, @var sysname
SET @var = 'Hello world'
SET @cmd = 'echo ' + @var + ' > var_out.txt'
EXEC master..xp_cmdshell @cmd
Remarque: xp_cmdshell exécute des commandes en arrière-plan. Pour cette raison, il ne doit pas être utilisé pour exécuter des programmes nécessitant une intervention de l'utilisateur.
Jetez un coup d'œil à OSQL. Cet utilitaire vous permet d'exécuter SQL à partir de la commande Invite. Il est facile de s’installer sur un système, je pense qu’il est livré avec le logiciel gratuit SQL Server Express.
Utilisation de l'utilitaire osql
Une recherche rapide de "OSQL" sur le dépassement de pile montre qu'un grand nombre d'éléments est disponible.
La principale chose à gérer correctement est les paramètres de compte utilisateur et mot de passe qui sont transmis sur la ligne de commande. J'ai vu des fichiers de commandes utilisant les autorisations d'accès aux fichiers NT pour contrôler le fichier avec le mot de passe, puis utiliser le contenu de ce fichier pour lancer le script. Vous pouvez également écrire un programme rapide C # ou VB pour l'exécuter à l'aide de la classe Process.
Ouvrir la ligne de commande Windows (CMD)
sqlcmd -S localhost -d NorthWind -i "C:\MyScript.sql"