2010-08-25 16 views
5

Tôi muốn xây dựng một kịch bản thay đổi T-SQL cuộn ra các thay đổi cơ sở dữ liệu từ dev để kiểm tra để sản xuất. Tôi đã chia kịch bản thành ba phần:T-SQL 2005: kết hợp nhiều cuộc gọi thủ tục tạo/thay đổi trong một giao dịch

  1. lệnh DDL
  2. thay đổi trong các stored procedure (tạo và thay đổi thủ tục)
  3. tạo dữ liệu và sửa đổi

Tôi muốn tất cả các thay đổi trong ba kịch bản đó sẽ được thực hiện trong một giao dịch. Mọi thay đổi trong tập lệnh đều được xử lý hoặc - khi có lỗi - tất cả thay đổi sẽ được khôi phục. Tôi đã thực hiện việc này cho các bước 1 và 3 bằng cách sử dụng câu lệnh try/catch và bắt đầu giao dịch. Vấn đề của tôi bây giờ là làm điều tương tự cho các thủ tục được lưu trữ. Cuộc gọi đến "bắt đầu giao dịch" trực tiếp trước khi câu lệnh "tạo thủ tục lưu trữ" dẫn đến lỗi cú pháp cho tôi biết rằng "câu lệnh thủ tục thay đổi/tạo phải là câu lệnh đầu tiên trong chuỗi truy vấn". Vì vậy, tôi tự hỏi làm thế nào tôi có thể kết hợp nhiều tạo/thay đổi thủ tục báo cáo trong một giao dịch.

Bất kỳ trợ giúp được đánh giá cao ;-)

Cảm ơn

Trả lời

0

Hãy thử điều này:

begin transaction 
    go 
    create procedure foo as begin select 1 end 
    go 
commit transaction 
0
BEGIN TRANSACTION 
BEGIN TRY 
    -- Do your stuff here 
    COMMIT TRANSACTION 

    PRINT 'Successfull.' 

END TRY 
BEGIN CATCH 

    SELECT 
     ERROR_NUMBER() as ErrorNumber, 
     ERROR_MESSAGE() as ErrorMessage; 

    ROLLBACK TRANSACTION 

END CATCH 
0

thử đặt các bước trong một công việc

2

Bạn có thể sử dụng SQL động để tạo các thủ tục được lưu trữ của bạn.

EXEC ('CREATE PROC dbo.foo AS ....`) 

Điều này sẽ tránh được những lỗi "thay đổi/tạo tuyên bố thủ tục phải có báo cáo kết quả đầu tiên trong một loạt truy vấn"

+0

và những gì nếu bạn có một UDP lớn với các truy vấn và rất nhiều 'chars? –

+1

@Leandro - Sau đó, bạn cần thực hiện tìm kiếm và thay thế để thoát khỏi ''' bằng '' '' –

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