1: Pernyataan SQL biasa dapat dieksekusi dengan exec
Pilih * dari tableName exec('pilih * dari tableName') exec sp_executesql N'select * from tableName' -- Perhatikan bahwa Anda harus menambahkan N sebelum string
2: Saat menggunakan nama bidang, nama tabel, nama database, dll. sebagai variabel, SQL dinamis harus digunakan
Menyatakan @fname varchar(20) set @fname = 'FiledName' Pilih @fname dari tableName -- Kesalahan, tidak ada kesalahan yang diminta, tetapi hasilnya adalah nilai tetap FiledName, yang bukan yang Anda inginkan. exec('select ' + @fname + ' from tableName') -- perhatikan bahwa spasi ditambahkan ke sisi tanda kutip tunggal sebelum dan sesudah tanda tambah
Tentu saja, Anda juga dapat mengubah string menjadi bentuk variabel Menyatakan @fname varchar(20) set @fname = 'FiledName' --Atur nama bidang
Menyatakan @s varchar(1000) set @s = 'pilih ' + @fname + ' dari tableName' Exec(@s) -- Sukses exec sp_executesql @s -- Kalimat ini akan melaporkan kesalahan
deklarasi @s Nvarchar(1000) -- perhatikan bahwa itu diubah menjadi nvarchar(1000) di sini. set @s = 'pilih ' + @fname + ' dari tableName' Exec(@s) -- Sukses exec sp_executesql @s -- kalimat ini benar
3. Parameter keluaran Deklarasikan @num INT, @sqls NVARCHAR(4000) set @sqls='select count(*) dari tableName' eksekutif (@sqls)
--bagaimana cara memasukkan hasil eksekusi eksekutif ke dalam variabel?
Deklarasikan @num INT, @sqls NVARCHAR(4000) set @sqls='pilih @a=count(*) dari tableName ' keluaran exec sp_executesql @sqls,N'@a int output',@num Pilih @num
1: Pernyataan SQL biasa dapat dijalankan dengan Exec Contoh: Pilih * dari tableName Exec('pilih * dari tableName') Exec sp_executesql N'select * from tableName' -- Perhatikan bahwa Anda harus menambahkan N sebelum string
2: Saat menggunakan nama bidang, nama tabel, nama database, dll. sebagai variabel, SQL dinamis harus digunakan
Kesalahan: deklarasikan @fname varchar(20) set @fname = 'FiledName' Pilih @fname dari tableName -- Kesalahan, tidak ada kesalahan yang diminta, tetapi hasilnya adalah nilai tetap FiledName, yang bukan yang Anda inginkan. Benar: Exec('select ' + @fname + ' from tableName') -- perhatikan penambahan spasi ke sisi kutipan tunggal sebelum dan sesudah tanda tambah
Tentu saja, Anda juga dapat mengubah string menjadi bentuk variabel Menyatakan @fname varchar(20) set @fname = 'FiledName' --Atur nama bidang
Menyatakan @s varchar(1000) set @s = 'pilih ' + @fname + ' dari tableName' Exec(@s) -- Keberhasilan exec sp_executesql @s -- Kalimat ini akan melaporkan kesalahan
--Catatan: Parameter @s harus dari tipe ntext atau nchar atau nvarchar, deklarasikan @s varchar(1000) harus diubah untuk mendeklarasikan @s nvarchar(1000)
Sebagai berikut: deklarasi @s Nvarchar(1000) -- perhatikan bahwa itu diubah menjadi nvarchar(1000) di sini.
set @fname = 'FiledName' --Atur nama bidang set @s = 'pilih ' + @fname + ' dari tableName' Exec(@s) -- Keberhasilan exec sp_executesql @s -- kalimat ini benar
3. Parameter input atau output
(1) Parameter masukan: Deklarasikan @QueryString nvarchar(1000) -- variabel pernyataan kueri dinamis (catatan: harus jenis ntext atau nchar nvarchar, bukan tipe varchar) Deklarasikan @paramstring nvarchar(200) - atur string parameter dalam pernyataan dinamis (catatan: harus jenis ntext atau nchar nvarchar, bukan tipe varchar) deklarasikan @input_id int - mendefinisikan nilai parameter yang akan diteruskan ke dalam pernyataan dinamis
set @QueryString='pilih * dari nama tabel di mana id=@id' --id adalah nama bidang, @id adalah parameter yang akan diteruskan set @paramstring='@id int' -- Mengatur string yang menentukan parameter dalam pernyataan dinamis set @input_id =1 -- Atur nilai parameter yang akan diteruskan dalam pernyataan dinamis ke 1 eksekutif sp_executesql @querystring,@paramstring,@id=@input_id Jika ada beberapa parameter: Deklarasikan @QueryString nvarchar(1000) -- variabel pernyataan kueri dinamis (catatan: harus jenis ntext atau nchar nvarchar, bukan tipe varchar) Deklarasikan @paramstring nvarchar(200) - atur string parameter dalam pernyataan dinamis (catatan: harus jenis ntext atau nchar nvarchar, bukan tipe varchar) deklarasikan @input_id int - menentukan nilai parameter yang akan diteruskan ke dalam pernyataan dinamis, parameter 1 Deklarasi @input_name varchar(20) - mendefinisikan nilai argumen yang akan diteruskan ke dalam pernyataan dinamis, parameter 2
set @QueryString='select * from tablename where id=@id and name=@name' --id dan name adalah nama bidang, dan @id dan @name adalah parameter yang akan diteruskan set @paramstring='@id int,@name varchar(20)' -- Atur string definisi parameter dalam pernyataan dinamis, dipisahkan oleh "," set @input_id =1 -- Atur nilai parameter yang akan diteruskan dalam pernyataan dinamis ke 1 set @input_name='Zhang San' --Atur nilai parameter yang akan diteruskan dalam pernyataan dinamis ke 'Zhang San' exec sp_executesql @querystring,@paramstring,@id=@input_id,@name=@input_name -- Perhatikan urutan argumen (2) Parameter keluaran Deklarasikan @num INT, @sqls NVARCHAR(4000) set @sqls='select count(*) dari tableName' eksekutif (@sqls) --bagaimana cara memasukkan hasil eksekusi eksekutif ke dalam variabel? declare @QueryString nvarchar(1000) -- variabel nama kueri dinamis (Catatan: harus jenis ntext atau nchar nvarchar, bukan tipe varchar) Deklarasikan @paramstring nvarchar(200) - atur string parameter dalam pernyataan dinamis (catatan: harus jenis ntext atau nchar nvarchar, bukan tipe varchar) deklarasikan @output_result int - hasil kueri ditetapkan ke @output_result
set @QueryString='select @totalcount=count(*) from tablename' --@totalcount adalah parameter keluaran set @paramstring='@totalcount int output' --Atur string yang ditentukan oleh parameter dalam pernyataan dinamis, dipisahkan oleh "," keluaran eksekutif sp_executesql @querystring,@paramstring,@totalcount=@output_result Pilih @output_result Tentu saja, parameter input dan output dapat digunakan bersama-sama, sehingga Anda dapat mencobanya sendiri. Selain itu, jika Anda ingin mengeluarkan kumpulan hasil kueri pernyataan dinamis, saya hanya memikirkan metode berikut untuk menggunakan tabel sementara, saya tidak tahu apakah Anda memiliki cara yang lebih baik. JIKA object_id('[tempdb].[ dbo].#tmp') IS NOT NULL -- Menentukan apakah tabel sementara #tmp ada, dan jika ada, hapus Drop Table #tmp pilih * ke #tmp dari nama tabel di mana 1=2 -- Buat tabel sementara #tmp dengan struktur yang sama dengan nama tabel
declare @QueryString nvarchar(1000) -- variabel nama kueri dinamis (Catatan: harus jenis ntext atau nchar nvarchar, bukan tipe varchar) set @QueryString='pilih * dari nama tabel ' Masukkan ke dalam #tmp(bidang1,bidang2,...) eksekutif(@querystirng) |