我听/读过人们说“循环不好”或者“如果你认为你需要循环,你就不需要”。我了解在数据库上运行循环的处理和速度影响,但此规则是否有例外?我正在尝试解决一个问题,即我需要偶尔将 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
他们都错了。您不需要临时表或循环。只需使用
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 的数字函数之一。