Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 返回varchar的过程_Sql_Sql Server_Tsql_Stored Procedures_User Defined Functions - Fatal编程技术网

Sql 返回varchar的过程

Sql 返回varchar的过程,sql,sql-server,tsql,stored-procedures,user-defined-functions,Sql,Sql Server,Tsql,Stored Procedures,User Defined Functions,我试图创建一个返回varchar的函数,但我不能,因为我在内部使用CREATETABLE,当我使用过程创建它时,我不能返回值 我想知道你是否有什么建议 我这样做只是为了让电子邮件之间的间隔字符串;这样我就可以把所有经理的邮件都放在一个varchar中给收件人 ALTER procedure [dbo].[Manager_email] AS BEGIN declare @mails varchar (max), @number_of_mails int,

我试图创建一个返回varchar的函数,但我不能,因为我在内部使用CREATETABLE,当我使用过程创建它时,我不能返回值

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

我这样做只是为了让电子邮件之间的间隔字符串;这样我就可以把所有经理的邮件都放在一个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

您只能从过程返回整数值,如果要从过程返回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上查看全文:

您只能从过程返回整数值,如果您想从过程返回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上的完整帖子:

您可以改用函数

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

您可以改用函数

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

可以使用表变量代替临时表。在这种情况下,您可以继续使用自定义项。

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

不要忘记将其标记为acceepted。如果您获得了所需的信息,您可以使用表变量而不是临时表,那么您就可以使用函数。如果您获得了所需的信息,请不要忘了将其标记为acceepted。您可以使用表变量而不是临时表,然后您可以使用函数。必须避免使用游标。您可以使用select@emails=@emails+来自人力资源部的电子邮件。员工…必须避免使用光标。您可以使用select@emails=@emails+来自人力资源部员工的电子邮件。。。