Sql 选择函数中的语句-别名、with、temp表格等

Sql 选择函数中的语句-别名、with、temp表格等,sql,sql-server,Sql,Sql Server,我试图创建一个函数,用户输入一个日期,然后接收一个表。 函数返回一个表,该表显示每天(transdate)收到的邮件类型和数量,然后生成特定于每种邮件类型的运行总数。作为select语句,它可以正常工作,但当我尝试使用函数格式时,会收到错误: “函数中包含的Select语句无法将数据返回到客户端。” 创建函数DailyMailCount(@Date-datetime) 返回@Count表 ( [ID]整数标识(1,1), 转换日期时间, 捐赠瓦查尔(10), DailyCount int, 运行

我试图创建一个函数,用户输入一个日期,然后接收一个表。 函数返回一个表,该表显示每天(transdate)收到的邮件类型和数量,然后生成特定于每种邮件类型的运行总数。作为select语句,它可以正常工作,但当我尝试使用函数格式时,会收到错误: “函数中包含的Select语句无法将数据返回到客户端。”

创建函数DailyMailCount(@Date-datetime)
返回@Count表
(
[ID]整数标识(1,1),
转换日期时间,
捐赠瓦查尔(10),
DailyCount int,
运行总整数
) 
作为
开始
声明@running_total表(Transdate DATETIME,varchar(30),countz INT,row INT)
插入@running_total
选择转换日期、捐赠、计数(*)
,第_行编号()超过(按捐赠顺序按TransDate ASC划分)作为第行
从RevInt.detail捐赠,其中TransDate>“@Date”按TransDate分组,捐赠
挑选
r1.日期转换,
r1.捐赠,
r1.countz,
总和(r2.countz)为运行总数
从@running_总计r1
左外连接@running_总r2在r2上。捐赠=r1。捐赠
和r2.row正确的语法是:

CREATE FUNCTION DailyMailCount(@Date datetime)
RETURNS @Count TABLE (
   [ID] int identity (1,1),
   Transdate datetime, 
   Donation varchar (10), 
   DailyCount int,  
   RunningTotal int    
) 
as begin
    DECLARE @running_total TABLE (Transdate DATETIME,Donation varchar(30), countz INT,row int)
    INSERT INTO @running_total
        SELECT TransDate,Donation, COUNT(*),
               ROW_number() OVER (PARTITION BY Donation order by TransDate ASC) as row 
        FROM DetailDonation
        WHERE TransDate > '@Date'
        GROUP BY TransDate, Donation;

    insert into @Count
        SELECT r1.Transdate, r1.Donation, r1.countz,
               SUM(r2.countz) as running_total
        FROM @running_total r1
             LEFT OUTER JOIN @running_total r2
             on r2.donation = r1.Donation AND r2.row <= r1.row
        GROUP BY r1.transdate, r1.countz, r1.donation, r1.row
        ORDER BY r1.Donation;

    RETURN;
END;

这看起来像一个存储过程,而不是函数。我对函数和存储过程不熟悉。你能简单地解释一下为什么这应该是SP吗?谢谢,我会尝试一下。我不确定我是否正确地跟踪了你。你介意复制粘贴我的原始代码并告诉我你将如何更改它吗?@user2200270。我修好了。我最初的回答是错误的,非常有效!谢谢
CREATE FUNCTION DailyMailCount(@Date datetime)
RETURNS @Count TABLE (
   [ID] int identity (1,1),
   Transdate datetime, 
   Donation varchar (10), 
   DailyCount int,  
   RunningTotal int    
) 
as begin
    DECLARE @running_total TABLE (Transdate DATETIME,Donation varchar(30), countz INT,row int)
    INSERT INTO @running_total
        SELECT TransDate,Donation, COUNT(*),
               ROW_number() OVER (PARTITION BY Donation order by TransDate ASC) as row 
        FROM DetailDonation
        WHERE TransDate > '@Date'
        GROUP BY TransDate, Donation;

    insert into @Count
        SELECT r1.Transdate, r1.Donation, r1.countz,
               SUM(r2.countz) as running_total
        FROM @running_total r1
             LEFT OUTER JOIN @running_total r2
             on r2.donation = r1.Donation AND r2.row <= r1.row
        GROUP BY r1.transdate, r1.countz, r1.donation, r1.row
        ORDER BY r1.Donation;

    RETURN;
END;
return with running_total as (
    SELECT TransDate,Donation, COUNT(*),
           ROW_number() OVER (PARTITION BY Donation order by TransDate ASC) as row 
    FROM RevInt.DetailDonation
    WHERE TransDate > '@Date'
    GROUP BY TransDate,Donation
)
SELECT r1.Transdate, r1.Donation, r1.countz, SUM(r2.countz) as running_total
FROM running_total r1 LEFT OUTER JOIN
     running_total r2
     on r2.donation = r1.Donation
                AND r2.row <= r1.row
GROUP BY r1.transdate, r1.countz, r1.donation, r1.row
ORDER BY r1.Donation