如何在不使用存储过程的情况下将变量设置为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
答案 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...)
的结果中进行第二次查询搜索来合并两个查询