SQL Server 2005将变量设置为选择查询的结果

时间:2008-10-04 10:13:22

标签: sql sql-server sql-server-2005

如何在不使用存储过程的情况下将变量设置为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

6 个答案:

答案 0 :(得分:68)

您可以使用类似

的内容
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

答案 1 :(得分:13)

- Sql Server 2005管理工作室


use Master
go
DECLARE @MyVar bigint
SET @myvar = (SELECT count(*) FROM spt_values);
SELECT @myvar

Result: 2346 (in my db)

- 注意: @myvar = @Myvar

答案 2 :(得分:3)

您可以使用:

declare @foo as nvarchar(25)

select @foo = 'bar'

select @foo

答案 3 :(得分:2)

您也可以将第一个SELECT放在子查询中。由于大多数优化器无论如何都会将其折叠成一个常量,因此不应该有性能损失。

顺便说一句,因为您使用的是这样的谓词:

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

谓词表达式无法正确优化或使用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的索引,并实现相同的目标。

在这里,重写为使用子查询来避免变量声明和随后的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(),因此此方法与原始方法具有相同的索引使用问题。这可以通过添加子查询两次来解决,但在这种情况下,您可以更好地使用变量方法。最后一个版本仅用于演示。

问候。

答案 4 :(得分:2)

这适用于原始问题:

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

答案 5 :(得分:1)

你到底是什么意思?是否要将查询结果重用于其他查询?

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