我有一系列基于报告类型的查询.为简单起见,这是我正在尝试做的一个例子:
If @Reporttype = '1' Select lcustomerid, lname, fname from customers Where dtcreated > @startdate Else if @Reporttype = '2' Select barcode, lname, fname from employees where dtcreated > @startdate Else if @reporttype = '3' Select thetime, lname, name, barcode, lcustomerid from Customers where dtcreated > @startdate
根据传递的报告类型,您会注意到我运行了3个单独的查询.您还会注意到我返回的是不同的列和列数.
我想把它变成一个存储函数,并根据我传递的报告类型返回我需要的列.但是,我知道由于列数和列名不同 - 这不会像我希望的那样作为存储函数工作.
这里的主要问题是报告此信息 - 我不希望有单独的功能,因为我将不得不为每种报告类型维护不同的报告.
有没有办法让这项工作成功?
您可以使用多语句函数,但需要指定将由3个select语句返回的所有列.似乎不可能返回多个结果集.
用户定义的函数不能返回多个结果集.如果需要返回多个结果集,请使用存储过程.https://msdn.microsoft.com/en-us/library/ms191320.aspx
这是一个不便,但在报告中,您只能使用您需要的列,其他将为空.
CREATE FUNCTION MyFun ( @Reporttype int, @startdate datetime ) RETURNS @Result TABLE ( lcustomerid int, lname nvarchar(50), fname nvarchar(50), barcode int, thetime datetime, name nvarchar(50) ) AS BEGIN If @Reporttype = '1' insert into @Result (lcustomerid, lname, fname) select lcustomerid, lname, fname from customers Where dtcreated > @startdate Else if @Reporttype = '2' insert into @Result (barcode, lname, fname) Select barcode, lname, fname from employees where dtcreated > @startdate Else if @reporttype = '3' insert into @Result (thetime, lname, name, barcode, lcustomerid) Select thetime, lname, name, barcode, lcustomerid from customers where dtcreated > @startdate RETURN END
所以,你可以用这种方式调用函数
SELECT * FROM dbo.MyFun (1, getdate())