1: Tavalisi SQL-lauseid saab täita koos exec-iga
Vali * tabelinimest exec('select * from tableName') exec sp_executesql N'select * from tableName' -- Pane tähele, et enne stringi tuleb lisada N
2: Kui kasutatakse muutujatena väljade nimesid, tabelinimesid, andmebaasinimesid jne, tuleb kasutada dünaamilist SQL-i
deklareeri @fname Varchar(20) set @fname = 'FiledName' Vali @fname tabelinimest -- Viga, viga ei tule, kuid tulemuseks on fikseeritud väärtus FiledName, mis pole see, mida sa soovid. exec('select ' + @fname + ' from tableName') -- pane tähele, et ühe jutumärgi serve lisatakse tühik enne ja pärast plussmärki
Loomulikult saab ka stringi muuta muutuja kujuliseks deklareeri @fname Varchar(20) sea @fname = 'FiledName' --Sea välja nimi
deklareeri @s varchar (1000) sea @s = 'vali ' + @fname + ' tableName' exec(@s) -- edu täitja sp_executesql @s -- See lause teatab veast
deklareeri @s Nvarchar(1000) – pane tähele, et siin on see muudetud nvarchar(1000)-ks. sea @s = 'vali ' + @fname + ' tableName' exec(@s) -- edu Executive sp_executesql @s -- see lause on õige
3. Väljundparameetrid deklareeri @num int, @sqls nvarchar(4000) sea @sqls='select count(*) from tableName' exec(@sqls)
--kuidas ma panen täidesaatva täitmise tulemuse muutujasse?
deklareeri @num int, @sqls nvarchar(4000) seadista @sqls='vali @a=count(*) tabelinimest' exec sp_executesql @sqls,N'@a int väljund', @num väljund vali @num
1: Tavalisi SQL-lauseid saab täita Exec-iga Näide: Vali * tabelinimest Exec('vali * tableName'st') Exec sp_executesql N'select * from tableName' -- Pane tähele, et enne stringi tuleb lisada N
2: Kui kasutatakse muutujatena väljade nimesid, tabelinimesid, andmebaasinimesid jne, tuleb kasutada dünaamilist SQL-i
Viga: deklareeri @fname varchar(20) set @fname = 'FiledName' Vali @fname tabelinimest -- Viga, viga ei tule, kuid tulemuseks on fikseeritud väärtus FiledName, mis pole see, mida sa soovid. Õige: Exec('select ' + @fname + ' from tableName') -- märka, et lisatud tühik ühe jutumärgi servale enne ja pärast plus-märki
Loomulikult saab ka stringi muuta muutuja kujuliseks deklareeri @fname Varchar(20) sea @fname = 'FiledName' --Sea välja nimi
deklareeri @s varchar (1000) sea @s = 'vali ' + @fname + ' tableName' Exec(@s) -- Edu täitja sp_executesql @s -- See lause teatab veast
--Märkus: @s parameeter peab olema ntext või nchar või nvarchar tüüpi, declare @s varchar(1000) tuleb muuta deklareerimiseks @s nvarchar(1000)
Järgmine: deklareeri @s Nvarchar(1000) – pane tähele, et siin on see muudetud nvarchar(1000)-ks.
sea @fname = 'FiledName' --Sea välja nimi sea @s = 'vali ' + @fname + ' tableName' Exec(@s) -- Edu Executive sp_executesql @s -- see lause on õige
3. Sisend- või väljundparameetrid
(1) Sisendparameetrid: Declare @QueryString nvarchar(1000) -- dünaamiline päringulause muutuja (märkus: peab olema ntext või nchar nvarchar tüüp, mitte varchar tüüp) Declare @paramstring nvarchar(200) – määrata dünaamilises väites parameetrite string (märkus: peab olema ntext või nchar nvarchar tüüp, mitte varchar tüüp) declare @input_id int – määratleb parameetrite väärtuse, mis edastatakse dünaamilisse lausesse
Sea @QueryString='vali * tabelinimest, kus id=@id' --id on välja nimi, @id on parameeter, mida tuleb edastada komplekt @paramstring='@id int' -- Seab stringi, mis määratleb dünaamilise väite parameetrid seada @input_id =1 -- Määra dünaamilises väites edastatava parameetri väärtuseks 1 exec sp_executesql @querystring,@paramstring,@id=@input_id Kui on mitu parameetrit: Declare @QueryString nvarchar(1000) -- dünaamiline päringulause muutuja (märkus: peab olema ntext või nchar nvarchar tüüp, mitte varchar tüüp) Declare @paramstring nvarchar(200) – määrata dünaamilises väites parameetrite string (märkus: peab olema ntext või nchar nvarchar tüüp, mitte varchar tüüp) declare @input_id int - määrab parameetri väärtuse, mis edastatakse dünaamilisse lausesse, parameeter 1 declare @input_name varchar(20) - määrab dünaamilisse lausesse edastatava argumendi väärtuse, parameeter 2
Määra @QueryString='vali * tabelinimest, kus id=@id ja nimi=@name' --id ja nimi on väljade nimed ning @id ja @name on parameetrid, mida edasi antakse komplekt @paramstring='@id int,@name varchar(20)' -- Määra dünaamilise väite parameetrite definitsiooni string, eraldatuna "," seada @input_id =1 -- Määra dünaamilises väites edastatava parameetri väärtuseks 1 seada @input_name='Zhang San' --Sea dünaamilises lauses edastatava parameetri väärtus 'Zhang San' exec sp_executesql @querystring,@paramstring,@id=@input_id,@name=@input_name -- Pane tähele argumentide järjekorda (2) Väljundparameetrid deklareeri @num int, @sqls nvarchar(4000) sea @sqls='select count(*) from tableName' exec(@sqls) --kuidas ma panen täidesaatva täitmise tulemuse muutujasse? declare @QueryString nvarchar(1000) -- dünaamilise päringu nime muutuja (märkus: peab olema ntext või nchar nvarchar tüüp, mitte varchar tüüp) Declare @paramstring nvarchar(200) – määrata dünaamilises väites parameetrite string (märkus: peab olema ntext või nchar nvarchar tüüp, mitte varchar tüüp) Declare @output_result int – päringu tulemus määratakse @output_result
Seade @QueryString='vali @totalcount=count(*) tabelinimest' --@totalcount on väljundparameeter seada @paramstring='@totalcount int väljund' --Sea string, mis on määratud dünaamilise väite parameetritega, eraldatuna "," exec sp_executesql @querystring,@paramstring,@totalcount=@output_result väljund vali @output_result Loomulikult saab sisend- ja väljundparameetreid koos kasutada, nii et võid ise proovida. Lisaks, kui soovid väljundiks saada dünaamilise lausepäringu tulemuste komplekti, mõtlen ainult järgmisele ajutiste tabelite meetodile, ma ei tea, kas sul on paremat lahendust. IF object_id('[tempdb].[ dbo].#tmp') EI OLE NULL -- Määra, kas ajutine tabel #tmp eksisteerib, ja kui eksisteerib, kustuta see Eemalda laud #tmp vali * #tmp tabelinimest, kus 1=2 -- Loo ajutine tabeli #tmp sama struktuuriga nagu TableName
declare @QueryString nvarchar(1000) -- dünaamilise päringu nime muutuja (märkus: peab olema ntext või nchar nvarchar tüüp, mitte varchar tüüp) seadista @QueryString='vali * tabelinimest' sisesta #tmp(field1,field2,...) exec(@querystirng) |