当前位置:  开发笔记 > 数据库 > 正文

具有多个查询和不同选定列的存储函数

如何解决《具有多个查询和不同选定列的存储函数》经验,为你挑选了1个好方法。

我有一系列基于报告类型的查询.为简单起见,这是我正在尝试做的一个例子:

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个单独的查询.您还会注意到我返回的是不同的列和列数.

我想把它变成一个存储函数,并根据我传递的报告类型返回我需要的列.但是,我知道由于列数和列名不同 - 这不会像我希望的那样作为存储函数工作.

这里的主要问题是报告此信息 - 我不希望有单独的功能,因为我将不得不为每种报告类型维护不同的报告.

有没有办法让这项工作成功?



1> Vasyl Zvaryd..:

您可以使用多语句函数,但需要指定将由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())

推荐阅读
农大军乐团_697
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有