1: Vanlige SQL-setninger kan kjøres med exec
Velg * fra tableName exec('velg * fra tableName') exec sp_executesql N'select * fra tableName' -- Merk at du må legge til N før strengen
2: Når man bruker feltnavn, tabellnavn, databasenavn osv. som variabler, må dynamisk SQL brukes
erklær @fname varchar(20) sett @fname = 'FiledName' Velg @fname fra tableName -- Feil, ingen feil vises, men resultatet er en fast verdi FiledName, som ikke er det du ønsker. exec('select ' + @fname + ' fra tableName') – merk at det legges til et mellomrom på siden av det ene anførselstegnet før og etter plusstegnet
Selvfølgelig kan du også endre strengen til formen til en variabel erklær @fname varchar(20) sett @fname = 'FiledName' --Sett feltnavnet
erklær @s varchar(1000) sett @s = 'velg ' + @fname + ' fra tableName' exec(@s) – suksess utøvende sp_executesql @s -- Denne setningen vil rapportere en feil
erklær @s Nvarchar(1000) – merk at det er endret til nvarchar(1000) her. sett @s = 'velg ' + @fname + ' fra tableName' exec(@s) – suksess Exec sp_executesql @s – denne setningen er korrekt
3. Utgangsparametere Erklær @num int, @sqls nvarchar(4000) sett @sqls='velg antall(*) fra tableName' exec(@sqls)
--hvordan legger jeg resultatet av executive execution inn i en variabel?
Erklær @num int, @sqls nvarchar(4000) sett @sqls='velg @a=tell(*) fra tabellNavn ' exec sp_executesql @sqls, N'@a int output',@num output Velg @num
1: Vanlige SQL-setninger kan kjøres med Exec Eksempel: Velg * fra tableName Exec('velg * fra tableName') Exec sp_executesql N'select * fra tableName' – Merk at du må legge til N før strengen
2: Når man bruker feltnavn, tabellnavn, databasenavn osv. som variabler, må dynamisk SQL brukes
Feil: erklær @fname varchar(20) sett @fname = 'FiledName' Velg @fname fra tableName -- Feil, ingen feil vises, men resultatet er en fast verdi FiledName, som ikke er det du ønsker. Korrekt: Exec('select ' + @fname + ' fra tableName') – legg merke til at det legges til et mellomrom på siden av det ene anførselstegn før og etter plusstegnet
Selvfølgelig kan du også endre strengen til formen til en variabel erklær @fname varchar(20) sett @fname = 'FiledName' --Sett feltnavnet
erklær @s varchar(1000) sett @s = 'velg ' + @fname + ' fra tableName' Exec(@s) -- Suksess utøvende sp_executesql @s -- Denne setningen vil rapportere en feil
--Merk: @s parameter må være av ntext-, nchar- eller nvarchar-typen, erklære @s varchar(1000) må endres til å deklarere @s nvarchar(1000)
Som følger: erklær @s Nvarchar(1000) – merk at det er endret til nvarchar(1000) her.
sett @fname = 'FiledName' --Sett feltnavnet sett @s = 'velg ' + @fname + ' fra tableName' Exec(@s) -- Suksess Exec sp_executesql @s – denne setningen er korrekt
3. Inn- eller utgangsparametere
(1) Inndataparametere: Deklarer @QueryString nvarchar(1000) – dynamisk spørringssetningsvariabel (merk: må være ntext eller nchar nvarchar-type, ikke varchar-type) Deklarer @paramstring nvarchar(200) – sett strengen av parametere i den dynamiske setningen (merk: må være ntext eller nchar nvarchar-type, ikke varchar-type) Deklarer @input_id int - definerer verdien av parameterne som skal sendes inn i den dynamiske setningen
Sett @QueryString='velg * fra tabellnavn der ID=@id' --id er feltnavnet, @id er parameteren som skal sendes sett @paramstring='@id int' -- Setter strengen som definerer parameterne i den dynamiske setningen Sett @input_id =1 -- Sett verdien av parameteren som skal sendes i den dynamiske setningen til 1 exec sp_executesql @querystring,@paramstring,@id=@input_id Hvis det er flere parametere: Deklarer @QueryString nvarchar(1000) – dynamisk spørringssetningsvariabel (merk: må være ntext eller nchar nvarchar-type, ikke varchar-type) Deklarer @paramstring nvarchar(200) – sett strengen av parametere i den dynamiske setningen (merk: må være ntext eller nchar nvarchar-type, ikke varchar-type) Declare @input_id int - definerer verdien av parameteren som skal sendes inn i den dynamiske setningen, parameter 1 Deklarer @input_name varchar(20) - definerer verdien av argumentet som skal sendes inn i den dynamiske setningen, parameter 2
Sett @QueryString='velg * fra tabellnavn hvor id=@id og name=@name' --id og navn er feltnavn, og @id og @name er parameterne som skal sendes sett @paramstring='@id int,@name varchar(20)' -- Sett strengen til definisjonen av parameterne i den dynamiske setningen, adskilt med "," Sett @input_id =1 -- Sett verdien av parameteren som skal sendes i den dynamiske setningen til 1 sett @input_name='Zhang San' --Sett verdien av parameteren som skal sendes i den dynamiske setningen til 'Zhang San' exec sp_executesql @querystring,@paramstring,@id=@input_id,@name=@input_name -- Legg merke til rekkefølgen på argumentene (2) Utgangsparametere Erklær @num int, @sqls nvarchar(4000) sett @sqls='velg antall(*) fra tableName' exec(@sqls) --hvordan legger jeg resultatet av executive execution inn i en variabel? deklarer @QueryString nvarchar(1000) – dynamisk spørringsnavnvariabel (Merk: må være ntext eller nchar nvarchar-type, ikke varchar-type) Deklarer @paramstring nvarchar(200) – sett strengen av parametere i den dynamiske setningen (merk: må være ntext eller nchar nvarchar-type, ikke varchar-type) Deklarer @output_result INT – spørringsresultatet tilordnes @output_result
sett @QueryString='velg @totalcount=tell(*) fra tabellnavn' --@totalcount er utgangsparameteren sett @paramstring='@totalcount int-utgang' --Sett strengen definert av parameterne i den dynamiske setningen, adskilt med "," exec sp_executesql @querystring,@paramstring,@totalcount=@output_result output velg @output_result Selvfølgelig kan input- og outputparametere brukes sammen, så du kan prøve det selv. I tillegg, hvis du vil gi ut resultatsettet fra en dynamisk setningsspørring, tenker jeg bare på følgende metode med å bruke midlertidige tabeller, jeg vet ikke om du har en bedre måte. HVIS object_id('[tempdb].[ dbo].#tmp') ER IKKE NULL -- Bestem om den midlertidige tabellen #tmp eksisterer, og hvis den gjør det, slett den Slippbord #tmp Velg * i #tmp fra tabellnavn hvor 1=2 -- Opprett en midlertidig tabell #tmp med samme struktur som tabellnavn
deklarer @QueryString nvarchar(1000) – dynamisk spørringsnavnvariabel (Merk: må være ntext eller nchar nvarchar-type, ikke varchar-type) sett @QueryString='velg * fra tabellnavn ' Sett inn i #tmp(Felt1,Felt2,...) Exec(@querystirng) |