Передача динамических параметров в хранимую процедуру в SQL Server 2008 - PullRequest
2 голосов
/ 29 марта 2012

У меня есть эта процедура, которая выполняет другую процедуру, переданную параметром и его параметрами datefrom и dateto.

CREATE procedure [dbo].[execute_proc] 
@procs varchar(200),
@pdatefrom date,
@pdateto date
as

exec @procs  @datefrom=@pdatefrom,@dateto=@pdateto

Но мне нужно также передавать параметры динамически без необходимости их редактирования в процедуре. Например, я представляю себе что-то вроде этого

 CREATE procedure [dbo].[execute_proc] 
    @procs varchar(200),
    @params varchar(max)
 as
    exec @procs @params 

где @params - строка типа @param1=1,@param2='somethingelse'

Есть ли способ сделать это?

Ответы [ 2 ]

5 голосов
/ 29 марта 2012

Не совсем понятно, в чем смысл вашей процедуры-оболочки (одитинг? Отладка?), И это кажется очень неловким решением. Если вы объясните, почему вы хотите это сделать, у кого-то может быть совершенно другое и, надеюсь, лучшее решение.

Самая большая проблема в вашем предложении заключается в том, что вы можете передавать параметры только в виде строк, а это означает, что вы должны решить все проблемы с экранированием, преобразованием / форматированием данных и внедрением SQL, которые поставляются с динамическим SQL . Было бы намного лучше вызывать каждую процедуру напрямую, передавая правильно набранные параметры из вашего вызывающего кода.

Сказав все это, если вы действительно хотите это сделать, вы можете сделать что-то вроде этого:

create proc dbo.ExecuteProcedure
    @ProcedureName sysname,
    @Parameters nvarchar(max),
    @Debug bit = 0x0,
    @Execute bit = 0x1
as
set nocount on
begin

declare @sql nvarchar(max)
set @sql = 'exec ' + quotename(@ProcedureName) + ' ' + @Parameters

if @Debug = 0x1 print @sql

if @Execute = 0x1 exec(@sql)

end
go

exec dbo.ExecuteProcedure 'dbo.SomeProc', '@p1 = 1, @p2 = ''themhz''s proc''', 0x1, 0x0

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

0 голосов
/ 21 ноября 2013
  1. Поместите имя хранимой процедуры в поле varchar в вашей клиентской таблице
  2. Получите имя SP и присвойте его параметру (spName), когда выбран клиент.
  3. В коде создайте функцию, которая возвращает строку

    function PassStoredProcedureName (spName as string) в виде строки

    return spName

    end function

  4. Установите для своего набора данных значение «Хранимая процедура»

  5. Откройте окно выражения набора данных
  6. Enter = Code.PassStoredProcedureName (Параметры! SpName.value)

Когда вы выбрали клиента, параметру будет присвоено имя spName.Когда набор данных выполняется, он передает параметр в функцию, которая передает spName в набор данных.

Я использую это для выполнения пользовательских хранимых процедур для клиентов, когда одна и та же хранимая процедура не будет работать для всех клиентов.,

Обязательно нормализуйте имена псевдонимов полей, чтобы поиск данных в отчете не прерывался.

Ваши хранимые процедуры должны всегда иметь одинаковые требования к параметрам, даже если они не нужны.

...