2008-10-28 4 views
29

J'ai un certain nombre de fichiers .sql générés que je veux exécuter successivement. Je voudrais 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 ça et si oui, quelle est la syntaxe pour le faire?Est-il possible d'exécuter un fichier texte à partir d'une requête SQL?

J'espère quelque chose comme:

exec 'c:\temp\file01.sql' 
exec 'c:\temp\file02.sql' 

J'utilise SQL Server 2005 et les requêtes en cours d'exécution en studio de gestion.

Répondre

38

utilisation xp_cmdshell et sqlcmd

EXEC xp_cmdshell 'sqlcmd -S ' + @DBServerName + ' -d ' + @DBName + ' -i ' + @FilePathName 
4

Je ne recommande le faire, mais si vous avez vraiment alors la procédure stockée étendue xp_cmdshell 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 

Note: xp_cmdshell exécute des commandes en arrière-plan, à cause de cela, il ne doit pas être utilisé pour exécuter des programmes exiger une entrée de l'utilisateur.

2

Jetez un coup d'œil à OSQL. Cet utilitaire vous permet d'exécuter SQL à partir de l'invite de commande. Il est facile de s'installer sur un système, je pense qu'il est livré avec le SQL Server Express gratuit.

Using the osql Utility

Une recherche qick de « OSQL » en cas de débordement de la pile montre beaucoup de choses est disponible.

La principale chose à gérer correctement est les paramètres de compte d'utilisateur et de mot de passe qui sont passés sur la ligne de commande. J'ai vu des fichiers batch qui utilisent des permissions d'accès au fichier NT pour contrôler le fichier avec le mot de passe et ensuite utiliser le contenu de ce fichier pour lancer le script. Vous pouvez également écrire un rapide programme C# ou VB pour l'exécuter en utilisant la classe Process.

+1

Je ne sais pas ce que la recherche rapide montre mais OSQL est déconseillé en faveur de SQLCMD à partir de SQL Server 2005. L'exécution de OSQL même sur une machine avec SQL Server 2005 montre: "Remarque: osql ne supporte pas toutes les fonctionnalités de SQL Server 2005. Utilisez plutôt sqlcmd.Consultez la documentation en ligne de SQL Server pour plus de détails. " –

6

C'est ce que j'utilise. Fonctionne bien et est simple à réutiliser. Il peut être changé pour lire tous les fichiers dans le répertoire, mais de cette façon je peux contrôler ceux à exécuter.

/* 
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 
+0

Bonne solution J'ai également combiné la réponse d'Archi Moore pour activer et désactiver la fonctionnalité xp_cmdshell –

13

très utile grâce, vous pouvez aussi consulter ce lien: Execute SQL Server scripts pour un exemple similaire. Pour activer xp_cmdshell et descendre 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 
4

Ou tout simplement utiliser openrowset pour lire votre script dans une variable et l'exécuter (désolé pour faire revivre un 8 Sujet ans):

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

--PRINT @sql 
EXEC (@sql) 
Questions connexes