1: Обычные SQL-операторы могут выполняться с exec
Выберите * из tableName exec('выбрать * из tableName') exec sp_executesql N'select * из tableName' — Обратите внимание, что нужно добавить N перед строкой
2: При использовании имён полей, таблиц, баз данных и т. д. в качестве переменных необходимо использовать динамический SQL
Объявить @fname Варчар(20) set @fname = 'FileName' Выберите @fname из tableName — Ошибка, ошибка не запрашивается, но результат — фиксированное значение FileName, что не соответствует вашему желанию. exec('выбрать ' + @fname + ' из tableName') — обратите внимание, что к стороне единой кавычки добавляется пробел до и после знака плюс
Конечно, вы также можете изменить строку в форму переменной Объявить @fname Варчар(20) set @fname = 'FileedName' --Задать имя поля
Объявить @s Вархар (1000) set @s = 'выбрать ' + @fname + ' из tableName' exec(@s) -- успех Исполнительный sp_executesql @s — В этом предложении будет обнаружена ошибка
объявить @s Nvarchar(1000) — обратите внимание, что здесь оно изменено на nvarchar(1000). set @s = 'выбрать ' + @fname + ' из tableName' exec(@s) -- успех Исполнительный sp_executesql @s — это предложение верно
3. Параметры выхода Объявить @num интеллект, @sqls Нварчар (4000) set @sqls='выберите count(*) из 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 — Ошибка, ошибка не запрашивается, но результат — фиксированное значение FileName, что не соответствует вашему желанию. Верно: Exec('выбрать ' + @fname + ' из tableName') — обратите внимание на добавление пробела сбоку от одной кавычки до и после знака плюс
Конечно, вы также можете изменить строку в форму переменной Объявить @fname Варчар(20) set @fname = 'FileedName' --Задать имя поля
Объявить @s Вархар (1000) set @s = 'выбрать ' + @fname + ' из tableName' Исполнитель(@s) -- Успех Исполнительный sp_executesql @s — В этом предложении будет обнаружена ошибка
--Примечание: @s параметр должен быть типа ntext, nchar или nvarchar, объявлять @s varchar(1000) должен быть изменен на @s nvarchar(1000)
Следующим образом: объявить @s Nvarchar(1000) — обратите внимание, что здесь оно изменено на nvarchar(1000).
set @fname = 'FileedName' --Задать имя поля set @s = 'выбрать ' + @fname + ' из tableName' Исполнитель(@s) -- Успех Исполнительный sp_executesql @s — это предложение верно
3. Входные или выходные параметры
(1) Входные параметры: Declare @QueryString nvarchar(1000) -- переменная оператора динамического запроса (примечание: должен быть ntext или nchar nvarchar type, а не 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 type, а не varchar) Объявить @paramstring nvarchar(200) — задать строку параметров в динамическом операторе (примечание: должен быть тип ntext или nchar nvarchar, а не тип varchar) Declare @input_id int — определяет значение параметра, который должен передаваться в динамический оператор, параметр 1 Declare @input_name varchar(20) — определяет значение аргумента, который должен передаваться в динамический оператор, параметр 2
Set @QueryString='Select * из tablename, где 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='выберите count(*) из tableName' exec(@sqls) --как ввести результат exec execution в переменную? declare @QueryString nvarchar(1000) -- переменная с именем динамического запроса (Примечание: должен быть тип ntext или nchar nvarchar, а не тип varchar) Объявить @paramstring nvarchar(200) — задать строку параметров в динамическом операторе (примечание: должен быть тип ntext или nchar nvarchar, а не тип varchar) объявить @output_result int — результат запроса назначается @output_result
Set @QueryString='выберите @totalcount=count(*) из названия таблицы' --@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 * из названия таблицы ' Вставить в #tmp(поле1,поле2,...) exec(@querystirng) |