1: Обикновени SQL оператори могат да се изпълняват с exec
Изберете * от tableName exec('select * from tableName') exec sp_executesql N'select * от tableName' -- Обърнете внимание, че трябва да добавите N преди низа
2: Когато се използват имена на полета, таблици, имена на бази данни и др. като променливи, трябва да се използва динамичен SQL
Declare @fname Varchar(20) set @fname = 'FileName' Изберете @fname от tableName -- Грешка, не се появява грешка, но резултатът е фиксирана стойност FiledName, което не е това, което искате. exec('select ' + @fname + ' от tableName') -- обърнете внимание, че се добавя празни интервал отстрани на единичната кавичка преди и след плюс знака
Разбира се, можеш също да промениш струната във формата на променлива Declare @fname Varchar(20) set @fname = 'FiledName' --Задайте името на полето
Обяви @s Вархар (1000) set @s = 'select ' + @fname + ' от tableName' exec(@s) -- успех изпълнителен sp_executesql @s -- Това изречение ще докладва грешка
обявете @s Nvarchar(1000) – обърнете внимание, че тук е променено на nvarchar(1000). set @s = 'select ' + @fname + ' от tableName' exec(@s) -- успех Изпълнителен sp_executesql @s -- Това изречение е вярно
3. Параметри на изхода Обяви @num интелигент, @sqls Нварчар(4000) set @sqls='select count(*) from tableName' exec(@sqls)
--как да поставя резултата от exec execution в променлива?
Обяви @num интелигент, @sqls Нварчар(4000) set @sqls='select @a=count(*) from tableName ' exec sp_executesql @sqls,N'@a int output',@num output Изберете @num
1: Обикновени SQL оператори могат да се изпълняват с Exec Пример: Select * от tableName Exec ('избери * от tableName') Exec sp_executesql N'select * от tableName' -- Имайте предвид, че трябва да добавите N преди низа
2: Когато се използват имена на полета, таблици, имена на бази данни и др. като променливи, трябва да се използва динамичен SQL
Грешка: обяви @fname варчар(20) set @fname = 'FileName' Изберете @fname от tableName -- Грешка, не се появява грешка, но резултатът е фиксирана стойност FiledName, което не е това, което искате. Правилно: Exec('select ' + @fname + ' от tableName') — обърнете внимание на добавянето на интервал отстрани на единичната кавичка преди и след плюс знака
Разбира се, можеш също да промениш струната във формата на променлива Declare @fname Varchar(20) set @fname = 'FiledName' --Задайте името на полето
Обяви @s Вархар (1000) set @s = 'select ' + @fname + ' от tableName' Изпълнител(@s) -- Успех изпълнителен sp_executesql @s -- Това изречение ще докладва грешка
--Забележка: параметърът @s трябва да е от тип ntext или nchar или nvarchar, обявявайте @s varchar(1000) трябва да бъде променена да декларира @s nvarchar(1000)
Както следва: обявете @s Nvarchar(1000) – обърнете внимание, че тук е променено на nvarchar(1000).
set @fname = 'FiledName' --Задайте името на полето set @s = 'select ' + @fname + ' от tableName' Изпълнител(@s) -- Успех Изпълнителен sp_executesql @s -- Това изречение е вярно
3. Входни или изходни параметри
(1) Входни параметри: Declare @QueryString nvarchar(1000) -- динамична променлива за заявки (забележка: трябва да е ntext или nchar тип nvarchar, не тип varchar) Обявете @paramstring nvarchar(200) - Задайте низа от параметри в динамичното изявление (забележка: трябва да е ntext или nchar nvarchar тип, не varchar тип) Declare @input_id int - Определя стойността на параметрите, които трябва да бъдат предадени в динамичния оператор
Задайте @QueryString='Select * от името на таблицата, където id=@id' --id е името на полето, @id е параметърът, който трябва да бъде предаден set @paramstring='@id int' -- Задава низа, който дефинира параметрите в динамичното изявление set @input_id =1 -- Задайте стойността на параметъра, който да се предава в динамичното операторско устройство, на 1 exec sp_executesql @querystring,@paramstring,@id=@input_id Ако има няколко параметъра: Declare @QueryString nvarchar(1000) -- динамична променлива за заявки (забележка: трябва да е ntext или nchar тип nvarchar, не тип varchar) Обявете @paramstring nvarchar(200) - Задайте низа от параметри в динамичното изявление (забележка: трябва да е ntext или nchar nvarchar тип, не varchar тип) declare @input_id int - определя стойността на параметъра, който трябва да бъде прехвърлен в динамичното изявление, параметър 1 Declare @input_name varchar(20) - определя стойността на аргумента, който трябва да бъде прехвърлен в динамичното изявление, параметър 2
Задайте @QueryString='Select * от името на таблицата, където id=@id и name=@name' --id и name са имена на полета, а @id и @name са параметрите, които трябва да се предават set @paramstring='@id int,@name varchar(20)' -- Задайте низа на дефиницията на параметрите в динамичното изявление, разделени с "," set @input_id =1 -- Задайте стойността на параметъра, който да се предава в динамичното операторско устройство, на 1 set @input_name='Zhang San' --Задайте стойността на параметъра, който се предава в динамичното изявление на 'Zhang San'. exec sp_executesql @querystring,@paramstring,@id=@input_id,@name=@input_name -- Обърнете внимание на реда на аргументите (2) Параметри на изхода Обяви @num интелигент, @sqls Нварчар(4000) set @sqls='select count(*) from tableName' exec(@sqls) --как да поставя резултата от exec execution в променлива? declare @QueryString nvarchar(1000) -- динамична променлива с име на заявка (Забележка: трябва да е ntext или nchar nvarchar тип, не varchar тип) Обявете @paramstring nvarchar(200) - Задайте низа от параметри в динамичното изявление (забележка: трябва да е ntext или nchar nvarchar тип, не varchar тип) Declare @output_result int - резултатът от заявката се присвоява на @output_result
set @QueryString='Select @totalcount=count(*) from tablename' --@totalcount е изходният параметър set @paramstring='@totalcount int output' --Задайте низа, дефинирана от параметрите в динамичното изявление, разделена с "," exec sp_executesql @querystring,@paramstring,@totalcount=@output_result output Изберете @output_result Разбира се, входният и изходният параметр могат да се използват заедно, така че можете да опитате сами. Освен това, ако искате да изведете резултатния набор от динамична заявка за оператори, аз се сещам само за следния метод с използване на временни таблици, не знам дали имате по-добър начин. АКО object_id('[tempdb].[ dbo].#tmp') НЕ Е NULL -- Определи дали съществува временната таблица #tmp и ако съществува, изтрий я Drop table #tmp изберете * в #tmp от tablename, където 1=2 -- Създайте временна таблица #tmp със същата структура като tablename
declare @QueryString nvarchar(1000) -- динамична променлива с име на заявка (Забележка: трябва да е ntext или nchar nvarchar тип, не varchar тип) Set @QueryString='Select * from tablename ' Вмъкнете в #tmp(поле1,поле2,...) exec(@querystirng) |