T-SQL: почему sp_executesql требует своих типов параметров? - PullRequest
0 голосов
/ 07 апреля 2019

Интересно, почему sp_executesql требует точно указать все его типы параметров (@params).

sp_executesql [ @stmt = ] statement  
[   
  { , [ @params = ] N'@parameter_name data_type [ OUT | OUTPUT ][ ,...n ]' }   
     { , [ @param1 = ] 'value1' [ ,...n ] }  
]  

Поскольку каждый раз, когда пользователь передает параметры - каждый параметр уже имеет свой собственный тип, который (я надеюсь) может быть определен внутри хранимой процедуры без явного описания?

Ответы [ 2 ]

3 голосов
/ 07 апреля 2019

sp_executeSql - это процедура для выполнения операторов динамического SQL. В нем нет определений для каких-либо параметров, используемых в выполняемом операторе, поэтому вы должны предоставить эти определения так же, как и в любом другом операторе SQL, использующем параметры.
Если вы не отправите определение параметров, ядро ​​SQL Server не сможет узнать, как обрабатывать параметры в динамическом операторе SQL.

Из официальной документации :

Примечание
@stmt может содержать параметры, имеющие такую ​​же форму, что и имя переменной, например:
N'SELECT * FROM HumanResources.Employee WHERE EmployeeID = @IDParameter'

Каждый параметр, включенный в @stmt, должен иметь соответствующую запись как в списке определения параметров @params, так и в списке значений параметров.

1 голос
/ 07 апреля 2019

Давайте посмотрим на пример.

create table #tbl (id int,val varchar(20))
insert #tbl values(1,'abc'),(2,'def')

create procedure update_tmp
@id int, @val varchar(50)
as
exec sp_executesql N'update #tbl set val=@val where id=@id', -- (1) query to execute
   N'@id int, @val varchar(20)', -- (2) query params declaration
   @id=@id, @val=@val -- (3) param initialization
-- left parts are defined in sp_executesql context, right parts go from outer sp definition

select * from #tbl

(1) и (2) могут быть @variable с

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...