1: Instrucțiunile SQL obișnuite pot fi executate cu exec
Selectează * din tabel Nume exec('select * din tableName') exec sp_executesql N'select * from tableName' -- Rețineți că trebuie să adăugați N înainte de șirul
2: Când se folosesc nume de câmpuri, tabele, nume de baze de date etc. ca variabile, trebuie folosit SQL dinamic
declară-l pe @fname Varchar(20) set @fname = 'NumeÎnregistrată' Selectează @fname din tableName -- Eroare, nu apare nicio eroare, dar rezultatul este o valoare fixă FiledName, ceea ce nu este ceea ce dorești. exec('select ' + @fname + ' from tableName') – observați că se adaugă un spațiu pe partea ghilimelelor înainte și după semnul plus
Desigur, poți schimba și șirul în forma unei variabile declară-l pe @fname Varchar(20) set @fname = 'FiledName' --Setează numele câmpului
Declară @s Varchar (1000) set @s = 'select' + @fname + ' from tableName' exec(@s) -- succes executiv sp_executesql @s -- Această propoziție va raporta o eroare
declarați @s Nvarchar(1000) – rețineți că aici s-a schimbat în nvarchar(1000). set @s = 'select' + @fname + ' from tableName' exec(@s) -- succes Executiv sp_executesql @s -- această propoziție este corectă
3. Parametri de ieșire declară @num int, @sqls nvarchar(4000) set @sqls='select count(*) from tableName' executiv(@sqls)
--cum pun rezultatul execuției executivului într-o variabilă?
declară @num int, @sqls nvarchar(4000) set @sqls='select @a=count(*) from tableName ' exec sp_executesql @sqls,N'@a int output',@num output selectează @num
1: Instrucțiunile SQL obișnuite pot fi executate cu Exec Exemplu: Selectează * din tableName Exec('select * dinTableName') Exec sp_executesql N'select * from tableName' -- Rețineți că trebuie să adăugați N înainte de șirul
2: Când se folosesc nume de câmpuri, tabele, nume de baze de date etc. ca variabile, trebuie folosit SQL dinamic
Eroare: declară @fname varchar(20) set @fname = 'NumeÎnregistrată' Selectează @fname din tableName -- Eroare, nu apare nicio eroare, dar rezultatul este o valoare fixă FiledName, ceea ce nu este ceea ce dorești. Corect: Exec('select ' + @fname + ' from tableName') – observați adăugarea unui spațiu pe partea ghilimelelor unice înainte și după semnul plus
Desigur, poți schimba și șirul în forma unei variabile declară-l pe @fname Varchar(20) set @fname = 'FiledName' --Setează numele câmpului
Declară @s Varchar (1000) set @s = 'select' + @fname + ' from tableName' Exec(@s) -- Succes executiv sp_executesql @s -- Această propoziție va raporta o eroare
--Notă: @s parametru trebuie să fie de tip ntext sau nchar sau nvarchar, declară @s varchar(1000) trebuie schimbat pentru a declara @s nvarchar(1000)
Așa cum urmează: declarați @s Nvarchar(1000) – rețineți că aici s-a schimbat în nvarchar(1000).
set @fname = 'FiledName' --Setează numele câmpului set @s = 'select' + @fname + ' from tableName' Exec(@s) -- Succes Executiv sp_executesql @s -- această propoziție este corectă
3. Parametri de intrare sau ieșire
(1) Parametri de intrare: declare @QueryString nvarchar(1000) -- variabilă dinamică de interogare (notă: trebuie să fie de tip ntext sau nchar nvarchar, nu de tip varchar) Declară @paramstring nvarchar(200) - setează șirul de parametri în enunțata dinamică (notă: trebuie să fie de tip ntext sau nchar nvarchar, nu de tip varchar) declare @input_id int - definește valoarea parametrilor care urmează să fie transferați în enunțata dinamică
setați @QueryString='select * din numele tabelului, unde id=@id' --id este numele câmpului, @id este parametrul care trebuie transmis set @paramstring='@id int' -- Setează șirul care definește parametrii din enunțata dinamică setează @input_id =1 -- Setează valoarea parametrului ce urmează să fie transmis în instrucțiunea dinamică la 1 executiv sp_executesql @querystring,@paramstring,@id=@input_id Dacă există mai mulți parametri: declare @QueryString nvarchar(1000) -- variabilă dinamică de interogare (notă: trebuie să fie de tip ntext sau nchar nvarchar, nu de tip varchar) Declară @paramstring nvarchar(200) - setează șirul de parametri în enunțata dinamică (notă: trebuie să fie de tip ntext sau nchar nvarchar, nu de tip varchar) declare @input_id int - definește valoarea parametrului ce urmează să fie transmis în instrucțiunea dinamică, parametrul 1 Declare @input_name varchar(20) - definește valoarea argumentului care trebuie transmis în enunțata dinamică, parametrul 2
setați @QueryString='select * din tablename, unde id=@id și name=@name' --id și name sunt nume de câmpuri, iar @id și @name sunt parametrii de trecut setați @paramstring='@id int,@name varchar(20)' -- Setați șirul definiției parametrilor în instrucțiunea dinamică, separat de "," setează @input_id =1 -- Setează valoarea parametrului ce urmează să fie transmis în instrucțiunea dinamică la 1 setați @input_name='Zhang San' --Setați valoarea parametrului ce urmează să fie transmis în enunțata dinamică la 'Zhang San' exec sp_executesql @querystring,@paramstring,@id=@input_id,@name=@input_name -- Observați ordinea argumentelor (2) Parametri de ieșire declară @num int, @sqls nvarchar(4000) set @sqls='select count(*) from tableName' executiv(@sqls) --cum pun rezultatul execuției executivului într-o variabilă? declare @QueryString nvarchar(1000) -- variabilă dinamică de nume interogare (Notă: trebuie să fie de tip ntext sau nchar nvarchar, nu de tip varchar) Declară @paramstring nvarchar(200) - setează șirul de parametri în enunțata dinamică (notă: trebuie să fie de tip ntext sau nchar nvarchar, nu de tip varchar) declare @output_result int - rezultatul interogării este atribuit @output_result
Set @QueryString='Select @totalcount=Count(*) from Table Name' --@totalcount este parametrul de ieșire setează @paramstring='@totalcount int output' --Setează șirul definit de parametrii din instrucțiunea dinamică, separat de "," exec sp_executesql @querystring,@paramstring,@totalcount=@output_result ieșire selectează @output_result Desigur, parametrii de intrare și ieșire pot fi folosiți împreună, așa că poți încerca tu însuți. În plus, dacă vrei să generezi setul de rezultate al interogării de instrucțiuni dinamice, mă gândesc doar la următoarea metodă de a folosi tabele temporare, nu știu dacă ai o metodă mai bună. DACĂ object_id('[tempdb].[ dbo].#tmp') NU ESTE NULĂ -- Determinați dacă tabelul temporar #tmp există și, dacă există, ștergeți-l Drop Table #tmp selectează * în #tmp din numele tabelului unde 1=2 -- Creează un #tmp temporar de tabel cu aceeași structură ca numele tabelului
declare @QueryString nvarchar(1000) -- variabilă dinamică de nume interogare (Notă: trebuie să fie de tip ntext sau nchar nvarchar, nu de tip varchar) Set @QueryString='Select * din numele tabelului ' inserează în #tmp(field1,field2,...) exec(@querystirng) |