Параметры хранимой процедуры 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? Любая помощь, очень ценится. Благодаря
Ответы
Ответ 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 нужен только один параметр.