noj*_*lag 5 t-sql sql-server-2012
我有一个表值函数
CREATE FUNCTION [dbo].[DateRange]
(
@StartDate date,
@EndDate date,
@Location varchar(25),
@Device varchar(25)
)
RETURNS TABLE
AS
RETURN
(
SELECT *
FROM MyTable
WHERE Date < @EndDate AND
Date > @StartDate AND
Location = @Location AND
Device = @Device
);
Run Code Online (Sandbox Code Playgroud)
现在我想让用户选择使用 NULL 作为位置参数和/或设备参数,以便他/她获取与位置和设备无关的所有数据
什么是最优雅和最有效的方式来做到这一点?
就像这样:
CREATE FUNCTION [dbo].[DateRange]
(
@StartDate date,
@EndDate date,
@Location varchar(25) = NULL,
@Device varchar(25) = NULL
)
RETURNS TABLE
AS
RETURN
(
SELECT *
FROM MyTable
WHERE
Date < @EndDate
AND Date > @StartDate
AND ( @Location IS NULL OR (@Location IS NOT NULL AND Location = @Location))
AND ( @Device IS NULL OR (@Device IS NOT NULL AND Device = @Device ))
)
Run Code Online (Sandbox Code Playgroud)
如果device
和location
列实际上可以为 NULL,您可能需要考虑此选项:
CREATE FUNCTION [dbo].[DateRange]
(
@StartDate date,
@EndDate date,
@Location varchar(25) = NULL,
@Device varchar(25) = NULL
)
RETURNS TABLE
AS
RETURN
(
SELECT *
FROM MyTable
WHERE
Date < @EndDate
AND Date > @StartDate
AND ( @Location IS NULL OR Location = @Location)
AND ( @Device IS NULL OR Device = @Device )
)
Run Code Online (Sandbox Code Playgroud)
如果您在该位置使用 UD 表类型,这将有效,正如您在评论中所询问的那样。只需确保输入参数为只读即可。但是,您不能将 NULL 传递给表类型参数,您必须传递该类型的空参数对象:
CREATE TYPE LocationsType AS TABLE
( LocationName VARCHAR(25));
CREATE TABLE MyTable (Date datetime, Location varchar(25), Device varchar(25));
CREATE FUNCTION [dbo].[DateRange]
(
@StartDate date,
@EndDate date,
@Location LocationsType READONLY,
@Device varchar(25) = NULL
)
RETURNS TABLE
AS
RETURN
(
SELECT *
FROM MyTable
WHERE
Date < @EndDate
AND Date > @StartDate
AND ( ((select count(*) FROM @Location) = 0) OR Location IN (select LocationName from @Location))
AND ( @Device IS NULL OR Device = @Device )
)
Run Code Online (Sandbox Code Playgroud)
叫它:
declare @l LocationsType
select *
from [dbo].[DateRange] (getDate(), GetDate(), @l,NULL)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5171 次 |
最近记录: |