2008-10-04 170 views
41

如何在不使用存儲過程的情況下將變量設置爲select查詢的結果?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 

回答

1

你是什麼意思是什麼呢?你想重複使用其他查詢的查詢結果嗎?

在這種情況下,你爲什麼不合並兩個查詢,通過使的第一個(SELECT xxx in (SELECT yyy...)

3

結果內的第二查詢搜索,您可以使用:

declare @foo as nvarchar(25) 

select @foo = 'bar' 

select @foo 
67

您可以使用的東西像

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 
+6

爲先您提供的示例中需要在括號中包裝「select count(*)from user」,否則sql 2008將使用紅色波浪線進行計數。感謝您提供兩個語法示例! – TWood 2012-08-27 21:50:56

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 

注意,這種方法具有相同的索引使用的問題,因爲原來的,因爲使用CONVERT()上FF.FaultDate的。這可以通過兩次添加子查詢來解決,但在這種情況下,最好使用變量方法。這最後一個版本僅用於演示。

問候。

+0

註冊了 'SELECT(at)ooDate = OO.Date FROM OLAP.OutageHours AS OO where OO.OutageID = 1' 'SET(at)ooDate = SELECT OO.Date FROM OLAP.OutageHours AS OO where OO。 OutageID = 1'不適用於VARCHAR等。 原諒(at),將真實符號解釋爲標記用戶 – Inversus 2013-05-16 18:51:43

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

這將爲原來的問題問工作:

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