1

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

Я хотел знать, есть ли у вас совет.

Я сделал это, чтобы сделать строку с электронными письмами, разделенными символом «;» поэтому я могу иметь все «менеджерские» письма в одном varchar (для получателей).

ALTER procedure [dbo].[Manager_email] 
AS 
BEGIN 
    declare @mails varchar (max), 
      @number_of_mails int, 
      @counter int 
    set @counter=2 
    create table #temp (id int identity, email varchar(30)) 
    insert into #temp (email) 
    select Email 
    from hr.Employees 
    where lower (EmpRole) like 'manager' 
    set @[email protected]@ROWCOUNT 
    set @mails = (select email from #temp where id =1) + ';' 
    while @counter <= @number_of_mails 
    BEGIN 
     set @mails = @mails + (select email from #temp where id [email protected]) + ';' 
     set @counter = @counter+1 
    END 
    drop table #temp 
    return cast (@mails as varchar (200)) 
END 
+0

Не забудьте отметить его, как если бы вы получили нужную вам информацию –

+0

Вы можете использовать переменную таблицы вместо таблицы temp, тогда вы можете использовать функцию. –

ответ

4

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

Пример

CREATE PROCEDURE Sales.uspGetEmployeeSalesYTD 
@SalesPerson nvarchar(50), 
@SalesYTD money OUTPUT 
AS 

    SET NOCOUNT ON; 
    SELECT @SalesYTD = SalesYTD 
    FROM Sales.SalesPerson AS sp 
    JOIN HumanResources.vEmployee AS e ON e.BusinessEntityID = sp.BusinessEntityID 
    WHERE LastName = @SalesPerson; 
RETURN 

, как в описанной выше процедуре возврата @SalesYTD из процедуры.

вы можете проверить полный пост на MSDN: Returning Data by Using OUTPUT Parameters

+0

+1 Выходной параметр предпочтительнее даже для целого числа – Andomar

1

Вы можете использовать функцию вместо

CREATE FUNCTION Manager_email() 
RETURNS varchar(max) 
AS 
BEGIN 
    declare @email varchar(30) 
    declare @emails varchar(max) 

    set @emails = '' 

    declare cur cursor for 
    select Email 
    from hr.Employees 
    where lower (EmpRole) like 'manager' 

    open cur 

    fetch next from cur into @email 

    while @@fetch_status = 0 
    begin 
     set @emails = @emails + @email + ';' 
     fetch next from cur into @email 
    end 

    close cur 
    deallocate cur 

    return @emails 
END 
+0

ty для ur помогите ему сработало я использовал выход :) – DnL

+0

Курсоры следует избегать. Вы можете использовать 'select @emails = @emails + Email от hr.Employees ...' –

0

Вы можете использовать таблицы переменных вместо временной таблицы. В этом случае вы можете продолжать использовать UDF.

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