1

我试图创建一个返回的函数varchar,但我不能,因为我在CREATE TABLE里面使用,当我用一个过程创建它时,我不能返回一个值。

我想知道你是否有什么建议。

我这样做只是为了制作一个字符串,其中包含用“;”分隔的电子邮件 所以我可以将所有“经理”邮件放在一个 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 @number_of_mails=@@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 =@counter ) + ';'
        set @counter = @counter+1
    END
    drop table #temp
    return cast (@mails as varchar (200))
END
4

3 回答 3

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 上的完整帖子:使用 OUTPUT 参数返回数据

于 2013-03-27T11:13:55.837 回答
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
于 2013-03-27T12:19:48.613 回答
0

您可以使用表变量而不是临时表。在这种情况下,您可以继续使用 UDF。

于 2013-11-12T21:17:19.323 回答