存储过程的新手。谁能解释存储过程开始时出现的以下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;
答案 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 t
,s
和batch
。
CTE批处理使用SELECT TOP (@Batch)
项仅包含100行-它从另外两个CTE中随机选择100行。
下一条语句:
UPDATE batch
SET BaseAnsweredQuestionID = NewBaseAnsweredQuestionID
SET @Rowcount = @@ROWCOUNT
更新批处理CTE中的100行(这又是另外两个CTE的联接),并使用受更新语句(@@ ROWCOUNT)影响的行数填充循环变量@Rowcount。如果没有匹配的行,则@@ ROWCOUNT变为零,因此循环结束。