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