Maafkan saya, saya adalah seorang pengembang yang telah pindah ke dunia SQL. Saya pikir saya bisa meningkatkan beberapa SQL dengan menambahkan variabel tetapi tidak berfungsi seperti yang saya harapkan. Dapatkah seseorang memberi tahu saya mengapa ini tidak berhasil? Saya tidak ingin bekerja di sekitar, saya ingin tahu alasan mengapa ini tidak berfungsi seperti yang saya bayangkan seharusnya karena saya yakin ada alasan yang bagus, tetapi saat ini tidak melompat ke arah saya.
DECLARE @DatabaseName varchar(150)
SET @DatabaseName = 'MyAmazingDatabaseName'
CREATE DATABASE @DatabaseName
GO
USE @DatabaseName
GO
sql-server-2008
t-sql
Gareth
sumber
sumber
USE
perintah dengan parameter.GO
, variabel yang dinyatakan sebelumnya menghilang. Anda mungkin ingin melihat variabel SQLCMD, yang mungkin atau mungkin tidak berlaku untuk skenario Anda.Jawaban:
Per halaman online Buku untuk variabel
Ini akan bekerja seperti yang Anda harapkan jika, misalnya, Anda menggunakan variabel Anda dalam klausa di mana. Adapun alasannya, saya akan berpikir itu ada hubungannya dengan parser tidak dapat mengevaluasi variabel dan dengan demikian memeriksa keberadaan. Saat mengeksekusi, kueri diuraikan terlebih dahulu untuk sintaks dan objek dan kemudian, jika penguraian berhasil, kueri dieksekusi pada titik mana variabel akan ditetapkan.
sumber
eval
fungsi dalam bahasa prosedural seperti JavaScript dan Python. Ini adalah cara cepat untuk membuat lubang keamanan.Keterbatasan penggunaan variabel dalam pernyataan SQL muncul dari arsitektur SQL.
Ada tiga fase dalam pemrosesan pernyataan SQL:
SQL server menyembunyikan langkah persiapan dari programmer dan menjalankannya jauh lebih cepat daripada database tradisional seperti Oracle dan DB2. Karena alasan kinerja, SQL menghabiskan banyak waktu untuk menentukan rencana eksekusi optimal, tetapi hanya melakukannya saat pertama kali pernyataan tersebut ditemui setelah restart.
Jadi dalam SQL statis , variabel hanya dapat digunakan di tempat-tempat di mana mereka tidak akan membatalkan rencana eksekusi, jadi tidak untuk nama tabel, nama kolom (termasuk nama kolom dalam kondisi WHERE), dll.
SQL dinamis ada untuk kasus-kasus di mana seseorang tidak dapat bekerja di sekitar batasan, dan programmer tahu bahwa itu akan memakan waktu sedikit lebih lama untuk dieksekusi. SQL dinamis bisa rentan terhadap injeksi kode berbahaya, jadi berhati-hatilah!
sumber
Seperti yang Anda lihat, pertanyaan "mengapa" membutuhkan jawaban yang berbeda, termasuk pemikiran historis dan asumsi yang mendasari bahasa tersebut, saya tidak yakin saya benar-benar dapat melakukan keadilan itu.
Artikel komprehensif ini oleh SQL MVP Erland Sommarskog tidak mencoba memberikan beberapa alasan, bersama dengan mekanika:
Kutukan dan Berkat dari Dynamic SQL :
Ini (dan keamanan, lihat di bawah) mungkin merupakan alasan terbesar.
SQL beroperasi di bawah premis bahwa query bukan operasi satu kali, tetapi mereka akan digunakan berulang kali. Jika tabel (atau database!) Sebenarnya tidak ditentukan dalam kueri, itu tidak memiliki cara untuk menghasilkan dan menyimpan rencana eksekusi untuk digunakan di masa depan.
Ya, tidak setiap kueri yang kami jalankan akan digunakan kembali, tetapi ini adalah premis operasi standar dari SQL , jadi "pengecualian" dimaksudkan untuk menjadi luar biasa.
Beberapa alasan lain daftar Erland (perhatikan bahwa ia secara eksplisit mencantumkan keuntungan menggunakan prosedur yang tersimpan , tetapi banyak di antaranya juga keuntungan dari kueri parameterisasi (non-dinamis)):
Sekali lagi, masing-masing memiliki seratus nuansa yang tidak akan saya bahas di sini.
sumber
Anda harus menggunakan sql dinamis
di bawah ini adalah hasil cetak .. sekali Anda menghapus komentar
exec sp_executesql @sqltext
pernyataan tersebut akan benar-benar dieksekusi ...sumber