1: Běžné SQL příkazy lze vykonávat pomocí exec
Vyberte * z tabulkyNázev exec('select * from tableName') exec sp_executesql N'select * from tableName' -- Všimněte si, že musíte přidat N před řetězec
2: Při použití názvů polí, tabulek, databází atd. jako proměnných je nutné použít dynamický SQL
Deklarujte @fname varchar(20) set @fname = 'FiledName' Vyberte @fname z tableName – Chyba, žádná chyba se nezobrazí, ale výsledkem je pevná hodnota FiledName, což není to, co chcete. exec('select ' + @fname + ' z tableName') -- všimněte si, že na stranu jedné uvozovky je přidána mezera před a za plus znaménkem
Samozřejmě můžete také změnit řetězec na proměnnou Deklarujte @fname varchar(20) set @fname = 'FiledName' --Nastavte název pole
Deklarujte @s Varchar (1000) set @s = 'select ' + @fname + ' from tableName' exec(@s) -- úspěch exec sp_executesql @s -- Tato věta nahlásí chybu
declare @s Nvarchar(1000) – všimněte si, že zde je to změněno na nvarchar(1000). set @s = 'select ' + @fname + ' from tableName' exec(@s) -- úspěch exec sp_executesql @s – tato věta je správná
3. Výstupní parametry Deklarujte @num Int, @sqls Nvarchar (4000) set @sqls='select count(*) z tableName' exec(@sqls)
--jak vložím výsledek exec do proměnné?
Deklarujte @num Int, @sqls Nvarchar (4000) nastavte @sqls='vybrat @a=count(*) z tableName ' exec sp_executesql @sqls,N'@a int output',@num output Vyberte @num
1: Běžné SQL příkazy lze vykonávat pomocí Exec Example: Vyberte * z tableName Exec('select * from tableName') Exec sp_executesql N'select * from tableName' -- Všimněte si, že musíte přidat N před řetězec
2: Při použití názvů polí, tabulek, databází atd. jako proměnných je nutné použít dynamický SQL
Chyba: declare @fname varchar(20) set @fname = 'FiledName' Vyberte @fname z tableName – Chyba, žádná chyba se nezobrazí, ale výsledkem je pevná hodnota FiledName, což není to, co chcete. Správně: Exec('select ' + @fname + ' from tableName') -- všimněte si přidání mezery vedle jedné uvozovky před a za znakem plus
Samozřejmě můžete také změnit řetězec na proměnnou Deklarujte @fname varchar(20) set @fname = 'FiledName' --Nastavte název pole
Deklarujte @s Varchar (1000) set @s = 'select ' + @fname + ' from tableName' Výkon(@s) -- Úspěch exec sp_executesql @s -- Tato věta nahlásí chybu
--Poznámka: @s parametr musí být ntext, nchar nebo nvarchar typu, deklarujte @s varchar(1000) musí být změněn na declare @s nvarchar(1000)
Následovně: declare @s Nvarchar(1000) – všimněte si, že zde je to změněno na nvarchar(1000).
set @fname = 'FiledName' --Nastavte název pole set @s = 'select ' + @fname + ' from tableName' Výkon(@s) -- Úspěch exec sp_executesql @s – tato věta je správná
3. Vstupní nebo výstupní parametry
(1) Vstupní parametry: declare @QueryString nvarchar(1000) -- dynamická proměnná dotazu (poznámka: musí být ntext nebo nchar nvarchar typ, nikoli varchar type) Declare @paramstring nvarchar(200) - nastavte řetězec parametrů v dynamickém příkazu (poznámka: musí být ntext nebo nchar nvarchar typ, nikoli varchar type) declare @input_id int - definuje hodnotu parametrů, které mají být předány do dynamického příkazu
nastavte @QueryString='vyberte * z názvu tabulky, kde id=@id' --id je název pole, @id je parametr, který se má předat set @paramstring='@id int' -- Nastavuje řetězec, který definuje parametry v dynamickém příkazu nastavte @input_id =1 -- Nastavte hodnotu parametru, který má být předán v dynamickém příkazu, na 1 exec sp_executesql @querystring,@paramstring,@id=@input_id Pokud existuje více parametrů: declare @QueryString nvarchar(1000) -- dynamická proměnná dotazu (poznámka: musí být ntext nebo nchar nvarchar typ, nikoli varchar type) Declare @paramstring nvarchar(200) - nastavte řetězec parametrů v dynamickém příkazu (poznámka: musí být ntext nebo nchar nvarchar typ, nikoli varchar type) declare @input_id int - definuje hodnotu parametru, který má být předán do dynamického příkazu, parametr 1 declare @input_name varchar(20) - definuje hodnotu argumentu, který má být předáván do dynamického příkazu, parametr 2
Set @QueryString='select * z názvu tabulky, kde id=@id a jméno=@name' --id a name jsou názvy polí a @id a @name jsou parametry, které se mají předat nastavte @paramstring='@id int,@name varchar(20)' -- Nastavte řetězec definice parametrů v dynamickém příkazu, oddělený "," nastavte @input_id =1 -- Nastavte hodnotu parametru, který má být předán v dynamickém příkazu, na 1 nastav @input_name='Zhang San' --Nastavte hodnotu parametru, který má být předán v dynamickém příkazu na 'Zhang San' exec sp_executesql @querystring,@paramstring,@id=@input_id,@name=@input_name -- Všimněte si pořadí argumentů (2) Výstupní parametry Deklarujte @num Int, @sqls Nvarchar (4000) set @sqls='select count(*) z tableName' exec(@sqls) --jak vložím výsledek exec do proměnné? declare @QueryString nvarchar(1000) -- dynamická proměnná jména dotazu (Poznámka: musí být ntext nebo nchar nvarchar typ, nikoli varchar typ) Declare @paramstring nvarchar(200) - nastavte řetězec parametrů v dynamickém příkazu (poznámka: musí být ntext nebo nchar nvarchar typ, nikoli varchar type) deklarujte @output_result int – výsledek dotazu je přiřazen @output_result
Set @QueryString='select @totalcount=count(*) from table name' --@totalcount je výstupní parametr set @paramstring='@totalcount int output' --Nastavte řetězec definovaný parametry v dynamickém příkazu, oddělený "," výkonný sp_executesql @querystring, @paramstring, @totalcount=@output_result výstup Vyberte @output_result Samozřejmě, vstupní a výstupní parametry lze použít společně, takže si to můžete vyzkoušet sami. Navíc, pokud chcete výstup výstupní sady dotazu na dynamické příkazy, napadá mě jen následující metoda použití dočasných tabulek, nevím, jestli máte lepší způsob. POKUD object_id('[tempdb].[ dbo].#tmp') NENÍ NULL -- Zjistěte, zda dočasná tabulka #tmp existuje, a pokud ano, smažte ji Drop table #tmp vyberte * do #tmp z názvu tabulky, kde 1=2 – Vytvořte dočasnou tabulku #tmp se stejnou strukturou jako název tabulky
declare @QueryString nvarchar(1000) -- dynamická proměnná jména dotazu (Poznámka: musí být ntext nebo nchar nvarchar typ, nikoli varchar typ) Set @QueryString='vybrat * z názvu tabulky ' vložit do #tmp(field1,field2,...) exec(@querystirng) |