web-dev-qa-db-fra.com

Est-il possible d'exécuter un fichier texte à partir d'une requête SQL?

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.

32
ChrisHDog

utilisez xp_cmdshell et sqlcmd

EXEC xp_cmdshell  'sqlcmd -S ' + @DBServerName + ' -d  ' + @DBName + ' -i ' + @FilePathName
43
Gulzar Nazim

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 
14
Archi Moore

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  
6
Bruce Thompson

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)
5
Pesche Helfer

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. 

5
Mitch Wheat

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.

3
John Dyer

Ouvrir la ligne de commande Windows (CMD)

sqlcmd -S localhost -d NorthWind -i "C:\MyScript.sql"
0
Alper Ebicoglu