Можно ли выполнить текстовый файл из запроса SQL? - PullRequest
34 голосов
/ 28 октября 2008

У меня есть несколько сгенерированных файлов .sql, которые я хочу запустить подряд. Я хотел бы запустить их из оператора SQL в запросе (например, Query Analyzer / Server Management Studio).
Можно ли сделать что-то подобное и если да, то каков синтаксис для этого?

Я надеюсь на что-то вроде:

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

Я использую SQL Server 2005 и выполняю запросы в Management Studio.

Ответы [ 7 ]

46 голосов
/ 28 октября 2008

использование xp_cmdshell и sqlcmd

EXEC xp_cmdshell  'sqlcmd -S ' + @DBServerName + ' -d  ' + @DBName + ' -i ' + @FilePathName
16 голосов
/ 02 августа 2012

Очень полезно спасибо, смотрите также эту ссылку: Выполнение сценариев SQL Server для аналогичного примера. Чтобы включить или выключить xp_cmdshell, см. Ниже:

На

SET NOCOUNT ON  
EXEC master.dbo.sp_configure 'show advanced options', 1 
RECONFIGURE 
EXEC master.dbo.sp_configure 'xp_cmdshell', 1 
RECONFIGURE 

Выкл

EXEC master.dbo.sp_configure 'xp_cmdshell', 0 
RECONFIGURE 
EXEC master.dbo.sp_configure 'show advanced options', 0 
RECONFIGURE  
SET NOCOUNT OFF 
6 голосов
/ 07 июля 2011

Это то, что я использую. Работает хорошо и прост в повторном использовании. Его можно изменить для чтения всех файлов в каталоге, но таким образом я получаю контроль над тем, какие из них выполнять.

/*  
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  
5 голосов
/ 06 декабря 2016

Или просто используйте openrowset, чтобы прочитать ваш скрипт в переменную и выполнить его (извините за возрождение 8-летней темы):

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

--PRINT @sql
EXEC (@sql)
5 голосов
/ 28 октября 2008

Я бы не рекомендовал это делать, но если вам действительно нужно, тогда вам нужна расширенная хранимая процедура xp_cmdshell. Сначала вам нужно будет прочитать содержимое файла в переменную, а затем использовать что-то вроде этого:

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

Примечание: xp_cmdshell запускает команды в фоновом режиме, поэтому его нельзя использовать для запуска программ, требующих пользовательского ввода.

3 голосов
/ 28 октября 2008

Посмотрите на OSQL. Эта утилита позволяет запускать SQL из командной строки. В систему легко установить, я думаю, что она поставляется с бесплатным SQL Server Express.

Использование утилиты osql

Поиск qick «OSQL» при переполнении стека показывает, что доступно много вещей.

Главное, что нужно правильно обработать, это параметры учетной записи пользователя и пароля, которые передаются в командной строке. Я видел командные файлы, которые используют права доступа к файлам NT для управления файлом с помощью пароля, а затем использовали содержимое этого файла для запуска сценария. Вы также можете написать быструю программу на C # или VB для ее запуска с использованием класса Process.

0 голосов
/ 25 октября 2018

Открыть окно командной строки (CMD)

sqlcmd -S localhost -d NorthWind -i "C:\MyScript.sql"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...