我有一些我想要連續運行的生成的.sql文件。我想從查詢中的SQL語句(即查詢分析器/服務器管理工作室)運行它們。
是否有可能做這樣的事情,如果是這樣做的語法是什麼?是否可以從SQL查詢執行文本文件?
我希望這樣的事情:
exec 'c:\temp\file01.sql'
exec 'c:\temp\file02.sql'
我使用SQL Server 2005和運行管理工作室查詢。
我有一些我想要連續運行的生成的.sql文件。我想從查詢中的SQL語句(即查詢分析器/服務器管理工作室)運行它們。
是否有可能做這樣的事情,如果是這樣做的語法是什麼?是否可以從SQL查詢執行文本文件?
我希望這樣的事情:
exec 'c:\temp\file01.sql'
exec 'c:\temp\file02.sql'
我使用SQL Server 2005和運行管理工作室查詢。
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。
一個qick搜索在堆棧溢出「OSQL」的顯示了很多的東西是可用的。
正確處理的主要問題是在命令行中傳遞的用戶和密碼帳戶參數。我看到使用NT文件訪問權限的批處理文件用密碼來控制文件,然後使用該文件的內容來啓動腳本。您也可以編寫一個快速的C#或VB程序來使用Process類運行它。
這就是我使用的。工作良好,易於重複使用。它可以被改變爲讀取目錄中的所有文件,但是這樣我可以控制執行哪些文件。
/*
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功能 – 2017-10-03 10:54:01
非常有幫助的感謝,也看到此鏈接: Execute SQL Server scripts 一個類似的例子。 要打開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)
我不知道快速搜索顯示的是什麼,但是OSQL是不推薦使用SQL Server 2005開始的SQLCMD。即使在使用SQL Server 2005的計算機上運行OSQL也會顯示:「注意:osql不支持SQL Server 2005的所有功能。請改用sqlcmd。有關詳細信息,請參閱SQL Server聯機叢書「 – 2010-10-26 09:10:44