it-swarm.com.de

Ist es möglich, eine Textdatei aus einer SQL-Abfrage auszuführen?

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 (d. H. Query Analyzer/Server Management Studio).
Ist es möglich, so etwas zu tun, und wenn ja, wie lautet die Syntax dafür?

Ich hoffe auf etwas wie:

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

Ich verwende SQL Server 2005 und führe Abfragen in Management Studio aus.

32
ChrisHDog

benutze xp_cmdshell und sqlcmd

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

Sehr hilfreicher Dank. Siehe auch diesen Link: SQL Server-Skripts ausführen Für ein ähnliches Beispiel . Zum Aktivieren und Deaktivieren von xp_cmdshell siehe 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 
14
Archi Moore

Das ist was ich benutze. Funktioniert gut und ist einfach wiederzuverwenden. Es kann geändert werden, um alle Dateien im Verzeichnis zu lesen. Auf diese Weise kann ich steuern, welche Dateien 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  
6
Bruce Thompson

Oder verwenden Sie openrowset, um Ihr Skript in eine Variable zu lesen und auszuführen (tut mir leid, dass Sie ein 8 Jahre altes Thema wiederbelebt haben):

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

--PRINT @sql
EXEC (@sql)
5
Pesche Helfer

Ich würde dies nicht empfehlen, aber wenn Sie wirklich müssen, dann ist die erweiterte gespeicherte Prozedur xp_cmdshell das, was Sie wollen. Sie müssen zuerst den Inhalt der Datei in eine Variable einlesen und dann 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 aus. Aus diesem Grund dürfen keine Programme ausgeführt werden, die eine Benutzereingabe erfordern. 

5
Mitch Wheat

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.

Verwenden des osql-Dienstprogramms

Eine schnelle Suche nach "OSQL" im Stapelüberlauf zeigt, dass eine Menge Material verfügbar ist.

Richtig zu behandeln sind vor allem die Benutzer- und Kennwort-Kontoparameter, die in der Befehlszeile übergeben werden. Ich habe Batch-Dateien gesehen, die NT-Dateizugriffsberechtigungen verwenden, um die Datei mit dem Kennwort zu steuern, und dann den Inhalt dieser Datei 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.

3
John Dyer

Wenn Sie die Windows-Authentifizierung als anderer Benutzer ausführen: Öffnen Sie die Eingabeaufforderung als Windows-Benutzer (Klicken Sie mit der rechten Maustaste darauf, öffnen Sie den Dateispeicherort, Umschalttaste + Rechtsklick, Als anderer Benutzer ausführen).

 sqlcmd -S localhost\SQLEXPRESS -d DatabaseName-i "c:\temp\script.sql"

Oder wenn Sie SQL Server-Benutzer verwenden:

sqlcmd -S localhost\SQLEXPRESS -d DatabaseName-i "c:\temp\script.sql" -U UserName -P Password

Ersetzen Sie localhost\SQLEXPRESS durch Ihren Servernamen, wenn dies nicht der Fall ist.

2
live-love

Wenn jemand auf diese Frage stolpert, wie ich es tat und dies nützlich finden könnte, mochte ich Bruce Thompsons Antwort (der SQL aus Dateien in einer Schleife ausführte), aber ich bevorzuge Pesche Helfers Herangehensweise an Dateien) Ausführung (da die Verwendung von xp_cmdshell vermieden wurde).

Also habe ich die beiden kombiniert (und leicht angepasst, damit alles aus einem Ordner anstatt einer manuell erstellten Liste ausgeführt wird):

DECLARE @Dir NVARCHAR(512) = 'd:\SQLScriptsDirectory'

DECLARE @FileList TABLE (
  subdirectory NVARCHAR(512),
  depth int,
  [file] bit
)

INSERT @FileList
EXEC Master.dbo.xp_DirTree @Dir,1,1

WHILE (SELECT COUNT(*) FROM @FileList) > 0  
BEGIN  
   DECLARE @FileName NVARCHAR(MAX) = (SELECT TOP(1) subdirectory FROM @FileList) 
   DECLARE @FullPath NVARCHAR(MAX) = @Dir + '\' + @FileName

   DECLARE @SQL NVARCHAR(MAX)
   DECLARE @SQL_TO_EXEC NVARCHAR(MAX)
   SELECT @SQL_TO_EXEC = 'select @SQL = BulkColumn
   FROM OPENROWSET
       (   BULK ''' + @FullPath + '''
       ,   SINGLE_BLOB ) AS MYTABLE'

   DECLARE @parmsdeclare NVARCHAR(4000) = '@SQL varchar(max) OUTPUT'  

   EXEC sp_executesql @stmt = @SQL_TO_EXEC
                 , @params = @parmsdeclare
                 , @SQL = @SQL OUTPUT  

   EXEC (@sql)
   DELETE FROM @FileList WHERE subdirectory = @FileName  

   PRINT 'EXECUTED: ' + @FileName     
END
1
Adam Henderson

Windows-Befehlszeile (CMD) öffnen

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