1

を返す関数を作ろうとしたのですが、内部でvarchar使っているので作れませんCREATE TABLEし、手続きで作っていると値を返すことができません。

何かアドバイスがあれば知りたかったです。

「;」で区切られた電子メールで文字列を作成するためだけにこれを作成しました そのため、すべての「マネージャー」メールを 1 つの 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 に答える