将MS Sql结果设置为变量并重用它

时间:2015-05-25 06:28:18

标签: sql sql-server tsql

目前我的代码是这样的。

select * 
from tblReq 
where ReqID in (select ReqID from tblLog where LogDate >= '2015/04/01' and LogDate < '2015/05/31')

只是想知道数据库实际上是如何找到此查询的结果的?每次在子查询中运行时它是否重新运行?是否有任何脚本我可以将结果列表存储在某个变量中并能够使用它? (下面的代码)

select @logs = tblLog.ReqID from tblLog where tblLog.LogDate >= '2015/04/01' and tblLog.LogDate < '2015/05/31'  
select * from tblReq where ReqID in (@logs)

3 个答案:

答案 0 :(得分:3)

是的,您可以将结果存储在变量中,并在以后重复使用几次。在您的情况下,它将是table variable,因为您可以有多个项目。然后,简单join到初始查询:

DECLARE @Logs TABLE
(
    [LogID] INT
);

INSERT INTO @Logs ([LogID])
Select tblLog.ReqID 
from tblLog 
where tblLog.LogDate >= '2015/04/01' 
    and tblLog.LogDate < '2015/05/31'  

select * 
from tblReq A
INNER JOIN  @Logs L
    ON A.ReqID = L.LogID

此外,这可能会损害您的查询性能,因为表变量与查询优化器的black box不同。如果要存储大量行,请使用temporary表,以便使用并行执行计划。

答案 1 :(得分:1)

如果您想稍后参考您的查询,可以创建view

CREATE VIEW V1 AS
SELECT tblLog.ReqID
FROM tblLog
WHERE tblLog.LogDate >= '2015/04/01' 
AND tblLog.LogDate < '2015/05/31'

根据以下评论,您也可以使用table valued function

CREATE FUNCTION functionName(@start DATE, @end DATE)
RETURNS @result TABLE 
(
    ReqID INT NOT NULL
)
AS 
BEGIN
    INSERT @result
        SELECT tblLog.ReqID
        FROM tblLog
        WHERE tblLog.LogDate >= @start 
        AND tblLog.LogDate < @end
    RETURN;
END;

答案 2 :(得分:1)

对于你的情况..最好的解决方案是使用连接

最好的(即使在复杂的情况下也能工作)它包含一个查询表(tblLog)

select * from tblReq join (select logid from tbllog where 
tblLog.LogDate >= '2015/04/01' and tblLog.LogDate < '2015/05/31')tblLog
on tblReq.ReqID=tblLog.ReqID 

或简单

select * from tblReq join tblLog on tblReq.ReqID=tblLog.ReqID where 
tblLog.LogDate >= '2015/04/01' and tblLog.LogDate < '2015/05/31'

或者更简单:你也可以使用子查询(子查询更简单,但如果得到的结果太多,则表示性能会降低)

select * from tblReq where ReqID in (select tblLog.ReqID from tblLog where 
tblLog.LogDate >= '2015/04/01' and
tblLog.LogDate < '2015/05/31')

如果您必须存储,因为您在同一过程中多次使用

craete TABLE #logs
(
    [LogID] INT
);
insert into #logs select tblLog.ReqID from tblLog where 
tblLog.LogDate >= '2015/04/01' and
tblLog.LogDate < '2015/05/31'

select * from tblReq where ReqID in (select logid from #logs) // or use join

重要

variable存储单个值。临时表存储complete table。对于迭代(通过临时表或其他行),有cursors。但是请尝试使用