2008-10-04 2 views
41

저장 프로 시저를 사용하지 않고 select 쿼리의 결과로 변수를 설정하는 방법은 무엇입니까? OOdate DATETIMESQL Server 2005 선택 쿼리의 결과로 변수 설정

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

가 정확히 무슨 뜻 이죠


내가 좋아하는 뭔가를하고 싶어? 다른 쿼리에 대한 쿼리 결과를 다시 사용 하시겠습니까?

declare @foo as nvarchar(25) 

select @foo = 'bar' 

select @foo 
3

의 결과 내에서 두 번째 쿼리 검색을함으로써, 두 쿼리를 결합하지 않는다 같은

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 
67

에게 당신이 뭔가를 사용할 수 있습니다 :이 경우

, 왜 당신이 사용할 수있는 첫 번째 (SELECT xxx in (SELECT yyy...)

+6

예를 들어, "select count (*) from user"를 괄호로 묶어야하거나 SQL 2008이 빨간색의 구불 구불 한 선으로 표시됩니다. 두 가지 구문 예제를 제공해 주셔서 감사합니다! – TWood

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를 피하기 위해 하위 쿼리를 사용하도록 다시 작성했습니다. 이 방법으로 인해 FF.FaultDate에 CONVERT()의 사용, 원본과 동일한 인덱스 사용 문제가 있다는

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 

참고. 이 작업은 하위 쿼리를 두 번 추가하여 해결할 수 있지만이 경우 변수 접근 방식을 사용하는 것이 좋습니다. 이 마지막 버전은 데모 용입니다.

감사합니다.

+0

에 대해 투표 됨. ooDate = OO.Date FROM OLAP.OutageHours AS OO.OutageID = 1 ' 'SET (at) ooDate = SELECT OO.Date FROM OLAP.OutageHours AS OO 여기서 OO. OutageID = 1 '이 VARCHAR 등에서 작동하지 않습니다. (at)를 사용하지 마십시오. 실제 기호를 배치하면 SO가 사용자를 태그 지정하는 것으로 해석됩니다. – Inversus

13

-는 SQL 서버 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