Misalkan saya memiliki prosedur tersimpan yang digandakan, dengan beberapa modifikasi, di beberapa basis data. Dan saya ingin referensi database di mana prosedur tersimpan disimpan, bahkan jika dieksekusi di database lain.
Apakah ada cara untuk mengambil path lengkap (..) atau mengambil database tempat prosedur tersimpan disimpan, daripada database saat ini?
sql-server
stored-procedures
Jim Clark
sumber
sumber
Jawaban:
Cukup gunakan satu bagian atau dua bagian nama dalam prosedur tersimpan, dan itu akan merujuk objek dalam database yang berisi prosedur tersimpan. Khususnya,
Untuk SQL statis dalam prosedur tersimpan:
Nama objek yang tidak memenuhi syarat akan menyelesaikan relatif terhadap skema yang berisi prosedur tersimpan.
Nama dua bagian akan diselesaikan relatif terhadap database yang berisi prosedur tersimpan.
Untuk SQL dinamis dalam prosedur tersimpan:
Nama objek yang tidak memenuhi syarat akan menyelesaikan relatif terhadap skema default identitas pengguna yang menjalankan prosedur tersimpan (secara default, pemanggil).
Nama dua bagian akan diselesaikan relatif terhadap database yang berisi prosedur tersimpan.
Fungsi db_name () akan mengembalikan nama database yang berisi prosedur tersimpan dalam kedua kasus.
sumber
Berikut adalah contoh cepat yang saya kumpulkan menunjukkan fungsi-fungsi umum yang digunakan untuk mendekati apa yang Anda cari.
sumber
Menambahkan ke jawaban David Browne yang luar biasa :
Anda beruntung karena ini adalah cara yang biasa / permanen, prosedur yang tersimpan non-sistem sudah bekerja dengan cara ini, dan Anda benar-benar harus keluar dari cara Anda untuk mendapatkan objek untuk beroperasi di DB saat ini. Ini adalah bagaimana fungsi bekerja juga, hanya saja dengan prosedur tersimpan, Anda memiliki opsi - menandainya sebagai "prosedur tersimpan sistem" atau membuat prosedur tersimpan sementara - yang tidak Anda miliki dengan fungsi / tampilan / pemicu / dll.
Karena fungsi bawaan berperilaku sedikit berbeda dari SQL statis dalam prosedur tersimpan sementara, contoh berikut menggunakan tabel non-sementara untuk referensi di UDF dan Inline-TVF. Benar, contoh berikut ini tidak benar-benar menguji prosedur tersimpan sementara, tetapi alasan saya menggunakan tabel non-sementara adalah karena karena kita memiliki satu contoh perilaku yang berbeda, kita perlu memastikan bahwa perilaku seperti itu tidak terjadi di sini. Dalam contoh berikut, jika salah satu jenis fungsi menyadari database "saat ini", maka referensi ke tabel non-sementara akan menyebabkan kesalahan.
MENDIRIKAN
UJI
sumber