2013-08-03 4 views
0

У меня есть следующие UDF:Передача параметров после вызова хранимой процедуры

create function fn_name 
    (@first varchar(50), 
    @middle varchar(50), 
    @last Varchar(50)) 
returns varchar(100) 
as 
begin 
    return 
     case 
     when @middle is null then @first+' '[email protected] 
     when Len(@middle)=0 then @first+' '[email protected] 
     else @first+' '[email protected]+' '[email protected] 
     end 
end 

Я имею в виду создание хранимой процедуры для вышеуказанной функции, но таким образом, что я передаю в параметрах один за другим после вызов хранимой процедуры. Возможно ли это в SQL Server? Если да, то как?

+0

Что значит «пройти по параметрам один за другим»? Можете ли вы отредактировать вопрос и представить эскиз того, что вы хотите, чтобы назывные выглядели? –

+0

, как в приведенной выше функции, если нет среднего имени, оно не будет выполнено. Поэтому я хочу превратить это в сохраненный proc, но хочу передать каждый из этих параметров по одному после того, как я вызвал Proc. – lahure

+0

Вы не можете использовать 'RETURNS' в процедуре, чтобы указать другой тип данных. 'RETURN' предназначен только для целых значений, и он должен быть зарезервирован для кодов состояния/ошибки. Если вы хотите вернуть одно значение, используйте параметр «OUTPUT». –

ответ

0

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

create procedure usp_name (
    @first varchar(50) = '', 
    @middle varchar(50) = '', 
    @last varchar(50) = '', 
    @name varchar(100) output 
) 
as 
begin 
     select @name = (case when @middle is null then @first+' '[email protected] 
          when Len(@middle)=0 then @first+' '[email protected] 
          else @first+' '[email protected]+' '[email protected] 
         end); 
end; -- usp_name 

Теперь все три параметра являются необязательными. Если вы вызываете его таким образом:

declare @name varchar(100); 
exec @name = @name output; 

Затем оно вернет ''. Если вы звоните:

declare @name varchar(100); 
exec @first = 'Gordon', @last = 'Linoff', @name = @name output; 

Тогда вы получите 'Gordon Linoff'.

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

+0

За исключением 'return varchar()' не анализируется, равно как и тело. –

+0

@AaronBertrand. , , Исправлена. (Другой случай, кстати, где я на самом деле его протестировал и скопировал неверную версию.) –

+0

Вы пытались его выполнить? 'Msg 245, Level 16, State 1, Procedure usp_name, Line 9 Ошибка преобразования при преобразовании значения varchar 'Gordon Linoff' в тип данных int.' Вы все равно не можете вернуть строку. –

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