Créer des données factices avec WHILE

J'essaie d'insert des données factices dans ma table en utilisant un WHILE , mais cela fonctionne vraiment très lentement.

Je pensais peut-être que j'écris pas correctement le code, pourriez-vous s'il vous plaît jeter un oeil et le confirmer?

 -- 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 

Plutôt que de faire 4999 instructions d'insertion séparées dans une boucle, vous obtiendrez de bien meilleures performances si vous faites un seul insert de toutes les 4999 lignes. Donc, si vous avez une table #T contenant 4999 lignes, vous appellerez simplement ceci:

 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 

Si vous avez besoin de créer une telle table de 4999 lignes en premier lieu, le code SQL suivant fonctionnera pour vous:

 CREATE TABLE #T1 ( N INT NOT NULL PRIMARY key ); WITH L0 AS (SELECT 1 AS N UNION ALL SELECT 1), L1 AS (SELECT AN FROM L0 AS A CROSS JOIN L0 AS B), L2 AS (SELECT AN FROM L1 AS A CROSS JOIN L1 AS B), L3 AS (SELECT AN FROM L2 AS A CROSS JOIN L2 AS B), L4 AS (SELECT AN 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;