1: Gewone SQL-statements kunnen worden uitgevoerd met exec
Selecteer * uit tableName exec('selecteer * uit tableName') exec sp_executesql N'selecteer * uit tableName' -- Let op dat je N moet toevoegen vóór de string
2: Bij het gebruik van veldnamen, tabelnamen, databasenamen, enzovoort als variabelen, moet dynamische SQL worden gebruikt
Verklaar @fname Varchar(20) set @fname = 'FiledName' Selecteer @fname uit tableName -- Fout, er wordt geen foutmelding gegeven, maar het resultaat is een vaste waarde FiledName, wat niet is wat je wilt. exec('select ' + @fname + ' uit tableName') -- let op dat er een spatie wordt toegevoegd aan de zijkant van het enkele aanhalingsteken voor en na het plusteken
Natuurlijk kun je de string ook veranderen in de vorm van een variabele Verklaar @fname Varchar(20) stel @fname = 'FiledName' --Stel de veldnaam in
Verklaar @s Varchar(1000) set @s = 'select ' + @fname + ' uit tableName' exec(@s) -- succes exec sp_executesql @s -- Deze zin zal een fout melden
verklaar @s Nvarchar(1000) -- let op dat het hier is veranderd in nvarchar(1000). set @s = 'select ' + @fname + ' uit tableName' exec(@s) -- succes exec sp_executesql @s -- deze zin is correct
3. Uitvoerparameters Verklaar @num int, @sqls nvarchar(4000) set @sqls='selecteer aantal(*) uit tableName' exec(@sqls)
--hoe zet ik het resultaat van executie-uitvoering in een variabele?
Verklaar @num int, @sqls nvarchar(4000) set @sqls='selecteer @a=count(*) uit tableName ' exec sp_executesql @sqls,N'@a int output',@num output Selecteer @num
1: Gewone SQL-statements kunnen worden uitgevoerd met Exec Voorbeeld: Selecteer * uit tableName Exec('select * from tableName') Exec sp_executesql N'selecteer * uit tableName' -- Let op dat je N moet toevoegen vóór de string
2: Bij het gebruik van veldnamen, tabelnamen, databasenamen, enzovoort als variabelen, moet dynamische SQL worden gebruikt
Fout: verklaar @fname varchar(20) set @fname = 'FiledName' Selecteer @fname uit tableName -- Fout, er wordt geen foutmelding gegeven, maar het resultaat is een vaste waarde FiledName, wat niet is wat je wilt. Correct: Exec('select ' + @fname + ' from tableName') -- let op de opvoeging van een spatie aan de zijkant van het enkele citatiepunt voor en na het plusteken
Natuurlijk kun je de string ook veranderen in de vorm van een variabele Verklaar @fname Varchar(20) stel @fname = 'FiledName' --Stel de veldnaam in
Verklaar @s Varchar(1000) set @s = 'select ' + @fname + ' uit tableName' Direct(@s) -- Succes exec sp_executesql @s -- Deze zin zal een fout melden
--Opmerking: @s parameter moet van ntext, nchar of nvarchar zijn, declare @s varchar(1000) moet worden gewijzigd om @s nvarchar(1000) te declareren
Als volgt: verklaar @s Nvarchar(1000) -- let op dat het hier is veranderd in nvarchar(1000).
stel @fname = 'FiledName' --Stel de veldnaam in set @s = 'select ' + @fname + ' uit tableName' Direct(@s) -- Succes exec sp_executesql @s -- deze zin is correct
3. Invoer- of uitvoerparameters
(1) Invoerparameters: Declareer @QueryString nvarchar(1000) -- dynamische query-instructievariabele (opmerking: moet ntext of nchar nvarchar zijn, niet varchar type) Declare @paramstring nvarchar(200) - stel de reeks parameters in in de dynamische instructie (opmerking: moet ntext of nchar nvarchar type zijn, niet varchar-type) declare @input_id int - definieert de waarde van de parameters die in de dynamische instructie moeten worden doorgegeven
stel @QueryString='selecteer * uit tabelnaam waarbij id=@id' --id is de veldnaam, @id is de parameter die doorgegeven moet worden set @paramstring='@id int' -- Stelt de string in die de parameters in de dynamische instructie definieert stel @input_id =1 -- Stel de waarde van de parameter die in de dynamische instructie moet worden doorgegeven in op 1 exec sp_executesql @querystring,@paramstring,@id=@input_id Als er meerdere parameters zijn: Declareer @QueryString nvarchar(1000) -- dynamische query-instructievariabele (opmerking: moet ntext of nchar nvarchar zijn, niet varchar type) Declare @paramstring nvarchar(200) - stel de reeks parameters in in de dynamische instructie (opmerking: moet ntext of nchar nvarchar type zijn, niet varchar-type) declare @input_id int - definieert de waarde van de parameter die in de dynamische instructie wordt doorgegeven, parameter 1 declare @input_name varchar(20) - definieert de waarde van het argument dat in de dynamische instructie, parameter 2, wordt doorgegeven
stel @QueryString='selecteer * uit tablename waarbij id=@id en name=@name' --id en naam veldnamen zijn, en @id en @name de parameters zijn die doorgegeven moeten worden stel @paramstring='@id int,@name varchar(20)' -- Stel de string in van de definitie van de parameters in de dynamische stelling, gescheiden door "," stel @input_id =1 -- Stel de waarde van de parameter die in de dynamische instructie moet worden doorgegeven in op 1 stel @input_name='Zhang San' in --Stel de waarde van de parameter die in de dynamische instructie moet worden doorgegeven in naar 'Zhang San' exec sp_executesql @querystring,@paramstring,@id=@input_id,@name=@input_name -- Let op de volgorde van de argumenten (2) Uitgangsparameters Verklaar @num int, @sqls nvarchar(4000) set @sqls='selecteer aantal(*) uit tableName' exec(@sqls) --hoe zet ik het resultaat van executie-uitvoering in een variabele? declare @QueryString nvarchar(1000) -- dynamische querynaamvariabele (Opmerking: moet ntext of nchar nvarchar zijn, niet varchar type) Declare @paramstring nvarchar(200) - stel de reeks parameters in in de dynamische instructie (opmerking: moet ntext of nchar nvarchar type zijn, niet varchar-type) Declareer @output_result int - het queryresultaat wordt toegewezen aan de @output_result
stel @QueryString='selecteer @totalcount=count(*) uit tabelnaam' --@totalcount is de outputparameter stel @paramstring='@totalcount int output' --Stel de string die wordt gedefinieerd door de parameters in de dynamische instructie, gescheiden door "," exec sp_executesql @querystring,@paramstring,@totalcount=@output_result output Selecteer @output_result Natuurlijk kunnen de input- en outputparameters samen worden gebruikt, dus je kunt het zelf proberen. Bovendien, als je de resultaatset van een dynamische statementquery wilt uitvoeren, denk ik alleen aan de volgende methode van het gebruik van tijdelijke tabellen; ik weet niet of je een betere manier hebt. ALS object_id('[tempdb].[ dbo].#tmp') IS NIET NULL -- Bepaal of de tijdelijke tabel #tmp bestaat, en als dat zo is, verwijder deze dan Drop-tafel #tmp selecteer * in #tmp van tabelnaam waarbij 1=2 -- Maak een tijdelijke tabel #tmp aan met dezelfde structuur als tabelnaam
declare @QueryString nvarchar(1000) -- dynamische querynaamvariabele (Opmerking: moet ntext of nchar nvarchar zijn, niet varchar type) set @QueryString='selecteer * uit tabelnaam ' Invoegen in #tmp(veld1,veld2,...) exec(@querystirng) |