web-dev-qa-db-fra.com

Un script pour insérer des données factices dans toutes les tables de la base de données

Je voulais un script pouvant boucler à travers toutes les tables et leurs colonnes dans la base de données et insérer des données factices basées sur le type et la taille de la colonne, de sorte que je puisse commencer à utiliser la base de données pour tester et pouvoir exécuter des requêtes et des applications de test.

4
AmmarR

Il y a beaucoup de cas que la solution de @ Ammarr ne gère pas - ROWVERSION/TIMESTAMP, Colonnes calculées, colonnes avec vérification des contraintes de contrôle, clés étrangères, UNIQUEIDENTIFIER colonnes par défaut sur NEWSEQUENTIALID(), date/Colonnes du temps que défaut sur GETDATE(), colonnes clairsemées, etc., etc.

Pourquoi réinventer la roue? Il existe des outils qui peuvent générer des données pour vous et ils ont probablement déjà pensé à toutes ces restrictions. Par exemple Générateur de données DTM (non libre, ne l'avez pas testé) et générateur de données SQL rouge-gate (non libre, les avez testés et le recommander - aussi Examiné ici ).

9
Aaron Bertrand

Je suis sûr qu'il existe des moyens différents et de meilleurs moyens d'obtenir cette tâche par exemple à l'aide de curerseurs ou de fonctions SQL, etc., j'ai pensé à partager ma façon de faire la tâche.

début Créer une procédure stockée qui générera et exécutera les instructions d'insertion qui insère les données factices à la procédure stockée dans 1 paramètre, le paramètre est le NON. des rangées à ajouter à toutes les tables

la logique du script est simple, une sélection de sys.columns jointe à sys.types & sys.tables

Le sys.columns a tous les noms de colonne Le sys.types a le type de données de la colonne Le sys.tables a un nom de table, il existe d'autres moyens d'obtenir un nom de table comme object_name(c.object_id) mais je pensais que rejoindre Sys.Columns avec sys.tables est plus pratique

ci-dessous est le code

Create PROCEDURE [dbo].[GenerateandExecuteInsertStatmentsforTables] 
    @NoOfRows int
AS
BEGIN

Declare @icount int
declare @qry varchar(max)
set @qry = ' '
set @icount = 0
while @icount < @NoOfRows
begin
    select @qry = @qry
    +
    case when c.column_id = 1 then
        'insert into ' + SCHEMA_NAME(t.schema_id) + '.[' + t.name + '] values('
    else
        ''
    end
    +
    -- incase the column is identity, i dont include it in the insert
    case when c.is_identity = 0 then
        case when ty.name in ('bit','bigint','int','smallint','tinyint','float','decimal','numeric','money','smallmoney','real') then
            substring(CAST(  round(Rand() * 1000,0) AS varchar),1,c.max_length)
        when ty.name in ('binary','varbinary') then
            substring('0x546869732069732044756D6D792044617461',1,c.max_length)
        when ty.name In ('varchar','char','text') then
            '''' + substring('Dummy This is Dummy Data',1,c.max_length)  + '''' 
        when ty.name In ('nchar','nvarchar','ntext') then
            '''' + substring('Dummy This is Dummy Data',1,c.max_length / 2)  + ''''             
        when ty.name in('date','time','datetime','datetime2','smalldatetime','datetimeoffset') then
            '''' + convert(varchar(50),dateadd(D,Round(Rand() * 1000,1),getdate()),121) + '''' 
        when ty.name in ('uniqueidentifier') then
            cast(NEWID() as varchar(33))
        else
            ''
        end
        + 
        case when c.column_id = (Select MAX(insc.column_id) from sys.columns insc where insc.OBJECT_ID = c.OBJECT_ID) then
            ');'
        else
            ','
        end
    else
        ''  
    end

    FROM sys.tables AS t
    INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID
    INNER JOIN sys.types AS ty ON c.user_type_id=ty.user_type_id
    ORDER BY t.name,c.column_id; 
    set @icount = @icount + 1

    --execute the insert statments
    --Select (@qry)
    exec (@qry)
    Set @qry = ' ' 
end

après cela, j'exécute la procédure de magasin

USE [DBNAME]
EXEC [dbo].[GenerateandExecuteInsertStatmentsforTables] 5

Cela ajoutera 5 lignes à toutes les tables de la base de données

3
AmmarR