SQL Server 2005将variables设置为select查询的结果

如何在不使用存储过程的情况下将variables设置为select查询的结果?


我想做类似于:OOdate DATETIME

SET OOdate = Select OO.Date FROM OLAP.OutageHours as OO WHERE OO.OutageID = 1 

然后我想在这个查询中使用OOdate:

 SELECT COUNT(FF.HALID) from Outages.FaultsInOutages as OFIO INNER join Faults.Faults as FF ON FF.HALID = OFIO.HALID WHERE CONVERT(VARCHAR(10),OO.Date,126) = CONVERT(VARCHAR(10),FF.FaultDate,126)) AND OFIO.OutageID = 1 

你可以使用类似的东西

 SET @cnt = (SELECT COUNT(*) FROM User) 

要么

 SELECT @cnt = (COUNT(*) FROM User) 

为此,SELECT必须返回单个列和单个结果,并且SELECT语句必须位于括号内。

编辑 :你有没有尝试过这样的事情?

 DECLARE @OOdate DATETIME SET @OOdate = Select OO.Date from OLAP.OutageHours as OO where OO.OutageID = 1 Select COUNT(FF.HALID) from Outages.FaultsInOutages as OFIO inner join Faults.Faults as FF ON FF.HALID = OFIO.HALID WHERE @OODate = FF.FaultDate AND OFIO.OutageID = 1 

– Sql Server 2005pipe理工作室

use Master go DECLARE @MyVar bigint SET @myvar = (SELECT count(*) FROM spt_values); SELECT @myvar
结果:2346(在我的分贝)

注意: @myvar = @Myvar

你可以使用:

 declare @foo as nvarchar(25) select @foo = 'bar' select @foo 

你也可以把第一个SELECT放在子查询中。 因为大多数优化器都会把它折叠成一个常量,所以不应该有这样的性能问题。

顺便说一下,因为你正在使用这样的谓词:

 CONVERT(...) = CONVERT(...) 

谓词expression式无法正确优化或使用CONVERT()函数在列引用上使用索引。

以下是使原始查询更好的一种方法:

 DECLARE @ooDate datetime SELECT @ooDate = OO.Date FROM OLAP.OutageHours AS OO where OO.OutageID = 1 SELECT COUNT(FF.HALID) FROM Outages.FaultsInOutages AS OFIO INNER JOIN Faults.Faults as FF ON FF.HALID = OFIO.HALID WHERE FF.FaultDate >= @ooDate AND FF.FaultDate < DATEADD(day, 1, @ooDate) AND OFIO.OutageID = 1 

该版本可以利用涉及FaultDate的索引,达到相同的目标。

在这里,重写为使用子查询来避免variables声明和随后的SELECT。

 SELECT COUNT(FF.HALID) FROM Outages.FaultsInOutages AS OFIO INNER JOIN Faults.Faults as FF ON FF.HALID = OFIO.HALID WHERE CONVERT(varchar(10), FF.FaultDate, 126) = (SELECT CONVERT(varchar(10), OO.Date, 126) FROM OLAP.OutageHours AS OO where OO.OutageID = 1) AND OFIO.OutageID = 1 

请注意,由于在FF.FaultDate上使用了CONVERT(),因此此方法与原始索引使用问题相同。 这可以通过两次添加子查询来解决,但在这种情况下,您最好使用variables方法。 最后一个版本仅用于演示。

问候。

这将工作原来的问题问:

 DECLARE @Result INT; SELECT @Result = COUNT(*) FROM TableName WHERE Condition 

你是什​​么意思? 你想重复使用其他查询的查询结果吗?

在这种情况下,为什么不把两个查询结合起来,在第一个查询的结果中进行第二个查询(SELECT xxx in (SELECT yyy...)