许多插入与存储过程

时间:2015-07-06 11:36:12

标签: sql-server stored-procedures

我有一个存储过程,我在其中处理(数据库上的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在处理后对我的表的每一行插入)。

1 个答案:

答案 0 :(得分:0)

您可以使用tally tablecross 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)