Accueil > > > GÉNÉRER DES REQUETES INSERT À PARTIR DES DONNÉES EXISTANTES DANS UNE TABLE.
GÉNÉRER DES REQUETES INSERT À PARTIR DES DONNÉES EXISTANTES DANS UNE TABLE.
Information sur la source
Description
Pour générer des INSERT à partir des données existantes. Ces INSERTS peuvent être exécutés pour régénérer les données vers un autre endroit. Cette procédure peut également être utile afin de créer une base de données de configuration.
Source
- CREATE PROC sp_generate_inserts
- (
- @table_name varchar(776), -- La table / vue pour les commandes INSERT qui seront générées en utilisant les données existantes
- @target_table varchar(776) = NULL, -- Utilisez ce paramètre pour spécifier un autre nom de la table dans laquelle les données seront insérées
- @include_column_list bit = 1, -- Utilisez ce paramètre pour inclure / ne pas inclure colonne dans la liste générée INSERT
- @from varchar(800) = NULL, -- Ce paramètre permet de filtrer les lignes d'un filtre basé sur l'état (à l'aide WHERE)
- @include_timestamp bit = 0, -- Spécifier 1 pour ce paramètre si vous voulez inclure le TIMESTAMP / ROWVERSION colonne de données dans la déclaration INSERT
- @debug_mode bit = 0, -- Si @ debug_mode est 1, les requêtes SQL construits par cette procédure seront imprimés pour examen ultérieur
- @owner varchar(64) = NULL, -- Utilisez ce paramètre si vous n'êtes pas le propriétaire de la table
- @ommit_images bit = 0, -- Utilisez ce paramètre pour générer INSERT par l'omission des colonnes 'image'
- @ommit_identity bit = 0, -- Utilisez ce paramètre pour ommettre les colonnes identity
- @top int = NULL, -- Utilisez ce paramètre pour générer INSERT seulement pour les TOP n lignes
- @cols_to_include varchar(8000) = NULL, -- Liste des colonnes à inclure dans la déclaration INSERT
- @cols_to_exclude varchar(8000) = NULL, -- Liste des colonnes à être exclus de la commande INSERT
- @disable_constraints bit = 0, -- Lorsque 1, désactive clé étrangères et leur permet après l'INSERT
- @ommit_computed_cols bit = 0 -- Lorsque 1, les colonnes calculées ne seront pas inclus dans la commande INSERT
-
- )
- AS
- BEGIN
-
- /***********************************************************************************************************
- Objectif: Pour générer des INSERT à partir des données existantes. Ces INSERTS peuvent être exécutés pour régénérer les données vers un autre endroit. Cette procédure peut également être utile afin de créer une base de données de configuration.
-
- Exemple 1: Pour produire INSERT pour la table "titres":
-
- EXEC sp_generate_inserts "titres"
-
- Exemple 2: Pour ommettre la liste des colonnes dans la commande INSERT: (liste colonne est inclus par défaut)
- IMPORTANT: Si vous avez trop de colonnes, je vous conseille d'ommettre la liste de colonne, comme illustré ci-dessous,
- Pour éviter les faux résultats
-
- EXEC sp_generate_inserts "titres", @ include_column_list = 0
-
- Exemple 3: Pour produire INSERT pour la table 'titlesCopy' vers la table 'titres' :
-
- EXEC sp_generate_inserts 'titres', 'titlesCopy'
-
- Exemple 4: Pour produire INSERT pour la table "titres" pour les seuls titres
- Qui contiennent le mot «Computer» en eux:
- NOTE: Ne pas compliquer le FROM ou clause WHERE ici. Il est supposé que vous êtes bien avec T-SQL si vous utilisez ce paramètre
-
- EXEC sp_generate_inserts "titres", @ from = "from titres where titre like '%Computer%'"
-
- Exemple 5: Pour spécifier que vous voulez inclure les données de la colonne TIMESTAMP dans la commande INSERT:
- (Par défaut, les données de la colonne TIMESTAMP n'est pas scriptée)
-
- EXEC sp_generate_inserts "titres", @ include_timestamp = 1
-
- Exemple 6: Pour imprimer les informations de débogage:
-
- EXEC sp_generate_inserts "titres", @ debug_mode = 1
-
- Exemple 7: Si vous n'êtes pas le propriétaire de la table, utilisez le paramètre @propriétaire pour spécifier le nom du propriétaire
- Pour utiliser cette option, vous devez avoir les permissions SELECT sur la table
-
- EXEC sp_generate_inserts Nickstable, propriétaire @ = 'Lassaad'
-
- Exemple 8: Pour produire INSERT pour le reste des colonnes exclusion images
- Lorsque vous utilisez cette otion, ne pas mittre le paramètre @include_column_list à 0.
-
- EXEC sp_generate_inserts imgtable, @ommit_images = 1
-
- Exemple 9: Pour produire INSERT excluant (en omettant) les colonnes IDENTITY :
- (Par défaut, les colonnes IDENTITY sont inclus dans la commande INSERT)
-
- EXEC sp_generate_inserts mytable, @ommit_identity = 1
-
- Exemple 10: Pour produire INSERT pour les 10 TOP lignes dans la table:
-
- EXEC sp_generate_inserts mytable, @top = 10
-
- Exemple 11: Pour produire des commandes INSERT avec les colonnes que vous voulez:
-
- EXEC sp_generate_inserts titres, @cols_to_include = "'titre', 'titre_id', 'au_id'"
-
- Exemple 12: Pour produire des INSERT en omettant certaines colonnes:
-
- EXEC sp_generate_inserts titres, cols_to_exclude @ = " 'title', 'title_id', 'au_id'"
-
- Exemple 13: Afin d'éviter la vérification de la clé étrangères lors du chargement de données avec INSERT:
-
- EXEC sp_generate_inserts titres, @disable_constraints = 1
-
- Exemple 14: Pour exclure les colonnes calculé
- EXEC sp_generate_inserts MaTable, @ommit_computed_cols = 1
- ***********************************************************************************************************/
-
- SET NOCOUNT ON
-
- --Faire en sorte que l'utilisateur utilise soit @cols_to_include soit @cols_to_exclude
- IF ((@cols_to_include IS NOT NULL) AND (@cols_to_exclude IS NOT NULL))
- BEGIN
- RAISERROR('Utilisez soit @cols_to_include soit @cols_to_exclude. Ne pas utiliser ces deux paramètres à la fois',16,1)
- RETURN -1 --Échec. Motif: Les deux paramètres : @cols_to_include et @cols_to_exclude sont spécifiés
- END
-
- --S'assurer que les paramètres @cols_to_include et @cols_to_exclude reçoivent les valeurs dans le bon format
- IF ((@cols_to_include IS NOT NULL) AND (PATINDEX('''%''',@cols_to_include) = 0))
- BEGIN
- RAISERROR('Utilisation invalide de propriété @cols_to_include',16,1)
- PRINT 'Spécifiez les noms de colonnes entouré de guillemets simples et séparés par des virgules'
- PRINT 'Par exemple: EXEC sp_generate_inserts titres , @cols_to_include = "''titre_id'',''titres''"'
- RETURN -1 --Échec. Cause: Utilisation invalide de propriété @cols_to_include
- END
-
- IF ((@cols_to_exclude IS NOT NULL) AND (PATINDEX('''%''',@cols_to_exclude) = 0))
- BEGIN
- RAISERROR('Utilisation invalide de propriété @cols_to_exclude',16,1)
- PRINT 'Spécifiez les noms de colonnes entouré de guillemets simples et séparés par des virgules'
- PRINT 'Par exemple: EXEC sp_generate_inserts titres, @cols_to_exclude = "''titre_id'',''titre''"'
- RETURN -1 --Échec. Cause: Utilisation invalide de propriété @cols_to_exclude
- END
-
-
- -- Contrôl pour voir si le nom de base de données est spécifiée avec le même nom de table
- -- Le contexte de votre base de données local devraient être la table pour laquelle vous voulez générer INSERT
- -- Précise si le nom de base de données n'est pas autorisé
- IF (PARSENAME(@table_name,3)) IS NOT NULL
- BEGIN
- RAISERROR('Ne pas spécifier le nom de la base. Être dans la base de données nécessaire et spécifier juste le nom de la table.',16,1)
- RETURN -1 --Échec. Motif: Le nom de la base de donnée est spécifiée avec le nom de la table, ce qui n'est pas autorisé
- END
-
- -- Vérification de l'existence de table 'user'ou 'vision '
- -- Cette procédure n'est pas écrite pour travailler sur les tables système
- -- Pour l'écriture des données dans les tables système, il suffit de créer une vue sur les tables système et de travailler sur cette vue
-
- IF @owner IS NULL
- BEGIN
- IF ((OBJECT_ID(@table_name,'U') IS NULL) AND (OBJECT_ID(@table_name,'V') IS NULL))
- BEGIN
- RAISERROR('Table ou vue n''a pas été trouvée.',16,1)
- PRINT 'Vous pouvez voir cette erreur, si vous n''êtes pas le propriétaire de cette table ou vue. Dans ce cas, utilisez le paramètre @owner pour spécifier le nom du propriétaire.'
- PRINT 'Assurez-vous d''avoir la permission de SELECT sur la table ou vue.'
- RETURN -1 --Échec. Raison: il n'existe pas de table ou vue utilisateur avec ce nom
- END
- END
- ELSE
- BEGIN
- IF NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = @table_name AND (TABLE_TYPE = 'BASE TABLE' OR TABLE_TYPE = 'VIEW') AND TABLE_SCHEMA = @owner)
- BEGIN
- RAISERROR('Table ou vue n''a pas été trouvée.',16,1)
- PRINT 'Vous pouvez voir cette erreur, si vous n''êtes pas le propriétaire de cette table ou vue. Dans ce cas, utilisez le paramètre @owner pour spécifier le nom du propriétaire.'
- PRINT 'Assurez-vous d''avoir la permission de SELECT sur la table ou vue.'
- RETURN -1 --Échec. Raison: il n'existe pas de table ou vue utilisateur avec ce nom
- END
- END
-
- -- Déclaration des Variables
- DECLARE @Column_ID int,
- @Column_List varchar(8000),
- @Column_Name varchar(8000),
- @Start_Insert varchar(786),
- @Data_Type varchar(128),
- @Actual_Values varchar(8000), --Telle est la chaîne qui sera finalement exécuté pour générer des commandes INSERT
- @IDN varchar(128) --Contiendra le nom de la colonnes IDENTITY dans la table
-
- -- Initialisation des Variables
- SET @IDN = ''
- SET @Column_ID = 0
- SET @Column_Name = ''
- SET @Column_List = ''
- SET @Actual_Values = ''
-
- IF @owner IS NULL
- BEGIN
- SET @Start_Insert = 'INSERT INTO ' + '[' + RTRIM(COALESCE(@target_table,@table_name)) + ']'
- END
- ELSE
- BEGIN
- SET @Start_Insert = 'INSERT ' + '[' + LTRIM(RTRIM(@owner)) + '].' + '[' + RTRIM(COALESCE(@target_table,@table_name)) + ']'
- END
-
-
- --Pour obtenir l'ID de la premiere colonne
-
- SELECT @Column_ID = MIN(ORDINAL_POSITION)
- FROM INFORMATION_SCHEMA.COLUMNS (NOLOCK)
- WHERE TABLE_NAME = @table_name AND
- (@owner IS NULL OR TABLE_SCHEMA = @owner)
-
-
-
- --Boucle à travers toutes les colonnes de la table, pour obtenir les noms des colonnes et leurs types de données
- WHILE @Column_ID IS NOT NULL
- BEGIN
- SELECT @Column_Name = QUOTENAME(COLUMN_NAME),
- @Data_Type = DATA_TYPE
- FROM INFORMATION_SCHEMA.COLUMNS (NOLOCK)
- WHERE ORDINAL_POSITION = @Column_ID AND
- TABLE_NAME = @table_name AND
- (@owner IS NULL OR TABLE_SCHEMA = @owner)
-
-
-
- IF @cols_to_include IS NOT NULL --Sélectionne uniquement les colonnes spécifiées par l'utilisateur
- BEGIN
- IF CHARINDEX( '''' + SUBSTRING(@Column_Name,2,LEN(@Column_Name)-2) + '''',@cols_to_include) = 0
- BEGIN
- GOTO SKIP_LOOP
- END
- END
-
- IF @cols_to_exclude IS NOT NULL --Sélectionne uniquement les colonnes spécifiées par l'utilisateur
- BEGIN
- IF CHARINDEX( '''' + SUBSTRING(@Column_Name,2,LEN(@Column_Name)-2) + '''',@cols_to_exclude) <> 0
- BEGIN
- GOTO SKIP_LOOP
- END
- END
-
- --S'assurer de la sortie SET IDENTITY_INSERT ON / OFF dans le cas où la table a une colonne de type IDENTITY
- IF (SELECT COLUMNPROPERTY( OBJECT_ID(QUOTENAME(COALESCE(@owner,USER_NAME())) + '.' + @table_name),SUBSTRING(@Column_Name,2,LEN(@Column_Name) - 2),'IsIdentity')) = 1
- BEGIN
- IF @ommit_identity = 0 --Déterminer s'il ya lieu d'inclure ou d'exclure la colonne IDENTITY
- SET @IDN = @Column_Name
- ELSE
- GOTO SKIP_LOOP
- END
-
- --Faire en sorte que de'afficher les colonnes calculées ou non
- IF @ommit_computed_cols = 1
- BEGIN
- IF (SELECT COLUMNPROPERTY( OBJECT_ID(QUOTENAME(COALESCE(@owner,USER_NAME())) + '.' + @table_name),SUBSTRING(@Column_Name,2,LEN(@Column_Name) - 2),'IsComputed')) = 1
- BEGIN
- GOTO SKIP_LOOP
- END
- END
-
- --Les table avec les colonnes de type de données IMAGE ne sont pas pris en charge pour des raisons évidentes
- IF(@Data_Type in ('image'))
- BEGIN
- IF (@ommit_images = 0)
- BEGIN
- RAISERROR('Table avec des colonnes image ne sont pas supportés.',16,1)
- PRINT 'Utilisez le paramètre @ommit_images = 1 pour générer un INSERTs pour le reste des colonnes.'
- PRINT 'NE PAS ommettre la Liste des colonne dans l''INSERT. En utilisant @include_column_list = 0 vous oublier la liste des colonne , les INSERTs généré vont échouer.'
- RETURN -1 --Échec. Raison: Il y a une colonne avec le type de données d'IMAGE
- END
- ELSE
- BEGIN
- GOTO SKIP_LOOP
- END
- END
-
- -- Déterminer le type de données de la colonne et en fonction du type de données, la part des VALEURS
- -- La commande INSERT est générée. Des mesures sont prises pour traiter les colonnes avec des valeurs NULL. Également
- -- Faire en sorte, pour ne pas perdre toutes les données de type flot, real, money, smallmomey, datetime
- SET @Actual_Values = @Actual_Values +
- CASE
- WHEN @Data_Type IN ('char','varchar','nchar','nvarchar')
- THEN
- 'COALESCE('''''''' + REPLACE(RTRIM(' + @Column_Name + '),'''''''','''''''''''')+'''''''',''NULL'')'
- WHEN @Data_Type IN ('datetime','smalldatetime')
- THEN
- 'COALESCE('''''''' + RTRIM(CONVERT(char,' + @Column_Name + ',109))+'''''''',''NULL'')'
- WHEN @Data_Type IN ('uniqueidentifier')
- THEN
- 'COALESCE('''''''' + REPLACE(CONVERT(char(255),RTRIM(' + @Column_Name + ')),'''''''','''''''''''')+'''''''',''NULL'')'
- WHEN @Data_Type IN ('text','ntext')
- THEN
- 'COALESCE('''''''' + REPLACE(CONVERT(char(8000),' + @Column_Name + '),'''''''','''''''''''')+'''''''',''NULL'')'
- WHEN @Data_Type IN ('binary','varbinary')
- THEN
- 'COALESCE(RTRIM(CONVERT(char,' + 'CONVERT(int,' + @Column_Name + '))),''NULL'')'
- WHEN @Data_Type IN ('timestamp','rowversion')
- THEN
- CASE
- WHEN @include_timestamp = 0
- THEN
- '''DEFAULT'''
- ELSE
- 'COALESCE(RTRIM(CONVERT(char,' + 'CONVERT(int,' + @Column_Name + '))),''NULL'')'
- END
- WHEN @Data_Type IN ('float','real','money','smallmoney')
- THEN
- 'COALESCE(LTRIM(RTRIM(' + 'CONVERT(char, ' + @Column_Name + ',2)' + ')),''NULL'')'
- ELSE
- 'COALESCE(LTRIM(RTRIM(' + 'CONVERT(char, ' + @Column_Name + ')' + ')),''NULL'')'
- END + '+' + ''',''' + ' + '
-
- --Génération de la liste des colonnes de la commande INSERT
- SET @Column_List = @Column_List + @Column_Name + ','
-
- SKIP_LOOP: --L'étiquette utilisée en GOTO
-
- SELECT @Column_ID = MIN(ORDINAL_POSITION)
- FROM INFORMATION_SCHEMA.COLUMNS (NOLOCK)
- WHERE TABLE_NAME = @table_name AND
- ORDINAL_POSITION > @Column_ID AND
- (@owner IS NULL OR TABLE_SCHEMA = @owner)
-
-
- --Boucle se termine ici!
- END
-
- --Pour se débarrasser des caractères supplémentaires qui se sont concaténées au cours de la dernière exécution dans la boucle
- SET @Column_List = LEFT(@Column_List,len(@Column_List) - 1)
- SET @Actual_Values = LEFT(@Actual_Values,len(@Actual_Values) - 6)
-
- IF LTRIM(@Column_List) = ''
- BEGIN
- RAISERROR('Aucune colonne à sélectionner. Il devrait au moins être une colonne pour générer la sortie',16,1)
- RETURN -1 --Échec. Motif: On dirait que toutes les colonnes sont omise en utilisant le paramètre @cols_to_exclude
- END
-
- --Génération de la dernière chaîne qui sera exécuté, à la sortie de l'INSERT
- IF (@include_column_list <> 0)
- BEGIN
- SET @Actual_Values =
- 'SELECT ' +
- CASE WHEN @top IS NULL OR @top < 0 THEN '' ELSE ' TOP ' + LTRIM(STR(@top)) + ' ' END +
- '''' + RTRIM(@Start_Insert) +
- ' ''+' + '''(' + RTRIM(@Column_List) + '''+' + ''')''' +
- ' +''VALUES(''+ ' + @Actual_Values + '+'')''' + ' ' +
- COALESCE(@from,' FROM ' + CASE WHEN @owner IS NULL THEN '' ELSE '[' + LTRIM(RTRIM(@owner)) + '].' END + '[' + rtrim(@table_name) + ']' + '(NOLOCK)')
- END
- ELSE IF (@include_column_list = 0)
- BEGIN
- SET @Actual_Values =
- 'SELECT ' +
- CASE WHEN @top IS NULL OR @top < 0 THEN '' ELSE ' TOP ' + LTRIM(STR(@top)) + ' ' END +
- '''' + RTRIM(@Start_Insert) +
- ' '' +''VALUES(''+ ' + @Actual_Values + '+'')''' + ' ' +
- COALESCE(@from,' FROM ' + CASE WHEN @owner IS NULL THEN '' ELSE '[' + LTRIM(RTRIM(@owner)) + '].' END + '[' + rtrim(@table_name) + ']' + '(NOLOCK)')
- END
-
- --À déterminer si on affche les informations de déboguage
- IF @debug_mode =1
- BEGIN
- PRINT '/*****DÉBUT DES INFORMATIONS DE DÉBOGAGE*****'
- PRINT 'Début de la commande INSERT:'
- PRINT @Start_Insert
- PRINT ''
- PRINT 'La liste des colonnes:'
- PRINT @Column_List
- PRINT ''
- PRINT 'La commande SELECT exécuté pour générer les INSERTs'
- PRINT @Actual_Values
- PRINT ''
- PRINT '*****FIN DES INFORMATIONS DE DÉBOGAGE*****/'
- PRINT ''
- END
-
- --Déterminer s'il ya lieu d'imprimer IDENTITY_INSERT ou non
- IF (@IDN <> '')
- BEGIN
- PRINT 'SET IDENTITY_INSERT ' + QUOTENAME(COALESCE(@owner,USER_NAME())) + '.' + QUOTENAME(@table_name) + ' ON'
- PRINT 'GO'
- PRINT ''
- END
-
-
- IF @disable_constraints = 1 AND (OBJECT_ID(QUOTENAME(COALESCE(@owner,USER_NAME())) + '.' + @table_name, 'U') IS NOT NULL)
- BEGIN
- IF @owner IS NULL
- BEGIN
- SELECT 'ALTER TABLE ' + QUOTENAME(COALESCE(@target_table, @table_name)) + ' NOCHECK CONSTRAINT ALL' AS '--Code pour désactiver temporairement les contraintes'
- END
- ELSE
- BEGIN
- SELECT 'ALTER TABLE ' + QUOTENAME(@owner) + '.' + QUOTENAME(COALESCE(@target_table, @table_name)) + ' NOCHECK CONSTRAINT ALL' AS '--Code de désactiver temporairement les contraintes'
- END
-
- PRINT 'GO'
- END
-
- PRINT ''
- PRINT 'PRINT ''INSERTION DES DONNÉE DANS ' + '[' + RTRIM(COALESCE(@target_table,@table_name)) + ']' + ''''
-
-
- --Tout le travail acharné porte ses fruits ici! Vous obtiendrez votre INSERT, quand la ligne suivante exécute!
- EXEC (@Actual_Values)
-
- PRINT 'PRINT ''OK'''
- PRINT ''
-
-
- IF @disable_constraints = 1 AND (OBJECT_ID(QUOTENAME(COALESCE(@owner,USER_NAME())) + '.' + @table_name, 'U') IS NOT NULL)
- BEGIN
- IF @owner IS NULL
- BEGIN
- SELECT 'ALTER TABLE ' + QUOTENAME(COALESCE(@target_table, @table_name)) + ' CHECK CONSTRAINT ALL' AS '--Code pour activer les contraintes précédemment désactivé'
- END
- ELSE
- BEGIN
- SELECT 'ALTER TABLE ' + QUOTENAME(@owner) + '.' + QUOTENAME(COALESCE(@target_table, @table_name)) + ' CHECK CONSTRAINT ALL' AS '--Code pour activer les contraintes précédemment désactivé'
- END
-
- PRINT 'GO'
- END
-
- PRINT ''
- IF (@IDN <> '')
- BEGIN
- PRINT 'SET IDENTITY_INSERT ' + QUOTENAME(COALESCE(@owner,USER_NAME())) + '.' + QUOTENAME(@table_name) + ' OFF'
- PRINT 'GO'
- END
-
- PRINT 'SET NOCOUNT OFF'
-
-
- SET NOCOUNT OFF
- RETURN 0 -- C'est enfin fini :)
- END
CREATE PROC sp_generate_inserts
(
@table_name varchar(776), -- La table / vue pour les commandes INSERT qui seront générées en utilisant les données existantes
@target_table varchar(776) = NULL, -- Utilisez ce paramètre pour spécifier un autre nom de la table dans laquelle les données seront insérées
@include_column_list bit = 1, -- Utilisez ce paramètre pour inclure / ne pas inclure colonne dans la liste générée INSERT
@from varchar(800) = NULL, -- Ce paramètre permet de filtrer les lignes d'un filtre basé sur l'état (à l'aide WHERE)
@include_timestamp bit = 0, -- Spécifier 1 pour ce paramètre si vous voulez inclure le TIMESTAMP / ROWVERSION colonne de données dans la déclaration INSERT
@debug_mode bit = 0, -- Si @ debug_mode est 1, les requêtes SQL construits par cette procédure seront imprimés pour examen ultérieur
@owner varchar(64) = NULL, -- Utilisez ce paramètre si vous n'êtes pas le propriétaire de la table
@ommit_images bit = 0, -- Utilisez ce paramètre pour générer INSERT par l'omission des colonnes 'image'
@ommit_identity bit = 0, -- Utilisez ce paramètre pour ommettre les colonnes identity
@top int = NULL, -- Utilisez ce paramètre pour générer INSERT seulement pour les TOP n lignes
@cols_to_include varchar(8000) = NULL, -- Liste des colonnes à inclure dans la déclaration INSERT
@cols_to_exclude varchar(8000) = NULL, -- Liste des colonnes à être exclus de la commande INSERT
@disable_constraints bit = 0, -- Lorsque 1, désactive clé étrangères et leur permet après l'INSERT
@ommit_computed_cols bit = 0 -- Lorsque 1, les colonnes calculées ne seront pas inclus dans la commande INSERT
)
AS
BEGIN
/***********************************************************************************************************
Objectif: Pour générer des INSERT à partir des données existantes. Ces INSERTS peuvent être exécutés pour régénérer les données vers un autre endroit. Cette procédure peut également être utile afin de créer une base de données de configuration.
Exemple 1: Pour produire INSERT pour la table "titres":
EXEC sp_generate_inserts "titres"
Exemple 2: Pour ommettre la liste des colonnes dans la commande INSERT: (liste colonne est inclus par défaut)
IMPORTANT: Si vous avez trop de colonnes, je vous conseille d'ommettre la liste de colonne, comme illustré ci-dessous,
Pour éviter les faux résultats
EXEC sp_generate_inserts "titres", @ include_column_list = 0
Exemple 3: Pour produire INSERT pour la table 'titlesCopy' vers la table 'titres' :
EXEC sp_generate_inserts 'titres', 'titlesCopy'
Exemple 4: Pour produire INSERT pour la table "titres" pour les seuls titres
Qui contiennent le mot «Computer» en eux:
NOTE: Ne pas compliquer le FROM ou clause WHERE ici. Il est supposé que vous êtes bien avec T-SQL si vous utilisez ce paramètre
EXEC sp_generate_inserts "titres", @ from = "from titres where titre like '%Computer%'"
Exemple 5: Pour spécifier que vous voulez inclure les données de la colonne TIMESTAMP dans la commande INSERT:
(Par défaut, les données de la colonne TIMESTAMP n'est pas scriptée)
EXEC sp_generate_inserts "titres", @ include_timestamp = 1
Exemple 6: Pour imprimer les informations de débogage:
EXEC sp_generate_inserts "titres", @ debug_mode = 1
Exemple 7: Si vous n'êtes pas le propriétaire de la table, utilisez le paramètre @propriétaire pour spécifier le nom du propriétaire
Pour utiliser cette option, vous devez avoir les permissions SELECT sur la table
EXEC sp_generate_inserts Nickstable, propriétaire @ = 'Lassaad'
Exemple 8: Pour produire INSERT pour le reste des colonnes exclusion images
Lorsque vous utilisez cette otion, ne pas mittre le paramètre @include_column_list à 0.
EXEC sp_generate_inserts imgtable, @ommit_images = 1
Exemple 9: Pour produire INSERT excluant (en omettant) les colonnes IDENTITY :
(Par défaut, les colonnes IDENTITY sont inclus dans la commande INSERT)
EXEC sp_generate_inserts mytable, @ommit_identity = 1
Exemple 10: Pour produire INSERT pour les 10 TOP lignes dans la table:
EXEC sp_generate_inserts mytable, @top = 10
Exemple 11: Pour produire des commandes INSERT avec les colonnes que vous voulez:
EXEC sp_generate_inserts titres, @cols_to_include = "'titre', 'titre_id', 'au_id'"
Exemple 12: Pour produire des INSERT en omettant certaines colonnes:
EXEC sp_generate_inserts titres, cols_to_exclude @ = " 'title', 'title_id', 'au_id'"
Exemple 13: Afin d'éviter la vérification de la clé étrangères lors du chargement de données avec INSERT:
EXEC sp_generate_inserts titres, @disable_constraints = 1
Exemple 14: Pour exclure les colonnes calculé
EXEC sp_generate_inserts MaTable, @ommit_computed_cols = 1
***********************************************************************************************************/
SET NOCOUNT ON
--Faire en sorte que l'utilisateur utilise soit @cols_to_include soit @cols_to_exclude
IF ((@cols_to_include IS NOT NULL) AND (@cols_to_exclude IS NOT NULL))
BEGIN
RAISERROR('Utilisez soit @cols_to_include soit @cols_to_exclude. Ne pas utiliser ces deux paramètres à la fois',16,1)
RETURN -1 --Échec. Motif: Les deux paramètres : @cols_to_include et @cols_to_exclude sont spécifiés
END
--S'assurer que les paramètres @cols_to_include et @cols_to_exclude reçoivent les valeurs dans le bon format
IF ((@cols_to_include IS NOT NULL) AND (PATINDEX('''%''',@cols_to_include) = 0))
BEGIN
RAISERROR('Utilisation invalide de propriété @cols_to_include',16,1)
PRINT 'Spécifiez les noms de colonnes entouré de guillemets simples et séparés par des virgules'
PRINT 'Par exemple: EXEC sp_generate_inserts titres , @cols_to_include = "''titre_id'',''titres''"'
RETURN -1 --Échec. Cause: Utilisation invalide de propriété @cols_to_include
END
IF ((@cols_to_exclude IS NOT NULL) AND (PATINDEX('''%''',@cols_to_exclude) = 0))
BEGIN
RAISERROR('Utilisation invalide de propriété @cols_to_exclude',16,1)
PRINT 'Spécifiez les noms de colonnes entouré de guillemets simples et séparés par des virgules'
PRINT 'Par exemple: EXEC sp_generate_inserts titres, @cols_to_exclude = "''titre_id'',''titre''"'
RETURN -1 --Échec. Cause: Utilisation invalide de propriété @cols_to_exclude
END
-- Contrôl pour voir si le nom de base de données est spécifiée avec le même nom de table
-- Le contexte de votre base de données local devraient être la table pour laquelle vous voulez générer INSERT
-- Précise si le nom de base de données n'est pas autorisé
IF (PARSENAME(@table_name,3)) IS NOT NULL
BEGIN
RAISERROR('Ne pas spécifier le nom de la base. Être dans la base de données nécessaire et spécifier juste le nom de la table.',16,1)
RETURN -1 --Échec. Motif: Le nom de la base de donnée est spécifiée avec le nom de la table, ce qui n'est pas autorisé
END
-- Vérification de l'existence de table 'user'ou 'vision '
-- Cette procédure n'est pas écrite pour travailler sur les tables système
-- Pour l'écriture des données dans les tables système, il suffit de créer une vue sur les tables système et de travailler sur cette vue
IF @owner IS NULL
BEGIN
IF ((OBJECT_ID(@table_name,'U') IS NULL) AND (OBJECT_ID(@table_name,'V') IS NULL))
BEGIN
RAISERROR('Table ou vue n''a pas été trouvée.',16,1)
PRINT 'Vous pouvez voir cette erreur, si vous n''êtes pas le propriétaire de cette table ou vue. Dans ce cas, utilisez le paramètre @owner pour spécifier le nom du propriétaire.'
PRINT 'Assurez-vous d''avoir la permission de SELECT sur la table ou vue.'
RETURN -1 --Échec. Raison: il n'existe pas de table ou vue utilisateur avec ce nom
END
END
ELSE
BEGIN
IF NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = @table_name AND (TABLE_TYPE = 'BASE TABLE' OR TABLE_TYPE = 'VIEW') AND TABLE_SCHEMA = @owner)
BEGIN
RAISERROR('Table ou vue n''a pas été trouvée.',16,1)
PRINT 'Vous pouvez voir cette erreur, si vous n''êtes pas le propriétaire de cette table ou vue. Dans ce cas, utilisez le paramètre @owner pour spécifier le nom du propriétaire.'
PRINT 'Assurez-vous d''avoir la permission de SELECT sur la table ou vue.'
RETURN -1 --Échec. Raison: il n'existe pas de table ou vue utilisateur avec ce nom
END
END
-- Déclaration des Variables
DECLARE @Column_ID int,
@Column_List varchar(8000),
@Column_Name varchar(8000),
@Start_Insert varchar(786),
@Data_Type varchar(128),
@Actual_Values varchar(8000), --Telle est la chaîne qui sera finalement exécuté pour générer des commandes INSERT
@IDN varchar(128) --Contiendra le nom de la colonnes IDENTITY dans la table
-- Initialisation des Variables
SET @IDN = ''
SET @Column_ID = 0
SET @Column_Name = ''
SET @Column_List = ''
SET @Actual_Values = ''
IF @owner IS NULL
BEGIN
SET @Start_Insert = 'INSERT INTO ' + '[' + RTRIM(COALESCE(@target_table,@table_name)) + ']'
END
ELSE
BEGIN
SET @Start_Insert = 'INSERT ' + '[' + LTRIM(RTRIM(@owner)) + '].' + '[' + RTRIM(COALESCE(@target_table,@table_name)) + ']'
END
--Pour obtenir l'ID de la premiere colonne
SELECT @Column_ID = MIN(ORDINAL_POSITION)
FROM INFORMATION_SCHEMA.COLUMNS (NOLOCK)
WHERE TABLE_NAME = @table_name AND
(@owner IS NULL OR TABLE_SCHEMA = @owner)
--Boucle à travers toutes les colonnes de la table, pour obtenir les noms des colonnes et leurs types de données
WHILE @Column_ID IS NOT NULL
BEGIN
SELECT @Column_Name = QUOTENAME(COLUMN_NAME),
@Data_Type = DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS (NOLOCK)
WHERE ORDINAL_POSITION = @Column_ID AND
TABLE_NAME = @table_name AND
(@owner IS NULL OR TABLE_SCHEMA = @owner)
IF @cols_to_include IS NOT NULL --Sélectionne uniquement les colonnes spécifiées par l'utilisateur
BEGIN
IF CHARINDEX( '''' + SUBSTRING(@Column_Name,2,LEN(@Column_Name)-2) + '''',@cols_to_include) = 0
BEGIN
GOTO SKIP_LOOP
END
END
IF @cols_to_exclude IS NOT NULL --Sélectionne uniquement les colonnes spécifiées par l'utilisateur
BEGIN
IF CHARINDEX( '''' + SUBSTRING(@Column_Name,2,LEN(@Column_Name)-2) + '''',@cols_to_exclude) <> 0
BEGIN
GOTO SKIP_LOOP
END
END
--S'assurer de la sortie SET IDENTITY_INSERT ON / OFF dans le cas où la table a une colonne de type IDENTITY
IF (SELECT COLUMNPROPERTY( OBJECT_ID(QUOTENAME(COALESCE(@owner,USER_NAME())) + '.' + @table_name),SUBSTRING(@Column_Name,2,LEN(@Column_Name) - 2),'IsIdentity')) = 1
BEGIN
IF @ommit_identity = 0 --Déterminer s'il ya lieu d'inclure ou d'exclure la colonne IDENTITY
SET @IDN = @Column_Name
ELSE
GOTO SKIP_LOOP
END
--Faire en sorte que de'afficher les colonnes calculées ou non
IF @ommit_computed_cols = 1
BEGIN
IF (SELECT COLUMNPROPERTY( OBJECT_ID(QUOTENAME(COALESCE(@owner,USER_NAME())) + '.' + @table_name),SUBSTRING(@Column_Name,2,LEN(@Column_Name) - 2),'IsComputed')) = 1
BEGIN
GOTO SKIP_LOOP
END
END
--Les table avec les colonnes de type de données IMAGE ne sont pas pris en charge pour des raisons évidentes
IF(@Data_Type in ('image'))
BEGIN
IF (@ommit_images = 0)
BEGIN
RAISERROR('Table avec des colonnes image ne sont pas supportés.',16,1)
PRINT 'Utilisez le paramètre @ommit_images = 1 pour générer un INSERTs pour le reste des colonnes.'
PRINT 'NE PAS ommettre la Liste des colonne dans l''INSERT. En utilisant @include_column_list = 0 vous oublier la liste des colonne , les INSERTs généré vont échouer.'
RETURN -1 --Échec. Raison: Il y a une colonne avec le type de données d'IMAGE
END
ELSE
BEGIN
GOTO SKIP_LOOP
END
END
-- Déterminer le type de données de la colonne et en fonction du type de données, la part des VALEURS
-- La commande INSERT est générée. Des mesures sont prises pour traiter les colonnes avec des valeurs NULL. Également
-- Faire en sorte, pour ne pas perdre toutes les données de type flot, real, money, smallmomey, datetime
SET @Actual_Values = @Actual_Values +
CASE
WHEN @Data_Type IN ('char','varchar','nchar','nvarchar')
THEN
'COALESCE('''''''' + REPLACE(RTRIM(' + @Column_Name + '),'''''''','''''''''''')+'''''''',''NULL'')'
WHEN @Data_Type IN ('datetime','smalldatetime')
THEN
'COALESCE('''''''' + RTRIM(CONVERT(char,' + @Column_Name + ',109))+'''''''',''NULL'')'
WHEN @Data_Type IN ('uniqueidentifier')
THEN
'COALESCE('''''''' + REPLACE(CONVERT(char(255),RTRIM(' + @Column_Name + ')),'''''''','''''''''''')+'''''''',''NULL'')'
WHEN @Data_Type IN ('text','ntext')
THEN
'COALESCE('''''''' + REPLACE(CONVERT(char(8000),' + @Column_Name + '),'''''''','''''''''''')+'''''''',''NULL'')'
WHEN @Data_Type IN ('binary','varbinary')
THEN
'COALESCE(RTRIM(CONVERT(char,' + 'CONVERT(int,' + @Column_Name + '))),''NULL'')'
WHEN @Data_Type IN ('timestamp','rowversion')
THEN
CASE
WHEN @include_timestamp = 0
THEN
'''DEFAULT'''
ELSE
'COALESCE(RTRIM(CONVERT(char,' + 'CONVERT(int,' + @Column_Name + '))),''NULL'')'
END
WHEN @Data_Type IN ('float','real','money','smallmoney')
THEN
'COALESCE(LTRIM(RTRIM(' + 'CONVERT(char, ' + @Column_Name + ',2)' + ')),''NULL'')'
ELSE
'COALESCE(LTRIM(RTRIM(' + 'CONVERT(char, ' + @Column_Name + ')' + ')),''NULL'')'
END + '+' + ''',''' + ' + '
--Génération de la liste des colonnes de la commande INSERT
SET @Column_List = @Column_List + @Column_Name + ','
SKIP_LOOP: --L'étiquette utilisée en GOTO
SELECT @Column_ID = MIN(ORDINAL_POSITION)
FROM INFORMATION_SCHEMA.COLUMNS (NOLOCK)
WHERE TABLE_NAME = @table_name AND
ORDINAL_POSITION > @Column_ID AND
(@owner IS NULL OR TABLE_SCHEMA = @owner)
--Boucle se termine ici!
END
--Pour se débarrasser des caractères supplémentaires qui se sont concaténées au cours de la dernière exécution dans la boucle
SET @Column_List = LEFT(@Column_List,len(@Column_List) - 1)
SET @Actual_Values = LEFT(@Actual_Values,len(@Actual_Values) - 6)
IF LTRIM(@Column_List) = ''
BEGIN
RAISERROR('Aucune colonne à sélectionner. Il devrait au moins être une colonne pour générer la sortie',16,1)
RETURN -1 --Échec. Motif: On dirait que toutes les colonnes sont omise en utilisant le paramètre @cols_to_exclude
END
--Génération de la dernière chaîne qui sera exécuté, à la sortie de l'INSERT
IF (@include_column_list <> 0)
BEGIN
SET @Actual_Values =
'SELECT ' +
CASE WHEN @top IS NULL OR @top < 0 THEN '' ELSE ' TOP ' + LTRIM(STR(@top)) + ' ' END +
'''' + RTRIM(@Start_Insert) +
' ''+' + '''(' + RTRIM(@Column_List) + '''+' + ''')''' +
' +''VALUES(''+ ' + @Actual_Values + '+'')''' + ' ' +
COALESCE(@from,' FROM ' + CASE WHEN @owner IS NULL THEN '' ELSE '[' + LTRIM(RTRIM(@owner)) + '].' END + '[' + rtrim(@table_name) + ']' + '(NOLOCK)')
END
ELSE IF (@include_column_list = 0)
BEGIN
SET @Actual_Values =
'SELECT ' +
CASE WHEN @top IS NULL OR @top < 0 THEN '' ELSE ' TOP ' + LTRIM(STR(@top)) + ' ' END +
'''' + RTRIM(@Start_Insert) +
' '' +''VALUES(''+ ' + @Actual_Values + '+'')''' + ' ' +
COALESCE(@from,' FROM ' + CASE WHEN @owner IS NULL THEN '' ELSE '[' + LTRIM(RTRIM(@owner)) + '].' END + '[' + rtrim(@table_name) + ']' + '(NOLOCK)')
END
--À déterminer si on affche les informations de déboguage
IF @debug_mode =1
BEGIN
PRINT '/*****DÉBUT DES INFORMATIONS DE DÉBOGAGE*****'
PRINT 'Début de la commande INSERT:'
PRINT @Start_Insert
PRINT ''
PRINT 'La liste des colonnes:'
PRINT @Column_List
PRINT ''
PRINT 'La commande SELECT exécuté pour générer les INSERTs'
PRINT @Actual_Values
PRINT ''
PRINT '*****FIN DES INFORMATIONS DE DÉBOGAGE*****/'
PRINT ''
END
--Déterminer s'il ya lieu d'imprimer IDENTITY_INSERT ou non
IF (@IDN <> '')
BEGIN
PRINT 'SET IDENTITY_INSERT ' + QUOTENAME(COALESCE(@owner,USER_NAME())) + '.' + QUOTENAME(@table_name) + ' ON'
PRINT 'GO'
PRINT ''
END
IF @disable_constraints = 1 AND (OBJECT_ID(QUOTENAME(COALESCE(@owner,USER_NAME())) + '.' + @table_name, 'U') IS NOT NULL)
BEGIN
IF @owner IS NULL
BEGIN
SELECT 'ALTER TABLE ' + QUOTENAME(COALESCE(@target_table, @table_name)) + ' NOCHECK CONSTRAINT ALL' AS '--Code pour désactiver temporairement les contraintes'
END
ELSE
BEGIN
SELECT 'ALTER TABLE ' + QUOTENAME(@owner) + '.' + QUOTENAME(COALESCE(@target_table, @table_name)) + ' NOCHECK CONSTRAINT ALL' AS '--Code de désactiver temporairement les contraintes'
END
PRINT 'GO'
END
PRINT ''
PRINT 'PRINT ''INSERTION DES DONNÉE DANS ' + '[' + RTRIM(COALESCE(@target_table,@table_name)) + ']' + ''''
--Tout le travail acharné porte ses fruits ici! Vous obtiendrez votre INSERT, quand la ligne suivante exécute!
EXEC (@Actual_Values)
PRINT 'PRINT ''OK'''
PRINT ''
IF @disable_constraints = 1 AND (OBJECT_ID(QUOTENAME(COALESCE(@owner,USER_NAME())) + '.' + @table_name, 'U') IS NOT NULL)
BEGIN
IF @owner IS NULL
BEGIN
SELECT 'ALTER TABLE ' + QUOTENAME(COALESCE(@target_table, @table_name)) + ' CHECK CONSTRAINT ALL' AS '--Code pour activer les contraintes précédemment désactivé'
END
ELSE
BEGIN
SELECT 'ALTER TABLE ' + QUOTENAME(@owner) + '.' + QUOTENAME(COALESCE(@target_table, @table_name)) + ' CHECK CONSTRAINT ALL' AS '--Code pour activer les contraintes précédemment désactivé'
END
PRINT 'GO'
END
PRINT ''
IF (@IDN <> '')
BEGIN
PRINT 'SET IDENTITY_INSERT ' + QUOTENAME(COALESCE(@owner,USER_NAME())) + '.' + QUOTENAME(@table_name) + ' OFF'
PRINT 'GO'
END
PRINT 'SET NOCOUNT OFF'
SET NOCOUNT OFF
RETURN 0 -- C'est enfin fini :)
END
Conclusion
NOTE: Cette procédure peut ne pas fonctionner avec les tables qui ont beaucoup de colonnes. Les résultats peuvent être imprévisibles avec d'énormes colonnes de texte. Dans la mesure du possible, pour de meilleurs résultats, utilisez le paramètre @include_column_list afin d'ommèttre une liste de colonne dans INSERT.
Historique
- 13 février 2008 18:06:04 :
- modification de la description
- 28 février 2008 14:38:15 :
- Ajout du script en download
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
insertion de nombre de 1 à N [ par ftug ]
Bonjour,j'aimerai inserer dans une table des nombre de 1 à N avec le moins de requetes possible ( le serveur SQL est déjà bien charg
générer le script à partir de power amc 6 [ par Rjoe ]
Bonjour , je voulais savoir comment on fait pour générer le script a partir du mcd pour ms acces2000.avec power amc 6.Merciio
faire une insertion sur plusieures tables [ par tenrod ]
bijour!je voudrais savoir si il est possible d'effectuer un insert sur plusieures tables du genre:insert into latable1, latable2, latable3...values va
Insertion auatomatique de GUID sous sql serveur 2000 [ par Arthenius ]
Salut tout le monde,voila ne souhaitant plus utiliser les compteurs auto-incrementer pour mes primary key (car je souhaite pouvoir intégrer dans
Script pour insertion d'un nom lors de la visite de ma page [ par jmg69 ]
Bonjour.Je cherche un script qui oblige à un visiteur de ma page à insérer un nom et qu'ensuite ce nom soit ajouter dans un listing pour des questions
Insertion de date [ par Zachs ]
Hello, j'ai une requête qui insert une date dans une colonne de Type "datetime" d'une table mais a chaque fois que j'essaye de l'inserer il me met "Er
SQL 2000 insertion [ par rikardo ]
bonjour, je fais une insertion de masse avec une requete du type insert into TABLE1(CHAMP1,CHAMP2.) SELECT a.champ1,b.champ2 FROM ... cette requete
Grosse quantité de requêtes UPDATE multiple Vs INSERT ... ON DUPLICATE [ par kankrelune ]
Bonjour... J'ai une base de données pas énorme énorme mais pas petite non plus (760000 entrées) qui nécessite d'être continuellement mise à jour et c
Ajouter un enregistrement Vb INSERT INTO [ par scottmat ]
Bonjour à tous, voila j'utilise VB et voudrais ajouter tout simplement une ligne (enregistrement) dans une table, voici le code que j'utilise : Di
Script ajout droit exec sur proc stock [ par Kikuts ]
Bonjour à tous et à toutes. Mon problème est le suivant : tout les jours une réplication de la base de données de production est faites en 2 copies.
|
Derniers Blogs
[WP7] AJOUTER DES IMAGES DANS LA MEDIA LIBRARY D'UN WINDOWS PHONE 7[WP7] AJOUTER DES IMAGES DANS LA MEDIA LIBRARY D'UN WINDOWS PHONE 7 par Audrey
L'émulateur Windows Phone 7, fourni avec la version Beta des outils développeurs n'inclut aucune image dans sa bibliothèque. Pas très pratique de tester son application lorsque l'on souhaite que l'utilisateur puisse choisir une image présente dans le télé...
Cliquez pour lire la suite de l'article par Audrey VIVE LES MOCKS ET LES POCOSVIVE LES MOCKS ET LES POCOS par vLabz
J'observe régulièrement autour de moi de la confusion à propos de ces deux termes et j'aimerais juste rappeler ce qu'ils signifient. Je ne suis bien sûr pas le mieux placé pour faire une leçon mais je vais faire de mon mieux pour mettre en valeur ce q...
Cliquez pour lire la suite de l'article par vLabz [WF4] WORKFLOW AND CUSTOM ACTIVITIES - BEST PRACTICES (4/5)[WF4] WORKFLOW AND CUSTOM ACTIVITIES - BEST PRACTICES (4/5) par JeremyJeanson
Vendredi dernier Microsoft a publié le quatrième épisode des bonnes pratiques pour coder ses activités custom dans WF4 : endpoint.tv - Workflow and Custom Activities - Best Practices (Part 4) . Tout comme pour les précédents épisodes, j'ai pris le temps d...
Cliquez pour lire la suite de l'article par JeremyJeanson DéVELOPPEMENT MOBILE : .NET COMPACT FRAMEWORK & LIMITATIONSDéVELOPPEMENT MOBILE : .NET COMPACT FRAMEWORK & LIMITATIONS par Pi-R
Introduction :
Le développement d'applications mobiles est quelque peu différent du développement d'applications sous Windows. En effet, le développement d'applications mobiles se base sur le .NET Compact Fra...
Cliquez pour lire la suite de l'article par Pi-R IPHONE VERSUS WP7 CODINGIPHONE VERSUS WP7 CODING par Nicolas
Je relais une présentation sur slideshare.net, qui compare le développement sur Iphone et Windows Phone 7, qui ma fait sourire. I phone versus windows phone 7 coding View more presentations from www.donburnett.com. J'aurais bien aimé une comparai...
Cliquez pour lire la suite de l'article par Nicolas
Logiciels
Xilisoft HD Vidéo Convertisseur 6 (6.0.3.0421)XILISOFT HD VIDéO CONVERTISSEUR 6 (6.0.3.0421)Xilisoft HD Vidéo Convertisseur est un outil professionnel de conversion HDTV, conçu pour transfo... Cliquez pour télécharger Xilisoft HD Vidéo Convertisseur 6 Xilisoft MP4 Convertisseur 6 (6.0.2.0415)XILISOFT MP4 CONVERTISSEUR 6 (6.0.2.0415)Xilisoft MP4 Convertisseur est un outil puissant pour la conversion de vidéo MP4, qui peut conver... Cliquez pour télécharger Xilisoft MP4 Convertisseur 6 Vade Retro Desktop (3.03)VADE RETRO DESKTOP (3.03)Le logiciel antispam Vade Retro pour Microsoft Outlook®, Outlook Express® et Windows Mail®(Vista)... Cliquez pour télécharger Vade Retro Desktop Malwarebytes Anti Malwares (1.46)MALWAREBYTES ANTI MALWARES (1.46)Malwarebytes' Anti-Malware est un anti-malware qui peut éliminer même les plus avancés des logic... Cliquez pour télécharger Malwarebytes Anti Malwares
|