Можно ли выполнить текстовый файл из SQL-запроса?

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

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

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

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

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
37
0
79 198
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

Ответ принят как подходящий

используйте xp_cmdshell и sqlcmd

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

Можно ли исключить это и на sql Azure?

Ahmed Elbatt 17.06.2019 16:17

Я бы не рекомендовал это делать, но если вам действительно нужно, то расширенная хранимая процедура 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

Быстрый поиск "OSQL" при переполнении стека показывает, что доступно много всего.

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

Я не знаю, что показывает быстрый поиск, но OSQL устарел в пользу SQLCMD, начиная с SQL Server 2005. Запуск OSQL даже на машине с SQL Server 2005 показывает: «Примечание: osql не поддерживает все функции SQL Server 2005. Вместо этого используйте sqlcmd. Подробнее см. В электронной документации по SQL Server "

Gennady Vanin Геннадий Ванин 26.10.2010 13:10

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

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

Tahir Khalid 03.10.2017 13:54

Очень полезно, спасибо, см. Также эту ссылку: Выполнение сценариев 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. Спасибо!

Igor 14.06.2019 21:26

Для тех, кто наткнулся на этот вопрос, как и я, и мог бы найти это полезным, мне понравился Ответ Брюса Томпсона (который запускал 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 своим именем сервера, если это не локальный сервер.

Другие вопросы по теме