Подтвердить что ты не робот

Параметры хранимой процедуры SQL Server

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

Проблема возникает, когда я передаю параметр хранимой процедуре, но сохраненный proc не принимает такой параметр.

Например, моя хранимая процедура:

CREATE PROCEDURE GetTaskEvents
    @TaskName varchar(50)
AS
BEGIN
-- SP Logic
END

Вызов хранимой процедуры как:

EXEC GetTaskEvents @TaskName = 'TESTTASK', @ID = 2

Это вызывает ошибку ниже:

Msg 8144, Level 16, State 2, Procedure GetTaskEvents, Line 0
Procedure or function GetTaskEvents has too many arguments specified.

Это отлично работает в Sybase ASE, который просто игнорирует любые дополнительные параметры. Может ли это быть достигнуто с сервером MSSQL 2008? Любая помощь, очень ценится. Благодаря

4b9b3361

Ответ 1

Зачем вам передавать параметр в хранимую процедуру, которая его не использует?

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

Ответ 2

SQL Server не позволяет передавать параметры в процедуру, которую вы не определили. Я думаю, что ближе всего к такой конструкции можно использовать необязательные параметры:

CREATE PROCEDURE GetTaskEvents
    @TaskName varchar(50),
    @ID int = NULL
AS
BEGIN
-- SP Logic
END;

Вам нужно будет включить все возможные параметры, которые вы можете использовать в определении. Затем вы можете бесплатно вызвать процедуру в любом случае:

EXEC GetTaskEvents @TaskName = 'TESTTASK', @ID = 2;
EXEC GetTaskEvents @TaskName = 'TESTTASK'; -- @ID gets NULL here

Ответ 3

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

Итак, исходя из моего предположения

Если TaskName = "Path1" Then Something

Если TaskName = "Path2" Then Something Else

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

Но если вам нужно...

Почему бы не попробовать динамический SQL, как было предложено @EJ Brennan (Простите, я не коснулся SQL через некоторое время, поэтому мой синтаксис может быть ржавым). говоря, что я не знаю, подходит ли его лучший подход, но может ли это удовлетворить ваши потребности?

CREATE PROCEDURE GetTaskEvents
    @TaskName varchar(50)
    @Values varchar(200)
AS
BEGIN
  DECLARE @SQL VARCHAR(MAX)

  IF @TaskName = 'Something'
  BEGIN
    @SQL = 'INSERT INTO.....' + CHAR(13)
    @SQL += @Values + CHAR(13) 
  END

  IF @TaskName = 'Something Else'
  BEGIN
    @SQL = 'DELETE SOMETHING WHERE' + CHAR(13)
    @SQL += @Values + CHAR(13) 
  END

  PRINT(@SQL)
  EXEC(@SQL)    
END

(CHAR (13) добавляет новую строку.. старый habbit, который я где-то выбрал, используемый для помощи в отладке/чтении динамических процедур при запуске SQL-профайлера.)

Ответ 4

CREATE PROCEDURE GetTaskEvents
@TaskName varchar(50),
@Id INT
AS
BEGIN
-- SP Logic
END

Вызов процедуры

DECLARE @return_value nvarchar(50)

EXEC  @return_value = GetTaskEvents
        @TaskName = 'TaskName',
        @Id =2  

SELECT  'Return Value' = @return_value

Ответ 5

используйте, как этот Exec GetTaskEvents @paramOne, @parmTwo, @ParamN

Ответ 6

Вы анализируете неправильную комбинацию параметров. Здесь вы передаете @TaskName = и @ID вместо @TaskName =.SP нужен только один параметр.