【问题标题】:SQL Server Loop and Cursors [closed]SQL Server循环和游标[关闭]
【发布时间】:2023-03-22 09:56:01
【问题描述】:

我为 SQL Server 继承了以下代码:

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、declare、游标等?有没有另一种方法来代替选择?

提前感谢您的帮助。

【问题讨论】:

  • 您是否尝试过使用 Google 或阅读手册?
  • 也许可以试着问一个更具体的问题
  • 谢谢 lad2025。你试过学英语吗?
  • 更具体地说,打开游标(?)并在sql中循环并在一行中添加一个然后每次使用set的目的是什么?你能用case语句代替吗?谢谢。

标签: sql sql-server


【解决方案1】:
  • SET NOCOUNT ON 将防止返回一条消息,说明更新了多少行。在代码中的某些情况下,这是必要的,因为消息被解释为附加的结果集。此消息还有一些额外的开销。
  • CURSORS 用于以程序方式执行操作,而不是通常的基于集合的方式(例如,如果您需要遍历一些数据,为每一行执行存储过程)。它们非常耗费资源,通常不受欢迎。看来这可以在没有光标的情况下重写。

  • "##Motability_Comms_Combined 是全局临时表,因此也可能被其他代码引用(在不同的 SQL 连接中)

【讨论】:

  • 感谢您的解释。在 SQL Server Management Studio 中,您是否知道是否有一种方法可以单步执行循环的每个步骤以查看输出?
  • 或者有没有标准的方法来代替游标?
  • 您可以右键单击管理工作室中的存储过程并选择执行。您可以在存储过程中放置​​断点以停止,并检查变量等。
  • 很好,感谢您的帮助。
猜你喜欢
  • 2015-03-11
  • 2017-06-29
  • 1970-01-01
  • 1970-01-01
  • 2020-08-26
  • 2017-05-01
  • 2012-03-27
  • 2012-04-28
  • 1970-01-01
相关资源
最近更新 更多