2015-09-04 81 views
-6

我继承了SQL Server的下面的代码:SQL服务器循环和游标

SET NOCOUNT ON 
DECLARE 
@PERSON_ID AS INT, 
@COMMS_DATE AS DATE, 
@PERSON_ID_HOLD AS INT, 
@COMMS_DATE_HOLD AS DATE, 
@CAMPAIGN_ID AS INT, 
@CAMPAIGN_ID_OLD AS INT, 
@SQL AS VARCHAR(200) 

SELECT @PERSON_ID_HOLD = 0 
SELECT @COMMS_DATE_HOLD = null 
SELECT @CAMPAIGN_ID = 0 
SELECT @CAMPAIGN_ID_OLD = 0 

DECLARE COMMS_CURSOR CURSOR FOR 
SELECT PERSONID, ReportDate FROM ##Motability_Comms_Combined order by PersonID, ReportDate 

OPEN COMMS_CURSOR 
FETCH NEXT FROM COMMS_CURSOR 
INTO @PERSON_ID, @COMMS_DATE 

WHILE @@FETCH_STATUS = 0 
BEGIN 
IF (@PERSON_ID = @PERSON_ID_HOLD) and (DATEDIFF(day,@COMMS_DATE_HOLD,@COMMS_DATE) > 90) 
BEGIN 
IF @CAMPAIGN_ID = 0 
begin 
SET @PERSON_ID_HOLD = @PERSON_ID 
SET @COMMS_DATE_HOLD = @COMMS_DATE 
end 
ELSE 
begin 
SET @CAMPAIGN_ID_OLD = @CAMPAIGN_ID 
SET @CAMPAIGN_ID = @CAMPAIGN_ID + 1 
END 
end 
ELSE 

IF (@PERSON_ID <> @PERSON_ID_HOLD)-- or (@COMMS_DATE <> @COMMS_DATE_HOLD) 
BEGIN 
SET @CAMPAIGN_ID = 1 
SET @CAMPAIGN_ID_OLD = @CAMPAIGN_ID 
END 

IF (@CAMPAIGN_ID > 1) 
BEGIN 
UPDATE ##Motability_Comms_Combined SET Derived_Campaign_ID = @CAMPAIGN_ID WHERE personid = @PERSON_ID AND REPORTDATE = @COMMS_DATE --WHERE CURRENT OF COMMS_CURSOR 
END 

SET @PERSON_ID_HOLD = @PERSON_ID 
SET @COMMS_DATE_HOLD = @COMMS_DATE 
FETCH NEXT FROM COMMS_CURSOR INTO @PERSON_ID, @COMMS_DATE 
END 

CLOSE COMMS_Cursor 
DEALLOCATE COMMS_Cursor 

UPDATE ##Motability_Comms_Combined SET Derived_Campaign_ID = 1 WHERE Derived_Campaign_ID is null 

SET NOCOUNT OFF 

请有谁能够告诉我这种SQL的目的是如nocount,声明,游标,等等?有没有另一种方式来做选择呢?

感谢您提前提供任何帮助。

+1

你甚至尝试使用谷歌或阅读手册? – lad2025

+0

也许尝试并询问一个更具体的问题 – jazza1000

+0

Thanks lad2025。你有没有试过学英语? – nk10

回答

0
  • SET NOCOUNT ON将阻止返回消息说明有多少行被更新。在代码中的某些情况下,这是必要的,因为该消息被解释为附加的结果集。此消息还有一些额外开销。
  • CURSORS用于以过程方式执行操作,而不是通常的基于集合的方式(例如,如果您需要循环执行一些数据,为每行执行存储过程)。他们非常耗费资源,而且通常会皱眉。看起来,这可以在没有游标的情况下被重写。

  • “## Motability_Comms_Combined是全局临时表,所以也可以通过其他的代码被称为(在不同的SQL连接)

+0

感谢您的解释。在SQL Server Management Studio中,您是否知道是否有一种方法可以逐步执行循环的一步看到输出? – nk10

+0

还是有一个标准的方法,而不是使用游标? – nk10

+0

您可以右键单击Management Studio中的存储过程并选择执行。您可以在存储过程中放置​​断点来停止并检查变量等。 – jazza1000