Saya perlu melakukan UPDATE dan INSERT dalam satu transaksi. Kode itu berfungsi dengan baik sendiri, tetapi saya ingin dapat memanggilnya dengan mudah dan mengirimkan parameter yang diperlukan. Ketika saya mencoba untuk menumpuk transaksi ini dalam prosedur tersimpan saya mengalami banyak kesalahan sintaksis.
Bagaimana saya bisa merangkum kode berikut sehingga dapat dengan mudah dipanggil?
BEGIN TRANSACTION AssignUserToTicket
GO
DECLARE @updateAuthor varchar(100)
DECLARE @assignedUser varchar(100)
DECLARE @ticketID bigint
SET @updateAuthor = 'user1'
SET @assignedUser = 'user2'
SET @ticketID = 123456
UPDATE tblTicket SET ticketAssignedUserSamAccountName = @assignedUser WHERE (ticketID = @ticketID);
INSERT INTO [dbo].[tblTicketUpdate]
([ticketID]
,[updateDetail]
,[updateDateTime]
,[userSamAccountName]
,[activity])
VALUES
(@ticketID,
'Assigned ticket to ' + @assignedUser,
GetDate(),
@updateAuthor,
'Assign');
GO
COMMIT TRANSACTION AssignUserToTicket
sql-server
sql-server-2012
t-sql
stored-procedures
transaction
Charlie K.
sumber
sumber
Jawaban:
Anda perlu membungkus kode itu dalam
CREATE PROCEDURE ...
sintaks, dan menghapusGO
pernyataan setelahBEGIN TRANSACTION
dan sebelumnyaCOMMIT TRANSACTION
.Juga perhatikan, saya telah menambahkan
TRY...CATCH
blok pernyataan untuk memungkinkan melakukanROLLBACK TRANSACTION
pernyataan jika terjadi kesalahan. Anda mungkin memerlukan penanganan kesalahan yang lebih baik dari itu, tetapi tanpa sepengetahuan kebutuhan Anda, itu paling sulit.Beberapa bacaan yang bagus:
Selalu tentukan skema
Prosedur Tersimpan Praktik Terbaik
Kebiasaan buruk yang harus dihindari
sumber
SAVE TRANS
implikasi perintah itu.Jika Anda ingin menangani dengan benar Prosedur tersimpan yang tersimpan yang dapat menangani Transaksi (apakah dimulai dari T-SQL atau kode aplikasi) maka Anda harus mengikuti templat yang saya jelaskan dalam jawaban berikut:
Apakah kita diharuskan untuk menangani Transaksi dalam Kode C # dan juga dalam prosedur tersimpan
Anda akan melihat dua perbedaan di sana dari apa yang Anda coba di sini:
Penggunaan
RAISERROR
dalamCATCH
blok. Ini gelembung kesalahan hingga tingkat panggilan (baik di DB atau lapisan aplikasi) sehingga keputusan dapat dibuat mengenai fakta bahwa kesalahan terjadi.Tidak ada
SAVE TRANSACTION
. Saya belum pernah menemukan kasus untuk menggunakan ini. Saya tahu beberapa orang lebih menyukainya, tetapi dalam segala hal yang pernah saya lakukan di tempat saya pernah bekerja, gagasan tentang kesalahan yang terjadi di salah satu level bersarang menyiratkan bahwa pekerjaan apa pun yang sudah dilakukan tidak valid. Dengan menggunakanSAVE TRANSACTION
Anda hanya mengembalikan kembali ke negara sebelum Prosedur Disimpan ini dipanggil, meninggalkan proses yang ada sebagai dinyatakan sah.Jika Anda ingin detail lebih lanjut
SAVE TRANSACTION
, silakan lihat informasi dalam jawaban ini:Cara mengembalikan ketika 3 prosedur tersimpan dimulai dari satu prosedur tersimpan
Masalah lainnya
SAVE TRANSACTION
adalah nuansa perilakunya, sebagaimana dicatat dalam halaman MSDN untuk SIMPAN TRANSAKSI (penekanan ditambahkan):Artinya, Anda harus sangat berhati-hati untuk memberikan setiap Titik Simpan di setiap Prosedur yang Disimpan nama yang unik di semua Poin Simpan di semua Prosedur yang Disimpan. Contoh-contoh berikut menggambarkan hal ini.
Contoh pertama ini menunjukkan apa yang terjadi ketika Anda menggunakan kembali nama Simpan Poin; hanya Save Point level terendah yang diputar kembali.
Contoh kedua ini menunjukkan apa yang terjadi ketika Anda menggunakan nama Simpan Poin yang unik; Save Point level yang diinginkan dibatalkan.
sumber