2013-03-03 15 views
23

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

+0

Вы можете сделать EXEC GetTaskEvents 'TESTTASK' – DevelopmentIsMyPassion

ответ

4

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

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

27

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 
2

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

Так происходит по моему предположению

If TaskName = "Path1" Then Something

If TaskName = "Path2" Then Something Else

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

Но если вы должны ...

Почему бы не попробовать динамический SQL, как это было предложен @E.J 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 Profiler.)

0

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

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

Процедура Calling

DECLARE @return_value nvarchar(50) 

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

SELECT 'Return Value' = @return_value 
0

вы разбор неправильного параметра combination.here вы проходя @TaskName = и @ID вместо @TaskName = .sp нужны только один параметр.

Смежные вопросы