避免 SQL 中的循环,#temptables?

问题描述 投票:0回答:1

我听/读过人们说“循环不好”或者“如果你认为你需要循环,你就不需要”。我了解在数据库上运行循环的处理和速度影响,但此规则是否有例外?我正在尝试解决一个问题,即我需要偶尔将 80 行插入到表中,所有行都具有除 ID 字段之外完全相同的信息。

我已经编写了两个查询,理论上可以满足我的需要,但我想知道是否应该不惜一切代价避免包含循环的查询,#temptable 方法是否合理,以及是否有更好的方法来完成除了我提出的两个选项之外,我还想做什么。预先感谢。

对于某些背景,我有 tableB,其中包含 ID 字段,该字段是 TableA 上 ID 字段的 FK。

查询1

DECLARE @minid as int = 1
DECLARE @maxid as int = 100
WHILE @minid <= @maxid
    BEGIN
    SET @minid = @maxid + 1
        IF NOT EXISTS (SELECT * FROM TableA WHERE eID = @minid AND Name = 'B')
        BEGIN
            INSERT INTO TableA (eID, B, C)
            VALUES
            (@minid, B, C)
        END
    IF @minid = @maxid BREAK
    END



查询2

DROP TABLE IF EXISTS #TempTable

CREATE TABLE #TempTable
eID
B
C 

INSERT INTO #TempTable (eID)
SELECT eID
FROM TableB
WHERE (code to specify which eIDs to pull out of table b)

UPDATE #TempTable 
SET B = 'XX', C = 'XX'

INSERT INTO TableA (eID, B, C)
SELECT eID, B, C
FROM #TempTable
sql sql-server while-loop
1个回答
0
投票

他们错了。您不需要临时表或循环。只需使用

GENERATE_SERIES
即可生成一堆行。

INSERT INTO TableA
  (eID, B, C)
SELECT
  g.value,
  'XX',
  'XX'
FROM GENERATE_SERIES(1, 1000) AS g;

在旧版本的 SQL Server 中,您可以使用 Itzik Ben-Gan 的数字函数之一。

© www.soinside.com 2019 - 2024. All rights reserved.