1: Vanliga SQL-satser kan köras med exec
Välj * från tableName exec('select * from tableName') exec sp_executesql N'select * från tableName' – Observera att du måste lägga till N före strängen
2: När fältnamn, tabellnamn, databasnamn etc. används som variabler måste dynamisk SQL användas
Förklara @fname Varchar(20) set @fname = 'FiladNamn' Välj @fname från tableName – Fel, inget fel uppstår, men resultatet är ett fast värde FiledName, vilket inte är vad du vill ha. exec('select ' + @fname + ' från tableName') – notera att ett mellanslag läggs till på sidan av det enkla citattecknet före och efter plustecknet
Självklart kan du också ändra strängen till formen av en variabel Förklara @fname Varchar(20) sätt @fname = 'Filnamn' --Sätt fältnamnet
Förklara @s varchar(1000) set @s = 'select ' + @fname + ' från tableName' exec(@s) – framgång exec sp_executesql @s -- Denna mening kommer att rapportera ett fel
deklarera @s Nvarchar(1000) – notera att det ändras till nvarchar(1000) här. set @s = 'select ' + @fname + ' från tableName' exec(@s) – framgång exec sp_executesql @s – denna mening är korrekt
3. Utgångsparametrar Deklarera @num int, @sqls nvarchar(4000) set @sqls='select count(*) from tableName' exec(@sqls)
--hur lägger jag in resultatet av exec-exekvering i en variabel?
Deklarera @num int, @sqls nvarchar(4000) set @sqls='select @a=count(*) från tableName ' exec sp_executesql @sqls,N'@a int output',@num output Välj @num
1: Vanliga SQL-satser kan köras med Exec Exempel: Välj * från tableName Exec('select * from tableName') Exec sp_executesql N'select * från tableName' – Observera att du måste lägga till N före strängen
2: När fältnamn, tabellnamn, databasnamn etc. används som variabler måste dynamisk SQL användas
Fel: deklarera @fname varchar(20) set @fname = 'FiladNamn' Välj @fname från tableName – Fel, inget fel uppstår, men resultatet är ett fast värde FiledName, vilket inte är vad du vill ha. Korrekt: Exec('select ' + @fname + ' from tableName') -- lägg märke till ett mellanslag på sidan av det enkla citattecknet före och efter plustecknet
Självklart kan du också ändra strängen till formen av en variabel Förklara @fname Varchar(20) sätt @fname = 'Filnamn' --Sätt fältnamnet
Förklara @s varchar(1000) set @s = 'select ' + @fname + ' från tableName' Exec(@s) -- Framgång exec sp_executesql @s -- Denna mening kommer att rapportera ett fel
--Observera: @s parameter måste vara av ntext-, nchar- eller nvarchar-typ, deklarera @s varchar(1000) måste ändras till att deklarera @s nvarchar(1000)
Följande följer: deklarera @s Nvarchar(1000) – notera att det ändras till nvarchar(1000) här.
sätt @fname = 'Filnamn' --Sätt fältnamnet set @s = 'select ' + @fname + ' från tableName' Exec(@s) -- Framgång exec sp_executesql @s – denna mening är korrekt
3. In- eller utgångsparametrar
(1) Indataparametrar: Deklarera @QueryString nvarchar(1000) – dynamisk frågesatsvariabel (obs: måste vara ntext eller nchar nvarchar-typ, inte varchar-typ) Deklarera @paramstring nvarchar(200) – sätt parametersträngen i det dynamiska uttalandet (notera: måste vara ntext eller nchar nvarchar-typ, inte varchar-typ) Deklarera @input_id int - definierar värdet på parametrarna som ska skickas in i det dynamiska uttalandet
Sätt @QueryString='välj * från tabellnamn där id=@id' --id är fältnamnet, @id är parametern som ska skickas set @paramstring='@id int' – Sätter strängen som definierar parametrarna i det dynamiska satsen Sätt @input_id =1 -- Sätt värdet på parametern som ska skickas i det dynamiska uttalandet till 1 exec sp_executesql @querystring,@paramstring,@id=@input_id Om det finns flera parametrar: Deklarera @QueryString nvarchar(1000) – dynamisk frågesatsvariabel (obs: måste vara ntext eller nchar nvarchar-typ, inte varchar-typ) Deklarera @paramstring nvarchar(200) – sätt parametersträngen i det dynamiska uttalandet (notera: måste vara ntext eller nchar nvarchar-typ, inte varchar-typ) Deklarera @input_id int - definierar värdet på parametern som ska skickas in i den dynamiska satsen, parameter 1 Deklarera @input_name varchar(20) - definierar värdet på argumentet som ska skickas in i det dynamiska uttalandet, parameter 2
Sätt @QueryString='select * från tabellnamn där id=@id och name=@name' --id och namn är fältnamn, och @id och @name är parametrarna som ska skickas Sätt @paramstring='@id int,@name varchar(20)' -- Sätt strängen för definitionen av parametrarna i det dynamiska uttalandet, separerad med "," Sätt @input_id =1 -- Sätt värdet på parametern som ska skickas i det dynamiska uttalandet till 1 Sätt @input_name='Zhang San' --Sätt värdet på parametern som ska skickas i det dynamiska uttalandet till 'Zhang San' exec sp_executesql @querystring,@paramstring,@id=@input_id,@name=@input_name -- Notera ordningen på argumenten (2) Utgångsparametrar Deklarera @num int, @sqls nvarchar(4000) set @sqls='select count(*) from tableName' exec(@sqls) --hur lägger jag in resultatet av exec-exekvering i en variabel? Deklarera @QueryString nvarchar(1000) – dynamisk variabel för frågenamn (Obs: måste vara ntext eller nchar nvarchar-typ, inte varchar-typ) Deklarera @paramstring nvarchar(200) – sätt parametersträngen i det dynamiska uttalandet (notera: måste vara ntext eller nchar nvarchar-typ, inte varchar-typ) Deklarera @output_result int – frågeresultatet tilldelas @output_result
set @QueryString='select @totalcount=count(*) från tablename' --@totalcount är utdataparametern Sätt @paramstring='@totalcount int-utgång' --Sätt strängen definierad av parametrarna i det dynamiska uttalandet, separerad med "," exec sp_executesql @querystring,@paramstring,@totalcount=@output_result output Välj @output_result Självklart kan in- och utgångsparametrarna användas tillsammans, så du kan prova själv. Dessutom, om du vill ge resultatuppsättningen för en dynamisk satsfråga, tänker jag bara på följande metod att använda temporära tabeller, jag vet inte om du har ett bättre sätt. OM object_id('[tempdb].[ dbo].#tmp') ÄR INTE NULL -- Bestäm om den tillfälliga tabellen #tmp existerar, och om den gör det, ta bort den Droppbord #tmp Välj * i #tmp från tabellnamn där 1=2 -- Skapa en tillfällig tabell #tmp med samma struktur som tabellnamn
Deklarera @QueryString nvarchar(1000) – dynamisk variabel för frågenamn (Obs: måste vara ntext eller nchar nvarchar-typ, inte varchar-typ) set @QueryString='välj * från tabellnamn ' infoga i #tmp(fält1,fält2,...) exec(@querystirng) |