2008-10-28 13 views
29

Ich habe eine Reihe von generierten .SQL-Dateien, die ich nacheinander ausführen möchte. Ich möchte sie von einer SQL-Anweisung in einer Abfrage ausführen (z. B. Query Analyzer/Server Management Studio).
Ist es möglich, so etwas zu tun und wenn ja, wie lautet die Syntax dafür?Ist es möglich, eine Textdatei aus einer SQL-Abfrage auszuführen?

Ich hoffe auf so etwas wie:

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

ich SQL Server 2005 verwenden und Abfragen in Management Studio ausgeführt wird.

Antwort

38

Verwendung xp_cmdshell und sqlcmd

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

Ich würde dies nicht zu empfehlen zu tun, aber wenn Sie wirklich haben dann die erweiterte gespeicherte Prozedur xp_cmdshell ist, was Sie wollen. Sie müssen zuerst den Inhalt der Datei in eine Variable lesen und dann so etwas wie folgt verwenden:

DECLARE @cmd sysname, @var sysname 
SET @var = 'Hello world' 
SET @cmd = 'echo ' + @var + ' > var_out.txt' 
EXEC master..xp_cmdshell @cmd 

Hinweis: xp_cmdshell führt Befehle im Hintergrund, weil dieser, darf es nicht laufen Programme genutzt werden, erfordern Benutzereingaben.

2

Werfen Sie einen Blick auf OSQL. Mit diesem Dienstprogramm können Sie SQL über die Eingabeaufforderung ausführen. Es ist einfach, auf einem System installiert zu werden, ich denke, es kommt mit dem kostenlosen SQL Server Express.

Using the osql Utility

A qick Suche nach "OSQL" auf Stack-Überlauf zeigt eine Menge Material zur Verfügung steht.

Die Hauptsache, um richtig zu behandeln, sind die Benutzer- und Kennwort-Konto-Parameter, die in der Befehlszeile übergeben werden. Ich habe Batchdateien gesehen, die NT-Dateizugriffsberechtigungen verwenden, um die Datei mit dem Kennwort zu steuern und dann den Inhalt dieser Datei zu verwenden, um das Skript zu starten. Sie können auch ein schnelles C# - oder VB-Programm schreiben, um es mit der Process-Klasse auszuführen.

+1

ich weiß nicht, was eine schnelle Suche zeigt aber OSQL ist Der Einsatz von SQLCMD wird ab SQL Server 2005 eingestellt. Das Ausführen von OSQL selbst auf Computern mit SQL Server 2005 zeigt: "Hinweis: osql unterstützt nicht alle Funktionen von SQL Server 2005. Verwenden Sie stattdessen sqlcmd.Weitere Informationen finden Sie in der SQL Server-Onlinedokumentation. " –

6

Dies ist, was ich verwende. Funktioniert gut und ist einfach wiederzuverwenden. Es kann geändert werden, um alle Dateien im Verzeichnis zu lesen, aber auf diese Weise kann ich steuern, welche ausgeführt werden sollen.

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

Gute Lösung Ich habe auch Archi Moores Antwort kombiniert, um die Funktion xp_cmdshell zu aktivieren und zu deaktivieren –

13

Sehr hilfreich Dank, auch diesen Link: Execute SQL Server scripts für ein ähnliches Beispiel. So schalten xp_cmdshell und Ausschalten unten:

Auf

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

Oder nur OPENROWSET verwenden Ihr Skript in eine Variable zu lesen und (sorry ausführen, um eine 8 für die Wiederbelebung altes Thema Jahre):

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

--PRINT @sql 
EXEC (@sql) 
Verwandte Themen