Saya memiliki skrip SQL yang harus dijalankan setiap kali klien menjalankan fungsionalitas "manajemen basis data". Script termasuk membuat prosedur tersimpan pada basis data klien. Beberapa klien ini mungkin sudah memiliki prosedur tersimpan saat menjalankan skrip, dan beberapa mungkin tidak. Saya perlu memiliki prosedur tersimpan yang hilang ditambahkan ke database klien, tetapi tidak masalah seberapa banyak saya mencoba untuk menekuk sintaks T-SQL, saya mendapatkan
CREATE / ALTER PROCEDURE 'harus menjadi pernyataan pertama dalam kumpulan permintaan
Saya sudah membaca dropping itu sebelum membuat karya, tapi saya tidak suka melakukannya dengan cara itu.
IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'MyProc')
DROP PROCEDURE MyProc
GO
CREATE PROCEDURE MyProc
...
Bagaimana saya bisa menambahkan memeriksa keberadaan prosedur tersimpan dan membuatnya jika tidak ada tetapi mengubahnya jika memang ada?
sumber
Jawaban:
Anda dapat menjalankan kode prosedural di mana saja Anda dapat menjalankan kueri.
Cukup salin semuanya setelah
AS
:Kode ini melakukan hal yang persis sama dengan proc yang disimpan, tetapi tidak disimpan di sisi basis data.
Itu seperti apa yang disebut prosedur anonim
PL/SQL
.Memperbarui:
Judul pertanyaan Anda agak membingungkan.
Jika Anda hanya perlu membuat prosedur jika tidak ada, maka kode Anda baik-baik saja.
Inilah yang
SSMS
dihasilkan dalam skrip buat:Memperbarui:
Contoh cara melakukannya saat menyertakan skema:
Dalam contoh di atas, dbo adalah skema.
Memperbarui:
Di SQL Server 2016+, Anda bisa melakukannya
CREATE OR ALTER PROCEDURE dbo.MyProc
sumber
@astander
: Anda dapat memanggil kode anonim dari prosedur tersimpan juga. Untuk menggunakan output mereka dalamINSERT
, Anda harus menggunakanOPENROWSET
atauOPENQUERY
yang berfungsi dengan kode anonim juga. Tentu saja ada kekurangan dalam kode anonim: misalnya, itu hanya berjalan di bawah hak si penelepon. Maksud saya adalah bahwa itu mungkin, bukan cara yang disukai dalam melakukan hal-hal :)Saya menyadari ini sudah ditandai sebagai dijawab, tetapi kami biasa melakukannya seperti ini:
Hanya untuk menghindari menjatuhkan prosedur.
sumber
GRANT
pernyataan eksplisit dalam naskah dalam kasus mereka berubah ; jadi masih ada pembenaran untuk menggunakanDROP
bukanALTER
.Jika Anda mencari cara paling sederhana untuk memeriksa keberadaan objek basis data sebelum menghapusnya, berikut ini salah satu caranya (contoh menggunakan SPROC, seperti contoh Anda di atas tetapi dapat dimodifikasi untuk tabel, indeks, dll ...):
Ini cepat dan elegan, tetapi Anda perlu memastikan Anda memiliki nama objek unik di semua jenis objek karena tidak memperhitungkannya.
Saya harap ini membantu!
sumber
Saya tahu Anda ingin "mengubah prosedur jika ada dan hanya menghapusnya jika tidak ada" tapi saya percaya lebih mudah untuk selalu meninggalkan prosedur dan kemudian membuatnya kembali. Berikut cara membatalkan prosedur hanya jika sudah ada:
Parameter kedua memberi tahu
OBJECT_ID
untuk hanya mencari objek denganobject_type = 'P'
, yang merupakan prosedur tersimpan:Anda bisa mendapatkan daftar opsi lengkap melalui:
sumber
Pada SQL SERVER 2016 Anda dapat menggunakan yang baru
DROP PROCEDURE IF EXISTS
.DROP { PROC | PROCEDURE } [ IF EXISTS ] { [ schema_name. ] procedure } [ ,...n ]
Referensi: https://msdn.microsoft.com/en-us/library/ms174969.aspx
sumber
Saya tahu ini adalah posting yang sangat lama, tetapi karena ini muncul di hasil pencarian teratas maka menambahkan pembaruan terbaru untuk mereka yang menggunakan SQL Server 2016 SP1 -
Ini menciptakan Prosedur Tersimpan jika belum ada, tetapi mengubahnya jika ada.
Referensi
sumber
DROP JIKA ADA adalah fitur baru dari SQL Server 2016
https://blogs.msdn.microsoft.com/sqlserverstorageengine/2015/11/03/drop-if-exists-new-thing-in-sql-server-2016/
sumber
Saya memiliki kesalahan yang sama. Saya tahu utas ini sudah hampir mati, tetapi saya ingin menetapkan opsi lain selain "prosedur anonim".
Saya menyelesaikannya seperti ini:
Periksa apakah prosedur yang tersimpan ada:
Namun
"CREATE/ALTER PROCEDURE' must be the first statement in a query batch"
masih ada. Saya menyelesaikannya seperti ini:Saya berakhir dengan kode ini:
sumber
Inilah metode dan beberapa alasan di balik menggunakannya dengan cara ini. Mengedit proc yang disimpan tidaklah seindah tetapi ada pro dan kontra ...
PEMBARUAN: Anda juga dapat membungkus seluruh panggilan ini dalam suatu TRANSAKSI. Termasuk banyak prosedur tersimpan dalam satu transaksi yang semuanya dapat melakukan atau mengembalikan semua. Keuntungan lain dari pembungkus dalam suatu transaksi adalah prosedur tersimpan selalu ada untuk koneksi SQL lainnya selama mereka tidak menggunakan tingkat isolasi transaksi BACA TIDAK DIKOMPITASI!
1) Untuk menghindari perubahan hanya sebagai keputusan proses. Proses kami adalah untuk selalu JIKA ADA DROP KEMUDIAN BUAT. Jika Anda melakukan pola yang sama dengan menganggap PROC baru adalah proc yang diinginkan, melayani perubahan sedikit lebih sulit karena Anda akan memiliki JIKA ADA MENGUBAH ELSE BUAT.
2) Anda harus meletakkan CREATE / ALTER sebagai panggilan pertama dalam batch sehingga Anda tidak dapat membungkus urutan pembaruan prosedur dalam transaksi di luar SQL dinamis. Pada dasarnya jika Anda ingin menjalankan seluruh tumpukan pembaruan prosedur atau mengembalikan semuanya tanpa mengembalikan cadangan DB, ini adalah cara untuk melakukan semuanya dalam satu batch.
sumber
Di Sql server 2008 dan seterusnya, Anda dapat menggunakan "
INFORMATION_SCHEMA.ROUTINES
"sumber
Saya tampaknya tidak memiliki reputasi yang diperlukan untuk memilih atau berkomentar, tetapi saya hanya ingin mengatakan bahwa jawaban Geoff menggunakan EXEC (sp_executesql mungkin lebih baik) jelas merupakan cara yang harus dilakukan. Menjatuhkan dan kemudian menciptakan kembali prosedur tersimpan menyelesaikan pekerjaan pada akhirnya, tetapi ada saat di mana prosedur tersimpan tidak ada sama sekali, dan itu bisa sangat buruk, terutama jika ini adalah sesuatu yang akan menjadi jalankan berulang kali. Saya mengalami segala macam masalah dengan aplikasi saya karena utas latar sedang melakukan JIKA ADA DROP ... BUAT pada saat yang sama utas lain mencoba menggunakan prosedur tersimpan.
sumber
** Cara paling sederhana untuk menjatuhkan dan membuat ulang proc yang tersimpan di T-Sql adalah **
sumber
Berikut ini skrip yang saya gunakan. Dengan itu, saya menghindari menjatuhkan dan membuat ulang procs yang disimpan secara tidak perlu.
sumber
Periksa JIKA Ada Prosedur yang Disimpan
Periksa JIKA Ada untuk Pemicu, Berfungsi juga dengan mengklik tautan di bawah http://www.gurujipoint.com/2017/05/check-if-exist-for-trigger-function-and.html
sumber
kenapa kamu tidak pergi dengan cara sederhana seperti
..........
sumber
%
, jadiLIKE
berperilaku sebagai=
Selain jawaban dari @ Geoff saya telah membuat alat sederhana yang menghasilkan file SQL yang pernyataan untuk Prosedur Tersimpan, Tampilan, Fungsi dan Pemicu.
Lihat MyDbUtils @ CodePlex .
sumber
Aku penasaran! Mengapa saya tidak menulis seluruh kueri seperti
saya sudah tahu bahwa dua prosedur pertama sudah ada sql akan menjalankan kueri akan memberikan kesalahan dari dua prosedur pertama tetapi masih akan membuat prosedur terakhir SQl sendiri mengurus apa yang sudah ada ini adalah apa yang selalu saya lakukan untuk semua saya klien!
sumber
BUAT Prosedur JIKA TIDAK ADA 'Nama proc Anda' () DIMULAI ... AKHIR
sumber