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

如何在不使用存储过程的情况下将变量设置为选择查询的结果?


我想做类似的事情: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
test asked 2020-07-31T04:51:04Z
6个解决方案
69 votes

您可以使用类似

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
rslite answered 2020-07-31T04:51:44Z
13 votes

-SQL Server 2005管理工作室

结果:2346(在我的数据库中)

-注意:@myvar = @Myvar

Allisson Pereira answered 2020-07-31T04:52:13Z
3 votes

您可以使用:

declare @foo as nvarchar(25)

select @foo = 'bar'

select @foo
JPrescottSanders answered 2020-07-31T04:52:33Z
2 votes

您也可以将第一个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(),因此该方法与原始方法存在相同的索引使用问题。 可以通过两次添加子查询来解决此问题,但是在这种情况下,最好使用可变方法。 最后一个版本仅用于演示。

问候。

Pittsburgh DBA answered 2020-07-31T04:53:27Z
2 votes

这将适用于提出的原始问题:

DECLARE @Result INT;
SELECT @Result = COUNT(*)
FROM  TableName
WHERE Condition
Siddhesh Bondre answered 2020-07-31T04:53:48Z
1 votes

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

在那种情况下,为什么不合并两个查询,而是在第一个查询的结果中进行第二个查询来进行搜索2990262656856856228864

Luk answered 2020-07-31T04:54:12Z
translate from https://stackoverflow.com:/questions/170078/sql-server-2005-setting-a-variable-to-the-result-of-a-select-query