SQL存储过程-了解SQL语句

时间:2019-06-20 09:50:01

标签: sql azure-sql-database

存储过程的新手。谁能解释存储过程开始时出现的以下SQL示例?

开始/结束-包含一系列SQL语句,以便可以执行一组SQL语句

SET NOCOUNT ON-不返回计数(指示受SQL语句影响的行数)。

DECLARE-设置局部变量

同时-循环播放

有-不确定

更新批次-不确定

SET @Rowcount = @@ ROWCOUNT; -不确定

    BEGIN
             SET NOCOUNT ON;

--UPDATE, done in batches to minimise locking
             DECLARE @Batch INT= 100;
             DECLARE @Rowcount INT= @Batch;
             WHILE @Rowcount > 0
                 BEGIN
                     WITH t
                          AS (
                          SELECT [OrganisationID],
                                 [PropertyID],
                                 [QuestionID],
                                 [BaseAnsweredQuestionID]
                          FROM dbo.Unioned_Table
                          WHERE organisationid = 1),
                          s
                          AS (
                          SELECT [OrganisationID],
                                 [PropertyID],
                                 [QuestionID],
                                 [BaseAnsweredQuestionID]
                          FROM dbo.table
                          WHERE organisationid = 1),
                          batch
                          AS (
                          SELECT TOP (@Batch) T.*,
                                              s.BaseAnsweredQuestionID NewBaseAnsweredQuestionID
                          FROM T
                               INNER JOIN s ON t.organisationid = s.organisationid
                                               AND t.PropertyID = s.PropertyID
                                               AND t.QuestionID = s.QuestionID
                          WHERE t.BaseAnsweredQuestionID <> s.BaseAnsweredQuestionID)
                          UPDATE batch
                            SET
                                BaseAnsweredQuestionID = NewBaseAnsweredQuestionID
                     SET @Rowcount = @@ROWCOUNT;
                 END;

1 个答案:

答案 0 :(得分:3)

线索在评论--UPDATE, done in batches to minimise locking中。

目的是使用dbo.table中的等效列,以100为批号更新BaseAnsweredQuestionID的列dbo.Unioned_Table。该注释建议使用批处理逻辑来防止锁定。 / p>

详细信息:

DECLARE @Batch INT= 100;设置批处理大小。

DECLARE @Rowcount INT= @Batch;初始化循环。 WHILE @Rowcount > 0开始循环。当update语句不影响任何行时,@ Rowcount将变为零(见下文)。

with a as ()common table expression(通常缩写为CTE)-它创建一个临时结果集,您可以将其有效地视为表。接下来的几个查询定义CTE tsbatch

CTE批处理使用SELECT TOP (@Batch)项仅包含100行-它从另外两个CTE中随机选择100行。

下一条语句:

UPDATE batch
   SET BaseAnsweredQuestionID = NewBaseAnsweredQuestionID
SET @Rowcount = @@ROWCOUNT

更新批处理CTE中的100行(这又是另外两个CTE的联接),并使用受更新语句(@@ ROWCOUNT)影响的行数填充循环变量@Rowcount。如果没有匹配的行,则@@ ROWCOUNT变为零,因此循环结束。