2009-05-11 34 views
24

Điều này có vẻ như một câu hỏi vô cùng ngu ngốc phải hỏi, nhưng làm thế nào để tôi có được SQL Server Management Studio ngừng xử lý một kịch bản SQL khi nó gặp một lỗi?Làm cách nào để có được SQL Server Management Studio ngừng xử lý lỗi?

Tôi có một tập lệnh dài và nếu có lỗi ở SSMS bắt đầu, hãy báo cáo và sau đó thực hiện một cách mù quáng, vặn vẹo nhiều thứ hơn nữa. Tôi không thể sử dụng giao dịch vì tập lệnh tạo một số cơ sở dữ liệu và không thể thực hiện giao dịch. Đó là việc tạo cơ sở dữ liệu mà đôi khi thất bại.

Toad cho SQL Server sẽ tạm dừng tại lỗi đầu tiên nó gặp và hỏi bạn có muốn dừng hoặc tiếp tục không. Đây là hành vi tôi đang tìm kiếm. Liệu nó tồn tại trong SSMS?

Tôi là không phải hỏi, "Làm thế nào để viết hoặc sửa đổi tập lệnh để nó dừng khi có lỗi?" Tôi không quan tâm đến việc sửa đổi tập lệnh của mình để thực hiện điều này, tôi chỉ muốn SSMS gửi đến dừng trên một lỗi. Toad cho SQL Server thực hiện chính xác điều này và đó là hành vi tôi muốn. Đây cũng không phải là bản sao của 659188 vì điều đó liên quan đến việc sửa đổi tập lệnh để dừng SSMS.

+0

Thật mù quáng khi làm những gì bạn đã nói với nó! Bạn đã _tell_ nó dừng lại trên một lỗi? Liệu cùng một kịch bản có dừng lại nếu có lỗi từ ADO.NET hoặc từ một số công cụ thực thi kịch bản khác không? Vấn đề là kịch bản của bạn, không phải SSMS. –

+7

Hầu hết các môi trường thực thi cấp cao hiện đại ngay lập tức dừng lại do lỗi. Trừ khi _told_ rõ ràng không dừng lại hoặc _told_ để phân nhánh cho các câu lệnh xử lý lỗi do lỗi. – yfeldblum

+0

Giả sử đó là sự thật (và nếu tôi quan tâm, tôi sẽ yêu cầu bạn quay lại điều đó), những gì nó đã làm với câu hỏi, đó là về SQL Server. Ngữ nghĩa của một loạt các câu lệnh T-SQL không bao gồm việc dừng lỗi mà không được yêu cầu làm như vậy. Những ngữ nghĩa này không thay đổi đơn giản chỉ vì "hầu hết các môi trường thực thi cấp cao hiện đại nhất ngay lập tức dừng lại về lỗi". –

Trả lời

9

Câu trả lời ngắn gọn: Bạn không thể.

Nhờ những người cung cấp cách giải quyết, nhưng có vẻ như chính SSMS không thể được đặt để tạm dừng hoặc dừng trên một lỗi trong cùng một cách mà Toad cho SQL Server có thể.

+0

Tôi không nghĩ rằng điều này là đúng. Nó không phải là công cụ có nghĩa vụ phải xử lý này, đó là kịch bản. Bạn cần sử dụng các khối TRY CATCH hoặc các câu lệnh IF @@ ERROR – Jeremy

+0

không sử dụng các câu lệnh đi, chỉ cần nhập các câu lệnh sau cái khác – BlackTigerX

+1

": khi thoát lỗi" trong chế độ SSMS sqlcmd –

4

Bạn cần bọc các câu lệnh SQL bên trong một Transaction.

BEGIN TRANSACTION 
    /* run all your SQL statements */ 
COMMIT TRANSACTION 

Nếu có lỗi trong giao dịch bắt đầu/kết thúc, tất cả báo cáo sẽ được khôi phục.

CHỈNH SỬA: Đưa vào bên trong giao dịch bắt đầu/kết thúc, sẽ ngăn các báo cáo không được cam kết với cơ sở dữ liệu, nhưng không dừng lại ở điểm đó. Bạn cần phải thêm nó bên trong khối thử/nắm bắt như sau:

BEGIN TRY 
    BEGIN TRANSACTION 
    /* run all your SQL statements */ 
    COMMIT TRANSACTION 
END TRY 
BEGIN CATCH 
    ROLLBACK TRANSACTION 
END CATCH 
+1

Tôi không thể. Kịch bản lệnh tạo ra một số cơ sở dữ liệu và chúng không thể đi vào một giao dịch và đó là việc tạo cơ sở dữ liệu đôi khi không thành công. – TallGuy

+1

Trong trường hợp đó, khối TRY/CATCH phải đủ –

+4

Trong trường hợp 'try/catch' bạn không thể sử dụng 'GO'. – abatishchev

6

ApexSQL Script tạo ra các kịch bản hàng loạt chính xác theo cách mà bạn muốn. Ví dụ:

--Script Header 
begin transaction 
go 

{Statement #1} 
go 
--Standard Post-Statement Block 
if @@error <> 0 or @@trancount = 0 begin 
    if @@trancount > 0 rollback transaction 
    set noexec on 
end 
go 

{Statement #2} 
go 
--Standard Post-Statement Block 
if @@error <> 0 or @@trancount = 0 begin 
    if @@trancount > 0 rollback transaction 
    set noexec on 
end 
go 

--Script Footer 
if @@trancount > 0 commit transaction 
go 
set noexec off 
go 
0

Nếu bạn không thể đặt tập lệnh thành quy trình được lưu trữ và sử dụng câu lệnh trả về để thoát khỏi lỗi, giải pháp được cung cấp bởi @Justice có thể là đặt cược tốt nhất của bạn. Mọi người khác đều thiếu điểm - bạn không thể quay trở lại từ tập lệnh, ngay cả khi bạn sử dụng giao dịch hoặc thậm chí nếu bạn không chấp nhận. SSMS sẽ chỉ thực thi điều tiếp theo, ngay cả khi đặt hủy bỏ xact được bật.

Nếu bạn có thể chuyển đổi tập lệnh của mình thành quy trình được lưu trữ, khi đó bạn có thể quay lại từ khi phát hiện lỗi.

3

Wow. Đó là kinda rác phải không? Tôi sử dụng SQL-Workbench mà, như Toad cho SQL Server, xử lý này một cách dễ dàng. Không giống như Toad cho SQL Server, nó hoàn toàn miễn phí.

Tôi rất ngạc nhiên rằng chức năng cơ bản như vậy không phải là một phần của công cụ chuẩn.

+0

Toad cũng có phiên bản miễn phí, tối đa N (5?) Người dùng cho mỗi tổ chức. – crokusek

5

xem xét sử dụng chương trình dòng lệnh 'sqlcmd' đi kèm với SQL Server, với tùy chọn -b và tùy chọn -V. -b sẽ khiến sqlcmd thoát khi nó chạm lỗi. -V kiểm soát mức độ nghiêm trọng được coi là một lỗi.

Các vấn đề liên quan