2008-10-28 100 views
29

我有一些我想要連續運行的生成的.sql文件。我想從查詢中的SQL語句(即查詢分析器/服務器管理工​​作室)運行它們。
是否有可能做這樣的事情,如果是這樣做的語法是什麼?是否可以從SQL查詢執行文本文件?

我希望這樣的事情:

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

我使用SQL Server 2005和運行管理工作室查詢。

回答

38

使用xp_cmdshellsqlcmd

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

但我不推薦這樣做,但如果你真的有那麼擴展存儲過程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的運行命令在後臺,正因爲如此,它不能用來運行程序,需要用戶輸入。

2

看看OSQL。該實用程序允許您從命令提示符運行SQL。安裝在系統上很容易,我認爲它帶有免費的SQL Server Express。

Using the osql Utility

一個qick搜索在堆棧溢出「OSQL」的顯示了很多的東西是可用的。

正確處理的主要問題是在命令行中傳遞的用戶和密碼帳戶參數。我看到使用NT文件訪問權限的批處理文件用密碼來控制文件,然後使用該文件的內容來啓動腳本。您也可以編寫一個快速的C#或VB程序來使用Process類運行它。

+1

我不知道快速搜索顯示的是什麼,但是OSQL是不推薦使用SQL Server 2005開始的SQLCMD。即使在使用SQL Server 2005的計算機上運行OSQL也會顯示:「注意:osql不支持SQL Server 2005的所有功能。請改用sqlcmd。有關詳細信息,請參閱SQL Server聯機叢書「 – 2010-10-26 09:10:44

6

這就是我使用的。工作良好,易於重複使用。它可以被改變爲讀取目錄中的所有文件,但是這樣我可以控制執行哪些文件。

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

好的解決方案我還結合了Archi Moore的答案來啓用和禁用xp_cmdshell功能 – 2017-10-03 10:54:01

13

非常有幫助的感謝,也看到此鏈接: 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 
4

或者只是使用OPENROWSET讀你的腳本到一個變量,並執行它(抱歉重振8年老主題):

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

--PRINT @sql 
EXEC (@sql) 
相關問題