Rumah >pangkalan data >tutorial mysql >Mengapa Prosedur Tersimpan SQL Saya Melemparkan Ralat 'Mesti Mengisytiharkan Pembolehubah Skalar'?
Menyingkap Misteri "Mesti Mengisytiharkan Pembolehubah Skalar"
Dalam bidang SQL Stored Procedures, cuba menggunakan parameter input global seperti "@RowFrom" dan "@RowTo" dalam pernyataan SQL yang dijana secara dinamik selalunya boleh membawa kepada ralat yang membingungkan, "Mesti mengisytiharkan pembolehubah skalar."
Isu ini timbul kerana parameter tidak diisytiharkan secara eksplisit dalam rentetan SQL (@sqlstatement) yang digunakan untuk menyusun pertanyaan. Untuk membetulkannya, adalah perlu sama ada:
Menggunakan CONVERT() untuk Menukar Pembolehubah kepada Rentetan:
Daripada menggabungkan pembolehubah jenis int secara langsung, gunakan CONVERT () untuk mengubahnya menjadi rentetan. Contohnya:
SET @sql = N'DECLARE @Rt int; SET @Rt = ' + CONVERT(VARCHAR(12), @RowTo);
Ini memastikan bahawa nilai "@RowTo" boleh diberikan kepada "@Rt" sebagai rentetan.
Gunakan Fungsi CONCAT() Moden:
Dalam versi SQL yang lebih baharu, fungsi CONCAT() memudahkan penggabungan parameter, menghapuskan keperluan untuk penukaran manual.
SET @sql = CONCAT(N'SELECT ', @RowTo, ' * 5');
Gunakan Parameterisasi Selamat:
Walau bagaimanapun, adalah sangat disyorkan untuk memilih parameterisasi yang betul dan bukannya penggabungan rentetan. Pendekatan ini meminimumkan risiko suntikan SQL dengan memisahkan kod SQL daripada parameter input pengguna.
SET @sql = @sql + ' WHERE RowNum BETWEEN @RowFrom AND @RowTo;'; EXEC sys.sp_executesql @sql, N'@RowFrom int, @RowTo int', @RowFrom, @RowTo;
Atas ialah kandungan terperinci Mengapa Prosedur Tersimpan SQL Saya Melemparkan Ralat 'Mesti Mengisytiharkan Pembolehubah Skalar'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!