2008-10-28 36 views
29

Tôi có một số tệp .sql được tạo mà tôi muốn chạy liên tiếp. Tôi muốn chạy chúng từ một câu lệnh SQL trong một truy vấn (ví dụ: Query Analyzer/Server Management Studio).
Có thể làm điều gì đó như thế này không và nếu đó cú pháp để thực hiện điều này là gì?Có thể thực thi tệp văn bản từ truy vấn SQL không?

Tôi hy vọng cho một cái gì đó như:

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

Tôi đang sử dụng SQL Server 2005 và chạy các truy vấn trong studio quản lý.

Trả lời

38

sử dụng xp_cmdshellsqlcmd

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

tôi sẽ không được khuyến khích làm điều này, nhưng nếu bạn thực sự phải sau đó các thủ tục lưu trữ mở rộng xp_cmdshell là những gì bạn muốn. Bạn sẽ phải đầu tiên đọc nội dung của tập tin vào một biến và sau đó sử dụng một cái gì đó như thế này:

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

Lưu ý: xp_cmdshell chạy lệnh ở chế độ nền, vì điều này, nó không được sử dụng để chạy chương trình yêu cầu đầu vào của người dùng.

2

Hãy xem OSQL. Tiện ích này cho phép bạn chạy SQL từ dấu nhắc lệnh. Thật dễ dàng để cài đặt trên một hệ thống, tôi nghĩ nó đi kèm với SQL Server Express miễn phí.

Using the osql Utility

Một tìm kiếm qick của "OSQL" trên stack overflow cho thấy rất nhiều thứ có sẵn.

Điều chính để xử lý đúng là thông số tài khoản người dùng và mật khẩu được truyền vào trên dòng lệnh. Tôi đã thấy các tập tin batch sử dụng quyền truy cập tập tin NT để kiểm soát các tập tin với mật khẩu và sau đó sử dụng nội dung của tập tin này để có được kịch bản bắt đầu. Bạn cũng có thể viết một chương trình C# hoặc VB nhanh để chạy nó bằng cách sử dụng lớp Process.

+1

Tôi không biết tìm kiếm nhanh nào nhưng OSQL là không được ủng hộ SQLCMD bắt đầu từ SQL Server 2005. Chạy OSQL ngay cả trên máy với SQL Server 2005 cho thấy: "Lưu ý: osql không hỗ trợ tất cả các tính năng của SQL Server 2005. Sử dụng sqlcmd để thay thế.Xem SQL Server Books Online để biết chi tiết " –

6

Đây là những gì tôi sử dụng. Hoạt động tốt và rất dễ sử dụng lại. Nó có thể được thay đổi để đọc tất cả các tệp trong thư mục, nhưng theo cách này tôi có thể kiểm soát những tệp nào cần thực thi.

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

Giải pháp tốt tôi cũng kết hợp câu trả lời của Archi Moore để bật và tắt tính năng xp_cmdshell –

13

Rất hữu ích nhờ, xem thêm liên kết này: Execute SQL Server scripts cho một ví dụ tương tự. Để bật xp_cmdshell và tắt xem dưới đây:

On

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

Tắt

EXEC master.dbo.sp_configure 'xp_cmdshell', 0 
RECONFIGURE 
EXEC master.dbo.sp_configure 'show advanced options', 0 
RECONFIGURE 
SET NOCOUNT OFF 
4

Hoặc chỉ cần sử dụng openrowset để đọc kịch bản của bạn vào một biến và thực hiện nó (xin lỗi vì làm sống lại một 8 chủ đề cũ):

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

--PRINT @sql 
EXEC (@sql) 
Các vấn đề liên quan