Saat membuat prosedur tersimpan dalam SQL Server, Anda diizinkan untuk merujuk ke tabel yang tidak ada. Tetapi, jika tabel benar-benar ada, maka kolom apa pun yang Anda rujuk dalam prosedur harus ada dalam tabel tersebut ( Resolusi Nama Tangguhan ).
Apakah mungkin untuk menginstruksikan SQL Server untuk menunda resolusi nama semua tabel yang dirujuk dalam prosedur terlepas dari apakah mereka ada atau tidak? Saya ingin tetap memeriksa sintaksis secara umum, jadi walaupun itu mungkin, meretas definisi prosedur tersimpan ke dalam tabel sistem bukanlah suatu pilihan.
Saya berharap permintaan saya untuk melakukan ini mungkin tampak sedikit aneh , jadi inilah beberapa latar belakang: Saya otomatis menghasilkan definisi tabel dan prosedur tersimpan dari aplikasi yang ditulis dalam C # dan sangat sulit bagi saya untuk mengubah kode untuk memesan perubahan sesuai kebutuhan SQL mereka. Kode saya "menjamin" bahwa skema tersebut konsisten dalam suatu transaksi, tetapi saat ini saya tidak dapat menjamin bahwa kolom tabel didefinisikan sebelum saya mendefinisikan prosedur tersimpan yang merujuknya.
Di bawah ini adalah contoh kanonik dari SQL yang dibuat oleh C # yang "menggambarkan" masalah yang saya coba selesaikan.
--Say this table already exists.
CREATE TABLE myTable
(
a NVARCHAR(MAX)
)
GO
--My C# code creates something like this
BEGIN TRAN
GO
--the stored procedure gets generated first.
CREATE PROCEDURE mySproc
AS
BEGIN
SELECT a,b FROM myTable
END
--then the table update
ALTER TABLE myTable
ADD b nvarchar(MAX)
COMMIT TRAN
Hal ini mungkin bagi saya untuk memperbaiki ini dalam kode C #, tapi aku berharap untuk sederhana "ajaib" tweak saya bisa menarik SQL. Ini akan menghemat banyak waktu untuk saya.
sumber
Jawaban:
Tidak.
Aku merasa sangat bersalah hanya mengetik itu, tapi tidak, sayangnya. Itulah pertama kalinya saya mendengar tentang use case ini, dan itu masuk akal. Cara terbaik untuk mengirimkan permintaan itu di http://connect.microsoft.com dan cucu Anda akan dapat melakukannya. ;-)
sumber
Jika Anda masih tertarik, ada solusi potensial yang dapat Anda gunakan. Berikut adalah kode yang diperbarui, yang memperkenalkan
#deferResolution
tabel sementara untuk setiap permintaan dalam prosedur. Karena tabel sementara hanya akan ada saat runtime, prosedur ini dapat mengkompilasi meskipun kolom yang tepat belum adamyTable
.Anda bahkan akan mendapatkan rencana eksekusi yang sama (tidak ada referensi ke
#deferResolution
tabel) untuk setiap pernyataan dalam prosedur karena cara pengoptimal kueri dapat membuktikan iniWHERE NOT EXISTS
selalu dinilai benar.Semua yang mengatakan, ini adalah hack mengerikan yang disajikan sebagian besar untuk kepentingan intelektual dan mungkin ada kasus tepi di mana ia rusak. Seperti yang disebutkan Harun, Anda mungkin akan lebih baik membuat semua perubahan skema Anda dalam urutan yang tepat.
sumber