1: Tavalliset SQL-lauseet voidaan suorittaa exec:llä
Valitse * taulukon nimestä exec('valitse * taulukon nimestä') exec sp_executesql N'select * from tableName' -- Huomaa, että sinun täytyy lisätä N ennen merkkijonoa
2: Kun käytetään muuttujina kenttien nimiä, taulunimiä, tietokantanimiä jne., dynaamista SQL:ää on käytettävä
julistaa @fname varchar(20) set @fname = 'FiledName' Valitse @fname tableName -- Virhe, virheilmoitusta ei tule, mutta tuloksena on kiinteä arvo FiledName, mikä ei ole sitä, mitä haluat. exec('select ' + @fname + ' from tableName') -- huomaa, että yksittäisen lainausmerkin sivuun lisätään väli plus-merkin eteen ja jälkeen
Tietenkin voit myös muuttaa merkkijonon muuttujan muotoon julistaa @fname varchar(20) aseta @fname = 'FiledName' --Aseta kentän nimi
julista @s varchar(1000) aseta @s = 'valitse ' + @fname + ' taulunimestä' exec(@s) -- menestys johtaja sp_executesql @s -- Tämä lause raportoi virheen
ilmoita @s Nvarchar(1000) -- huomaa, että tässä se on muutettu muotoon nvarchar(1000). aseta @s = 'valitse ' + @fname + ' taulunimestä' exec(@s) -- menestys Exec sp_executesql @s -- Tämä lause on oikea
3. Lähtöparametrit Declare @num int, @sqls nvarchar(4000) aseta @sqls='valitse count(*) taulukosta' exec(@sqls)
--miten laitan suorituskyvyn tuloksen muuttujaan?
Declare @num int, @sqls nvarchar(4000) aseta @sqls='valitse @a=count(*) taulukon nimestä' exec sp_executesql @sqls,N'@a int output', @num output Valitse @num
1: Tavallisia SQL-lauseita voidaan suorittaa Exec-menetelmällä Esimerkki: Valitse * from tableName Exec('valitse * taulukon nimestä') Exec sp_executesql N'select * from tableName' -- Huomaa, että sinun täytyy lisätä N ennen merkkijonoa
2: Kun käytetään muuttujina kenttien nimiä, taulunimiä, tietokantanimiä jne., dynaamista SQL:ää on käytettävä
Virhe: julista @fname varchar(20) set @fname = 'FiledName' Valitse @fname tableName -- Virhe, virheilmoitusta ei tule, mutta tuloksena on kiinteä arvo FiledName, mikä ei ole sitä, mitä haluat. Oikein: Exec('select ' + @fname + ' from tableName') -- huomaa, että yksittäisen lainausmerkin sivuun lisätään välilyönti plus-merkin edellä ja jälkeen
Tietenkin voit myös muuttaa merkkijonon muuttujan muotoon julistaa @fname varchar(20) aseta @fname = 'FiledName' --Aseta kentän nimi
julista @s varchar(1000) aseta @s = 'valitse ' + @fname + ' taulunimestä' Exec(@s) -- Menestys johtaja sp_executesql @s -- Tämä lause raportoi virheen
--Huomautus: @s parametrin täytyy olla ntext-, nchar- tai nvarchar-tyyppinen, declare @s varchar(1000) on muutettava deklare-@s nvarchar(1000)
Seuraavasti: ilmoita @s Nvarchar(1000) -- huomaa, että tässä se on muutettu muotoon nvarchar(1000).
aseta @fname = 'FiledName' --Aseta kentän nimi aseta @s = 'valitse ' + @fname + ' taulunimestä' Exec(@s) -- Menestys Exec sp_executesql @s -- Tämä lause on oikea
3. Syöte- tai lähtöparametrit
(1) Syöteparametrit: Declare @QueryString nvarchar(1000) -- dynaaminen kyselylauseen muuttuja (huom: täytyy olla ntext tai nchar nvarchar tyyppi, ei varchar-tyyppi) Declare @paramstring nvarchar(200) - aseta parametrien merkkijono dynaamisessa lauseessa (huom: täytyy olla ntext tai nchar nvarchar -tyyppi, ei varchar-tyyppi) declare @input_id int - määrittelee parametrien arvon, jotka välitetään dynaamiseen lauseeseen
Aseta @QueryString='valitse * taulukon nimestä, jossa id=@id' --id on kentän nimi, @id on välitettävä parametri joukko @paramstring='@id int' -- Asettaa merkkijonon, joka määrittelee parametrit dynaamisessa lauseessa joukko @input_id =1 -- Aseta dynaamisessa lauseessa välitettävän parametrin arvoksi 1 exec sp_executesql @querystring,@paramstring,@id=@input_id Jos parametreja on useita: Declare @QueryString nvarchar(1000) -- dynaaminen kyselylauseen muuttuja (huom: täytyy olla ntext tai nchar nvarchar tyyppi, ei varchar-tyyppi) Declare @paramstring nvarchar(200) - aseta parametrien merkkijono dynaamisessa lauseessa (huom: täytyy olla ntext tai nchar nvarchar -tyyppi, ei varchar-tyyppi) declare @input_id int - määrittelee parametrin arvon, joka välitetään dynaamiseen lauseeseen, parametri 1 declare @input_name varchar(20) - määrittelee argumentin arvon, joka välitetään dynaamiseen lauseeseen, parametri 2
aseta @QueryString='valitse * taulukon nimestä, jossa id=@id ja name=@name' --id ja name ovat kentän nimiä, ja @id ja @name ovat välitettävät parametrit joukko @paramstring='@id int,@name varchar(20)' -- Aseta dynaamisen lauseen parametrien määritelmän merkkijono, erotettuna "," joukko @input_id =1 -- Aseta dynaamisessa lauseessa välitettävän parametrin arvoksi 1 aseta @input_name='Zhang San' --Aseta dynaamisessa lauseessa välitettävän parametrin arvoksi 'Zhang San' exec sp_executesql @querystring,@paramstring,@id=@input_id,@name=@input_name -- Huomaa argumenttien järjestys (2) Lähtöparametrit Declare @num int, @sqls nvarchar(4000) aseta @sqls='valitse count(*) taulukosta' exec(@sqls) --miten laitan suorituskyvyn tuloksen muuttujaan? declare @QueryString nvarchar(1000) -- dynaaminen kyselyn nimimuuttuja (Huom: täytyy olla ntext tai nchar nvarchar tyyppi, ei varchar-tyyppi) Declare @paramstring nvarchar(200) - aseta parametrien merkkijono dynaamisessa lauseessa (huom: täytyy olla ntext tai nchar nvarchar -tyyppi, ei varchar-tyyppi) Declare @output_result int – kyselytulos annetaan @output_result
Aseta @QueryString='valitse @totalcount=count(*) taulukon nimestä' --@totalcount on lähtöparametri aseta @paramstring='@totalcount int output' --Aseta merkkijono, joka määritellään dynaamisen lauseen parametreilla, erotettuna "," exec sp_executesql @querystring,@paramstring,@totalcount=@output_result tulos Valitse @output_result Tietenkin syöte- ja tulostusparametreja voi käyttää yhdessä, joten voit kokeilla itse. Lisäksi, jos haluat tuottaa dynaamisen lausekyselyn tuloksen, ajattelen vain seuraavaa menetelmää väliaikaisten taulukoiden käyttämiseksi, en tiedä onko sinulla parempaa tapaa. IF object_id('[tempdb].[ dbo].#tmp') EI OLE NULL -- Määritä, onko väliaikainen taulu #tmp olemassa, ja jos on, poista se Pudota pöytä #tmp valitse * #tmp taulunimestä, missä 1=2 -- Luo väliaikainen taulu#tmp jolla on sama rakenne kuin taulunimi
declare @QueryString nvarchar(1000) -- dynaaminen kyselyn nimimuuttuja (Huom: täytyy olla ntext tai nchar nvarchar tyyppi, ei varchar-tyyppi) aseta @QueryString='valitse * taulukon nimestä ' lisää #tmp(field1,field2,...) exec(@querystirng) |