Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 30/08/2011, 17h22   #1
Membre confirmé
 
Avatar de dacid
 
Homme
Inscription : juin 2003
Messages : 858
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : juin 2003
Messages : 858
Points : 260
Points : 260
Par défaut [SQL SERVER 2008] Requête pour générer les scripts insert

Bonjour @ tous,

J'aimerais faire une requête qui permette de générer dans un fichier tous les scripts d'insert des tables de ma BDD (qui est au format mdf).
Le top serait de pourvoir indiquer les tables à prendre ou pas.

Je me suis documenté sur la fonction Backup, mais elle ne fait pas ça.
http://msdn.microsoft.com/fr-fr/library/ms186865.aspx

Pour info, j'ai bien vu la FAQ: http://sqlserver.developpez.com/faq/?page=BCK#BCK7
C'est soit en procédure stoquée, soit il faut utiliser un prog externe.
J'aimerais faire ça dans le code ou en requête.

Merci d'avance.

David.
__________________
David.
dacid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2011, 18h48   #2
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 669
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2005
Messages : 4 669
Points : 8 729
Points : 8 729
Bonjour,

Citation:
J'aimerais faire une requête qui permette de générer dans un fichier tous les scripts d'insert des tables de ma BDD (qui est au format mdf).
Désolé de pinailler mais vous confondez une base de données relationnelle SQL et un fichier, ce qui n'est absolument pas la même chose.

Cela étant, si c'est pour un besoin qui n'est pas fréquent, vous pouvez probablement vous contenter de l'assistant de génération de scripts comme je l'ai indiqué dans ce billet.

Si c'est pour un besoin plus régulier, vous pouvez probablement vous inspirer du billet de SQLPro à ce sujet.

Afin si vous avez besoin de réaliser de la copie de données en temps quasi réel, vous pouvez envisager d'utiliser l'envoi de journaux de transaction ou la réplication.

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2011, 15h21   #3
Membre confirmé
 
Avatar de dacid
 
Homme
Inscription : juin 2003
Messages : 858
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : juin 2003
Messages : 858
Points : 260
Points : 260
Bonjour elsuket,

Merci pour votre réponse, mais c'est un besoin régulier, et je ne veux pas d'intervention extérieure à mon appli et pas non plus de procedure stoquée.
J'ai fini par me faire une fonction en C#.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
    public static string getInsertsTable(string TABLE, int idxChampNumAuto, bool faireDelete, ref int nb) { // Si idxChampNumAuto<=0, alors ON prend tous les champs
        string ret = "";
        IF (faireDelete)
            ret = "DELETE FROM " + TABLE + ";" + Environment.NewLine;
        DataSet ds = GetDs("SELECT * FROM " + TABLE, dsName); // Remplir le dataset
        // Préparer le masque de la requête avec le nom des colonnes
        string sep = "";
        string strTmp = "INSERT INTO " + TABLE + " (";
        FOR (int i = 0; i<ds.TABLES[0].COLUMNS.Count; i++) {
            IF (i+1 != idxChampNumAuto) {
                strTmp += sep + "[" + ds.TABLES[0].COLUMNS[i].ColumnName + "]";
                sep = ",";
            }
        }
        strTmp += ") VALUES ([VALEURS]);" + Environment.NewLine;
        // Aller chercher les valeurs de la TABLE
        FOR (int i= 0; i < ds.TABLES[0].Rows.Count; i++) {
            string strTmp2 = "";
            sep = "";
            FOR (int j = 0; j<ds.TABLES[0].COLUMNS.Count; j++) {
                IF (j+1 != idxChampNumAuto) {
                    object leType = ds.TABLES[0].Rows[i][j].GetType();
                    IF ((leType == typeof(System.String))) { // Texte: Encadrés de guillemets
                        strTmp2 += sep + "N'" + ds.TABLES[0].Rows[i][j].ToString().REPLACE("'", "''").REPLACE("\r", "").REPLACE("\n", " ") + "'";
                    } else IF ((leType == typeof(System.DateTime))) { // Date: Cast
                        //DateTime d = new DateTime();
                        strTmp2 += sep + "CONVERT(DATETIME, '" + ((DateTime)ds.TABLES[0].Rows[i][j]).ToString("yyyy-MM-dd") + "', 102)";
                    } else IF ((leType == typeof(System.Int32)) || (leType == typeof(System.BOOLEAN))) { // Numérique: Pas encadrés de guillemets
                        strTmp2 += sep + "" + ds.TABLES[0].Rows[i][j].ToString() + "";
                    } else IF (leType == typeof(System.DBNull)) { // NULL
                        strTmp2 += sep + "NULL";
                    } else
                        strTmp2 += sep + "(" + leType + ")" + ds.TABLES[0].Rows[i][j].ToString() + "";
                    sep = ",";
                }
            }
            ret += strTmp.REPLACE("[VALEURS]", strTmp2);
        }
        nb += ds.TABLES[0].Rows.Count;
        RETURN ret + Environment.NewLine;
    }
__________________
David.
dacid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2011, 15h26   #4
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 724
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Expert SQL Server
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 724
Points : 6 848
Points : 6 848
Est ce qu'il n'est pas plus simple de scripter la définition des tables et de d'utiliser bcp pour le chargement même dans votre appli ?

++
mikedavem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/09/2011, 01h05   #5
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 669
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2005
Messages : 4 669
Points : 8 729
Points : 8 729
Citation:
je ne veux pas d'intervention extérieure à mon appli et pas non plus de procedure stoquée.
Y'a-t-il une raison particulière pour ne pas vouloir de procédure stockée ?

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h06.


 
 
 
 
Partenaires

Hébergement Web