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

不要忘了标记它作为acceepted,如果你有你想要的信息 – 2013-03-27 13:07:00

+0

你可以使用表变量,而不是临时表,然后你可以使用函数。 – 2013-11-12 21:04:47

回答

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 2013-03-27 11:17:52

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为你帮助它解决我使用的输出:) – DnL 2013-03-27 18:36:53

+0

游标必须避免。您可以使用'select @emails = @emails + hr.Employees ...'的电子邮件 – 2013-11-12 21:09:12

0

您可以使用表变量来代替临时表。在这种情况下,您可以继续使用UDF。