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


используйте xp_cmdshell и sqlcmd
EXEC xp_cmdshell 'sqlcmd -S ' + @DBServerName + ' -d ' + @DBName + ' -i ' + @FilePathName
Я бы не рекомендовал это делать, но если вам действительно нужно, то расширенная хранимая процедура 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 запускает команды в фоновом режиме, поэтому его нельзя использовать для запуска программ, требующих ввода данных пользователем.
Взгляните на OSQL. Эта утилита позволяет запускать SQL из командной строки. Его легко установить в системе, я думаю, он поставляется с бесплатным SQL Server Express.
Быстрый поиск "OSQL" при переполнении стека показывает, что доступно много всего.
Главное, что нужно правильно обработать, - это параметры учетной записи пользователя и пароля, которые передаются в командной строке. Я видел командные файлы, которые используют права доступа к файлу NT для управления файлом с паролем, а затем используют содержимое этого файла для запуска сценария. Вы также можете написать быструю программу на C# или VB для ее запуска с использованием класса Process.
Я не знаю, что показывает быстрый поиск, но OSQL устарел в пользу SQLCMD, начиная с SQL Server 2005. Запуск OSQL даже на машине с SQL Server 2005 показывает: «Примечание: osql не поддерживает все функции SQL Server 2005. Вместо этого используйте sqlcmd. Подробнее см. В электронной документации по SQL Server "
Это то, что я использую. Хорошо работает и прост в использовании. Его можно изменить для чтения всех файлов в каталоге, но таким образом я могу контролировать, какие из них выполнять.
/*
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
Хорошее решение Я также объединил ответ Archi Moore, чтобы включить и отключить функцию xp_cmdshell
Очень полезно, спасибо, см. Также эту ссылку:
Выполнение сценариев 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
Или просто используйте openrowset, чтобы прочитать ваш скрипт в переменной и выполнить его (извините за возрождение темы 8-летней давности):
DECLARE @SQL varchar(MAX)
SELECT @SQL = BulkColumn
FROM OPENROWSET
( BULK 'MeinPfad\MeinSkript.sql'
, SINGLE_BLOB ) AS MYTABLE
--PRINT @sql
EXEC (@sql)
Откройте командную строку Windows (CMD)
sqlcmd -S localhost -d NorthWind -i "C:\MyScript.sql"
Это сработало для меня, мне просто нужно было обновить «localhost» до нашего адреса SQL Server и «NorthWind» до имени базы данных. Обе текстовые строки легко доступны в SSMS. Спасибо!
Для тех, кто наткнулся на этот вопрос, как и я, и мог бы найти это полезным, мне понравился Ответ Брюса Томпсона (который запускал SQL из файлов в цикле), но я предпочел Подход Пеше Хелфера к исполнению файлов (поскольку он избегал использования xp_cmdshell).
Поэтому я объединил их (и немного подправил, чтобы запускать все из папки, а не вручную созданного списка):
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
Для проверки подлинности Windows, если вы работаете как другой пользователь: Откройте командную строку от имени пользователя Windows (щелкните ее правой кнопкой мыши, откройте расположение файла, Shift + щелкните правой кнопкой мыши, запустить от имени другого пользователя)
sqlcmd -S localhost\SQLEXPRESS -d DatabaseName-i "c:\temp\script.sql"
Или, если вы используете пользователя Sql Server:
sqlcmd -S localhost\SQLEXPRESS -d DatabaseName-i "c:\temp\script.sql" -U UserName -P Password
Замените localhost \ SQLEXPRESS своим именем сервера, если это не локальный сервер.
Можно ли исключить это и на sql Azure?