Shm*_*nix 8 sql sql-server sql-server-2008
我有一系列基于报告类型的查询.为简单起见,这是我正在尝试做的一个例子:
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
Run Code Online (Sandbox Code Playgroud)
根据传递的报告类型,您会注意到我运行了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
Run Code Online (Sandbox Code Playgroud)
所以,你可以用这种方式调用函数
SELECT * FROM dbo.MyFun (1, getdate())
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1322 次 |
| 最近记录: |