THAY ĐỔI câu lệnh không được phép trong giao dịch đa câu lệnh


12

Tôi đã tải xuống mẫu Trong bộ nhớ dựa trên AdventureWorks từ đây và làm theo tất cả các bước được mô tả trong tài liệu đi kèm. Tuy nhiên, khi tôi cố chạy tập lệnh trong SQL Server Management Studio, tôi nhận được thông báo lỗi:

THAY ĐỔI câu lệnh không được phép trong giao dịch đa câu lệnh

Các lỗi chỉ đến dòng 9, đó là:

IF NOT EXISTS (SELECT * FROM sys.data_spaces WHERE type='FX')
    ALTER DATABASE CURRENT ADD FILEGROUP [AdventureWorks2012_mod] 
    CONTAINS MEMORY_OPTIMIZED_DATA
GO

Vì đây là (ít nhiều) tài liệu chính thức của Microsoft, tôi cho rằng đó là điều tôi đang làm sai, nhưng tôi không thể hiểu nó là gì.

Câu trả lời:


13

Không, bạn không làm gì sai cả. Tôi nhận được điều tương tự. Tôi đã giải quyết nó bằng cách chia mẫu thành nhiều tập lệnh và chạy từng phần của tập lệnh một cách tuần tự, trong cửa sổ truy vấn của riêng nó, thay vì một tập lệnh lớn. Điều này hoạt động trong trường hợp của tôi bởi vì tôi luôn chạy các mẫu này trong một VM bị cô lập (không phải trên máy chủ sản xuất!) Và việc xử lý giao dịch là không cần thiết vì tôi là người duy nhất ở đây.

Nhìn lại kịch bản ngày hôm nay kỹ hơn, không có xử lý giao dịch được xác định rõ ràng, nhưng có lẽ bạn đã dán tập lệnh vào cửa sổ truy vấn đã có giao dịch đang hoạt động hoặc tạo một cửa sổ truy vấn mới tự động thêm BEGIN TRANSACTION; / COMMIT TRANSACTION;câu lệnh.

Tôi cũng đã chỉ ra một vài vấn đề tiềm năng khác trong bài đăng trên blog này .


1
"Có lẽ bạn đã dán tập lệnh vào cửa sổ truy vấn đã có giao dịch đang hoạt động" Điều đó dường như là vấn đề, bởi vì khi tôi chạy toàn bộ truy vấn trong một cửa sổ mới, nó đã hoạt động.
Petter Brodin

8

Tôi đồng ý với @AaronBertrand bạn không làm gì sai cả. Đây không phải là lần đầu tiên tôi thấy một tập lệnh của Microsoft có lỗi trong đó. Thực tế với nhiều kịch bản như họ xuất bản, tôi sẽ ngạc nhiên khi không thấy bất kỳ kịch bản nào.

Cụ thể vấn đề là ALTER DATABASEkhông được phép trong một giao dịch. Bạn có thể xem tài liệu tham khảo BOL tại đây: Các câu lệnh Transact-SQL được phép trong các giao dịch

Trong thực tế, ngay cả một kịch bản đơn giản như điều này không thành công với cùng một lỗi.

BEGIN TRANSACTION
ALTER DATABASE AdventureWorks2012 SET READ_WRITE
COMMIT

Như Aaron đã nói, hãy loại bỏ việc xử lý giao dịch (hoặc ít nhất là ALTER DATABASEtuyên bố khỏi giao dịch) và bạn sẽ ổn.


-2

Sử dụng "Đi" để phân tách các giao dịch. Điều đó sẽ giải quyết vấn đề. (Dễ dàng hơn chạy từng cái một.) Cũng có thể thay đổi cấp độ Cách ly (Không được kiểm tra)

SET TRANSACTION ISOLATION LEVEL SERIALISABLE

Begin tran

---Statements goes here

commit tran

SET TRANSACTION ISOLATION LEVEL READ COMMITTED

Bạn có thể muốn kiểm tra mã của mình trước khi đăng khi những người khác đã xác định rằng ALTER DATABASEkhông thể được thực hiện trong một giao dịch. Đặt mức cô lập SERIALIZABLEkhông có hiệu lực trong việc này.
Max Vernon

"GO" không phải là một câu lệnh SQL. Đây là một hướng dẫn cho SSMS để gửi (các) câu lệnh tiến hành tới SQL Server dưới dạng một đợt. Bạn có thể thay đổi điều này nếu bạn cảm thấy dũng cảm: Công cụ -> Tùy chọn -> Thực thi truy vấn -> Máy chủ SQL. Nhiều lô có thể được gửi trong một giao dịch.
Michael Green
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.