我有一个存储过程,我在其中处理(数据库上的SELECT)。
根据请求的结果,我在数据库中的一行上插入一些相应的数据。 我做了这个过程数千次(有一段时间)。
SET @i = 0
WHILE (@i <= (SELECT MAX(Id) FROM @Metadata ))
BEGIN
.....
INSERT INTO [MyTable] (Field1, Field2,Field3...) VALUES (VALUE1, VALUE3, VALUE3 ...)
SET @i = @i + 1
END
如果我看一下这些表演,最好是这样做还是将我的结果存储在临时表(在while循环中)然后只从这个临时表中执行一次插入?
还有更好的东西吗?
我添加了一些信息,可能是我不是很清楚: - 在我的存储过程的输入中,我有一个值(有1000到5000个元素)的表。 - 对于这个表的每一行(while循环),我在我的数据库上做了几个SELECT(根据SELECT的结果,我将某些值赋给变量),这是我在数据库中插入的这些值(类似于1在处理后对我的表的每一行插入)。
答案 0 :(得分:0)
您可以使用tally table
加cross join
来执行此操作。
WITH lv0 AS (SELECT 0 g UNION ALL SELECT 0)
,lv1 AS (SELECT 0 g FROM lv0 a CROSS JOIN lv0 b) -- 4
,lv2 AS (SELECT 0 g FROM lv1 a CROSS JOIN lv1 b) -- 16
,lv3 AS (SELECT 0 g FROM lv2 a CROSS JOIN lv2 b) -- 256
,lv4 AS (SELECT 0 g FROM lv3 a CROSS JOIN lv3 b) -- 65,536
,lv5 AS (SELECT 0 g FROM lv4 a CROSS JOIN lv4 b) -- 4,294,967,296
,Tally (n) AS (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM lv5)
SELECT VALUE1,
VALUE3,
VALUE3,...
FROM your_source_table
CROSS JOIN Tally
WHERE n < = (SELECT Max(Id)
FROM @Metadata)