Rumah > pangkalan data > tutorial mysql > Mengapa Prosedur Tersimpan SQL Saya Melemparkan Ralat 'Mesti Mengisytiharkan Pembolehubah Skalar'?

Mengapa Prosedur Tersimpan SQL Saya Melemparkan Ralat 'Mesti Mengisytiharkan Pembolehubah Skalar'?

Patricia Arquette
Lepaskan: 2024-12-23 00:52:10
asal
1024 orang telah melayarinya

Why Does My SQL Stored Procedure Throw a

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);
Salin selepas log masuk

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');
Salin selepas log masuk

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;
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan