代码之家  ›  专栏  ›  技术社区  ›  GibboK

使用while创建虚拟数据

  •  3
  • GibboK  · 技术社区  · 14 年前

    我尝试使用 WHILE 但它运行得真的很慢。

    我在想也许我写的代码不对,你能看看并确认一下吗?

    -- Insert dummy data
    
    DECLARE
        @i          int,
        @Content    int;
    SET @i = 5001;
    
    WHILE @i > 5000 AND @i < 10000
    BEGIN
        SET @Content = ROUND(((10000-5000)*RAND()+5000),0)
        INSERT INTO dbo.CmsImagesContents
        (ContentId, Title, AltTag, Caption)
        VALUES
        (@Content,'Test Title', 'Test AltTag', 'Test Caption');
        SET @i = @i + 1;
    END
    
    1 回复  |  直到 9 年前
        1
  •  4
  •   Paul McLoughlin    14 年前

    与在循环中执行4999个独立的insert语句不同,如果对所有4999行执行一次插入,您将获得更好的性能。因此,如果有一个表t包含4999行,您只需调用以下内容:

    INSERT INTO DBO.CmsImagesContents(ContentId, Title, AltTag, Caption)    
    SELECT (ABS(CAST(CAST(NEWID() AS VARBINARY) AS INT)) % 5000) + 5000 AS ContentID, 
            'Test Title' AS Title, 'Test AltTag' AS AltTag, 'Test Caption'  AS Caption
    FROM #T1
    

    如果首先需要创建这样一个由4999行组成的表,那么下面的SQL将适用于您:

    CREATE TABLE #T1
    (
        N INT NOT NULL PRIMARY key
    );
    
    WITH L0 AS (SELECT 1 AS N UNION ALL SELECT 1), 
        L1 AS (SELECT A.N FROM L0 AS A CROSS JOIN L0 AS B),
        L2 AS (SELECT A.N FROM L1 AS A CROSS JOIN L1 AS B),
        L3 AS (SELECT A.N FROM L2 AS A CROSS JOIN L2 AS B),
        L4 AS (SELECT A.N FROM L3 AS A CROSS JOIN L3 AS B),
        Nums AS (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS n FROM L4)
    
    INSERT INTO #T1( N )
    SELECT N
    FROM Nums
    WHERE n < 10000 AND n>5000;