2010-08-19 4 views
0

이전 질문에서 여러분은 다른 행의 데이터를 가져 오는 것을 도왔습니다. 내가 사용하고있는 진술은 MS SQL Server Managment Studio에서 완벽하게 작동합니다. 오류없이 문을 실행할 수 있으며 필요한 데이터를 반환합니다. 그러나 프론트 엔드 프로그램에서이 데이터를 실행해야합니다. 이 프로그램에서 내 문장을 실행하려고하면 프로그램이 멈 춥니 다. 나는이 진술의 "With As"부분이 문제를 일으킨다는 느낌을 가지고있다. 이 임시 테이블을 하위 쿼리에 추가하여이 문을 다시 작성해야합니까?"With As"대체 방법으로

WITH Temp1 AS (SELECT 
SkillTargetID = Agent_Logout.SkillTargetID, 
LogoutDateTime = Agent_Logout.LogoutDateTime, 
LogonDate = DateAdd(s,-1 * Agent_Logout.LoginDuration,Agent_Logout.LogoutDateTime), 
ROW_NUMBER() OVER(PARTITION BY Agent_Logout.SkillTargetID ORDER BY Agent_Logout.LogoutDateTime ASC) RowVersion, 
LoginDuration = Agent_Logout.LoginDuration 
FROM Agent_Logout) 

SELECT 
AgentID = Base.SkillTargetID, 
LogonDate = Base.LogonDate, 
BaseLogout = Base.LogoutDateTime, 
BaseDuration = Base.LoginDuration, 
NextLogon = Temp1.LogonDate, 
LogoutDuration = DateDiff(s,Base.LogoutDateTime,Temp1.LogonDate) 
FROM Temp1 Base 
LEFT JOIN Temp1 ON Base.SkillTargetID = Temp1.SkillTargetID 
AND Base.RowVersion = Temp1.RowVersion-1 
+0

프로그램에서 SQL을 어떻게 실행합니까? –

+0

MS SQL Studio 2005에서 정확히 실행되는 것과 동일한 코드를 Cisco 프런트 엔드 프로그램에 복사하여 붙여 넣습니다. 잘못된 쿼리 오류 코드가 나타납니다. 키워드 WHERE 근처에서 오류가 발생했습니다. 이것은 WHERE 절이 없기 때문에 이상합니다. 공백과 유효한 where 절을 문에 추가하려고 시도했지만 프로그램이 중단됩니다. 오류 코드는 제공되지 않습니다. – Gilbert

+0

프론트 엔드 프로그램에서 문제를 수정하는 데 문제가있는 것 같습니다. 모든 쿼리를 뷰에 집어 넣고 프론트 엔드 프로그램에서 쿼리를 선택하면 어떨까요? –

답변

1

다음은 내가 결국 생각한 것입니다. 이는 우리가 사용하는 시스코 프론트 엔드 프로그램과 함께 작동합니다.

DECLARE @dtStartDateTime DATETIME, @dtEndDateTime DATETIME, @agentid VARCHAR 
SET @dtStartDateTime = :start_date SET @dtEndDateTime = :end_date 
SELECT 
    FullName = Temp1.FullName, 
    AgentID = Temp1.SkillTargetID, 
    LogonDate = Temp1.LogonDate, 
    LogoutDate = Temp1.LogoutDateTime, 
    LoginDuration = Temp1.LoginDuration, 
    RowVersion# = Temp1.RowVersion, 
    AgentID2 = Temp2.SkillTargetID, 
    LogonDate2 = Temp2.LogonDate, 
    LogoutDate2 = Temp2.LogoutDateTime, 
    RowVersion#2 = Temp2.RowVersion, 
    LogoutDuration = DateDiff(s,Temp1.LogoutDateTime,Temp2.LogonDate) 

FROM 

(SELECT 
    FullName = Person.LastName + ', ' + Person.FirstName, 
    SkillTargetID = Agent_Logout.SkillTargetID, 
    LogoutDateTime = Agent_Logout.LogoutDateTime, 
    LogonDate = DateAdd(s,-1 * Agent_Logout.LoginDuration,Agent_Logout.LogoutDateTime), 
    ROW_NUMBER() OVER(PARTITION BY Agent_Logout.SkillTargetID ORDER BY Agent_Logout.LogoutDateTime ASC) as RowVersion, 
    LoginDuration = Agent_Logout.LoginDuration 
    FROM Agent_Logout, Agent, Person 
    WHERE Agent_Logout.SkillTargetID = Agent.SkillTargetID and Agent.PersonID = Person.PersonID 
) Temp1, 

(SELECT 
    SkillTargetID = Agent_Logout.SkillTargetID, 
    LogoutDateTime = Agent_Logout.LogoutDateTime, 
    LogonDate = DateAdd(s,-1 * Agent_Logout.LoginDuration,Agent_Logout.LogoutDateTime), 
    ROW_NUMBER() OVER(PARTITION BY Agent_Logout.SkillTargetID ORDER BY Agent_Logout.LogoutDateTime ASC) as RowVersion 
    FROM Agent_Logout 
    WHERE Agent_Logout.SkillTargetID = Agent_Logout.SkillTargetID 
) Temp2 

WHERE Temp1.SkillTargetID = Temp2.SkillTargetID and Temp1.RowVersion = (Temp2.RowVersion - 1) AND 
(Temp1.LogonDate >= :start_date 
And Temp1.LogonDate <= :end_date) AND 
Temp1.SkillTargetID IN (:agentid) 
ORDER BY Temp1.SkillTargetID, Temp1.RowVersion 
1

당신은 단지 그것을 실현하려는 경우

;WITH Temp1 AS (
SELECT 
SkillTargetID = Agent_Logout.SkillTargetID, 
LogoutDateTime = Agent_Logout.LogoutDateTime, 
LogonDate = DateAdd(s,-1 * Agent_Logout.LoginDuration,Agent_Logout.LogoutDateTime), 
ROW_NUMBER() OVER(PARTITION BY Agent_Logout.SkillTargetID ORDER BY Agent_Logout.LogoutDateTime ASC) RowVersion, 
LoginDuration = Agent_Logout.LoginDuration 
FROM Agent_Logout) 

SELECT * INTO #Temp1 FROM Temp1 


SELECT 
AgentID = Base.SkillTargetID, 
LogonDate = Base.LogonDate, 
BaseLogout = Base.LogoutDateTime, 
BaseDuration = Base.LoginDuration, 
NextLogon = #Temp1.LogonDate, 
LogoutDuration = DateDiff(s,Base.LogoutDateTime,#Temp1.LogonDate) 
FROM #Temp1 Base 
LEFT JOIN #Temp1 ON Base.SkillTargetID = #Temp1.SkillTargetID 
AND Base.RowVersion = #Temp1.RowVersion-1 

가 정말하지만 당신의 프론트 엔드 프로그램을 실행할 때 매달려 무슨 뜻인지 이해가 안 할 수 있습니다. 서면으로 정확하게 쿼리를 사용하고 있습니까? 아니면 어떤 방식으로 매개 변수화하고 있습니까?

동일한 데이터에 대해 두 번 실행하고 있습니까?

+0

두 경우 모두 동일한 DB에 대해이 쿼리를 실행하고 있습니다. 프론트 엔드 프로그램은 시스코 프로그램입니다. 결국이 모든 임시 테이블이 서버에 가득 차거나 사용 후 지워지겠습니까? – Gilbert

+0

@Gilbert - 연결이 끝나면 임시 테이블이 서버에 의해 자동으로 삭제되지 않습니다. 실제로 명시 적으로 삭제하는 것이 더 나을지도 모르지만 명확한 설명을 한 후에도 임시 테이블을 사용하는 것으로 변경하면 어떤 차이가 있는지 의심 스럽습니다. –

+0

최대한 빨리 시도해 보겠습니다. – Gilbert