Динамический SQl с сохраненным процессом - PullRequest
1 голос
/ 04 января 2011

Как я могу использовать sp_executesql с параметрами динамического значения

Я хочу создать значение параметра с помощью цикла из строки, разделенной запятыми, или что-то вроде этого

declare @sql nvarchar(1000),  @answer nvarchar(1000)
set @sql='SELECT TOP 1000 [UserID]
      ,[DateOfBirth]
      ,[UserActivityType]
      ,[FirstName]
      ,[LastName]
      ,[Gender]
  FROM [LogX].[dbo].[UserDetails] where firstname=@name and gender =@gender '
  set @values =  '"jack","1"' 
  EXEC  sp_executesql   @sql  , N'@name nvarchar(100),@gender tinyint',@values 

обратите внимание, что может быть более 2 параметров Любая идея? спасибо.

Ответы [ 3 ]

0 голосов
/ 04 января 2011

Вы знаете, что ВСЯ точка sp_executesql состоит в том, чтобы препятствовать выполнению конкатенации строк.Вы можете использовать библиотеку, такую ​​как linq, для динамического создания запросов, которые затем будут использовать sp_Executesql.

Конкатенация строк в запросах SQL - это ключевой вектор атаки на веб-сайты и приложения, называемые SQL-инъекцией. SQL-инъекция в Википедии

0 голосов
/ 04 января 2011

Вам нужно было бы разобрать строку значений CSV в отдельные переменные, чтобы затем передать их в sp_executesql - это никак не обходится при использовании параметризованного SQL, как вы (а это именно то, что вы должны делать).1002 * В противном случае вы бы смотрели на (ужасную) конкатенацию строк для вашего динамического SQL вместо параметризации, что было бы плохо.

0 голосов
/ 04 января 2011

попробуйте

declare @sql nvarchar(1000),  @answer nvarchar(1000)
set @sql='SELECT TOP 1000 [UserID]
      ,[DateOfBirth]
      ,[UserActivityType]
      ,[FirstName]
      ,[LastName]
      ,[Gender]
  FROM [LogX].[dbo].[UserDetails] where firstname='+@name+' and gender ='+@gender
  set @values =  '"jack","1"' 
  EXEC  sp_executesql   @sql  , N'@name nvarchar(100),@gender tinyint',@values

использовать конкатенацию строк для передачи параметров

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