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