2010-08-19 83 views
0

在上一个问题中,你们帮我抓取了不同行中的数据。我正在使用的声明在MS SQL Server Managment Studio上完美运行。我可以在没有任何错误的情况下运行语句,并返回我需要的数据。但是,我需要在我们的前端程序上运行这些数据。当我尝试在这个程序上运行我的声明时,它只是挂起。我有一种感觉,这个声明的“With As”部分导致了问题。无论如何,通过将这个临时表放入子查询来重写这个语句?SQL“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? – 2010-08-19 14:33:42

+0

我将从MS SQL Studio 2005中正确执行的代码复制并粘贴到思科前端程序中。我收到无效查询的错误代码。关键字WHERE附近存在错误。这很奇怪,因为我在声明中没有WHERE子句。 我已经尝试在语句中添加空白和有效的where子句,但这只会导致程序挂起。没有给出错误代码。 – Gilbert 2010-08-19 14:42:19

+0

这听起来像您的前端程序可能会修改某些问题吗?如果你将所有的查询查看到视图中,然后尝试从前端程序中进行选择,该怎么办? – 2010-08-19 14:46:00

回答

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

我在这两种情况下针对相同的数据库运行此查询。前端计划是思科计划。将使用你的方式最终使用所有这些临时表填充服务器或在使用后擦除? – Gilbert 2010-08-19 14:43:53

+0

@Gilbert - 连接结束时服务器不会自动删除临时表。您可能会更好地明确地实际下降,但无论如何,在您澄清之后,我怀疑使用临时表的这种更改会产生任何影响。 – 2010-08-19 14:48:36

+0

我会尽快试一试。 – Gilbert 2010-08-19 14:52:05