75 votes

TransactSQL pour exécuter un autre script TransactSQL

J'ai 10 scripts de transaction SQL qui créent chacun un tableau et le remplissent de données.

J'essaie de créer un script maître SQL qui exécutera chacun des 10 autres scripts.

Existe-t-il un moyen avec TSQL / TRANSACTSQL pour Microsoft SQL Server 2008 d'exécuter un autre script tsql à partir du script tsql actuel?

Cela est destiné à être exécuté via SQL Server Management Studio (SSMS).

Merci!

109voto

Abe Miessler Points 34869

Essayez ceci si vous essayez d’exécuter un fichier .sql dans SSMS:

 :r C:\Scripts\Script1.sql
:r C:\Scripts\Script2.sql
:r C:\Scripts\Script3.sql
...
 

Si ce sont des scripts que vous exécutez assez souvent, vous pouvez envisager de les déposer dans un proc stocké et de les exécuter de cette façon ...

Vous pouvez également le faire via sqlcmd (que je crois plus commun):

 sqlcmd -S serverName\instanceName -i C:\Scripts\Script1.sql
 

6voto

Shane Delmore Points 970

Vous pouvez utiliser l'utilitaire osql ou mieux encore, de la plus récente sqlcmd presque de façon interchangeable. Je suis l'aide de osql dans cet exemple, seul, car il m'est arrivé d'avoir un exemple de code assis autour de lui, mais dans la production, je suis à l'aide de l'utilitaire sqlcmd. Voici une aide de l'extrait de code à partir d'un grand procédure que j'utilise pour exécuter des scripts de mise à jour sur les bases de données. Ils sont commandés par des majeurs, mineurs, de libération, de construire comme j'ai le nom de mon scripts à l'aide de cette convention afin de suivre les rejets. Vous êtes évidemment manquer tous de mon erreur de transmission, les parties où je tire scripts disponibles à partir de la base de données, configuration des variables, etc ... mais vous pouvez toujours trouver ce morceau de code utile.

La partie principale que j'aime à propos de l'utilisation d'osql ou sqlcmd est que vous pouvez exécuter ce code dans ssms, ou dans une procédure stockée (appelée sur une base régulière peut-être) ou à partir d'un fichier de commandes. Très 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

5voto

Philip Kelley Points 19032

Le plus simple serait de rendre vos scripts de procédures stockées et de les appeler (via l' EXECUTE commande) chaque procédure de tourner à partir d'un centre de procédure. C'est idéal si vous allez exécuter exactement le même script(s) plus et plus de nouveau (ou le même script avec différents paramètres passés).

Si vos scripts .sql (ou n'importe quel type de texte) de fichiers, comme @Abe Miesller dit (upvoted) vous pouvez les exécuter à partir de l'intérieur de SSMS via l' :r de la commande, lorsque SQLCMD mode est activé. Vous devez connaître et le script exact du fichier chemin d'accès et le nom. Cela ne peut être fait à partir de l'intérieur d'une procédure stockée.

Une dernière alternative, utilisable avec "connu" les noms de fichier et nécessaire pour arbitraire des noms de fichiers (par exemple, tous les fichiers chargés dans un sous-dossier) est d'exploiter la puissance de la prolongation de la procédure d' XP_CMDSHELL. De telles solutions peuvent obtenir compelx assez rapide (de l'utiliser pour récupérer la liste des fichiers, créer et exécuter via xp_cmdshell une chaîne d'appel SQLCMD pour chaque fichier, gérer les résultats et les erreurs via des fichiers de sortie, il va sur et sur) donc je ne pourrais que faire cela comme un dernier recours.

2voto

Russell McClure Points 2704

En supposant que vous souhaitiez conserver les 10 scripts dans leurs propres fichiers, le meilleur moyen de créer ce que vous voulez consiste à créer un fichier de commandes qui exécute osql.exe pour exécuter les 10 scripts dans l'ordre de votre choix.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X