IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Numéro de ligne


Sujet :

Développement SQL Server

  1. #1
    Membre expérimenté Avatar de Gaara-Manga
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France, Vienne (Poitou Charente)

    Informations forums :
    Inscription : Avril 2007
    Messages : 247
    Par défaut Numéro de ligne
    Bonjour,

    Je suis en train de faire un script d'exportation de données sous SQL Server 2000.

    Je l'ai quasiment finit mais je bloque juste sur un point.
    En effet je chercher à savoir comment faire pour récupérer un enregistrement avec un SELECT, selon son numéro d'enregistrement.

    En gros récupérer une ligne selon son indice.

    J'espère trouver une réponse à cette question qui me bloque depuis quelques jours maintenant.

    Merci beaucoup d'avance

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 021
    Billets dans le blog
    6
    Par défaut
    Cela est STRICTEMENT impossible. Une base de données et les tables qui sont dedans répondent à la théorie des ensembles et il n'existe aucune notion d'ordre (ni ordre des lignes, ni ordres des colonnes, des tables...).

    Une table c'est comme un sac de bille. Demander de retirer la 32e bille du sac n'a aucun sens !

    Lisez les articles que j'ai écrit à ce sujet :
    http://sqlpro.developpez.com/cours/sqlaz/erreurs/#L5
    http://sqlpro.developpez.com/cours/sqlaz/fondements/#L3

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre expérimenté Avatar de Gaara-Manga
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France, Vienne (Poitou Charente)

    Informations forums :
    Inscription : Avril 2007
    Messages : 247
    Par défaut
    Oki merci beaucoup SQLpro au moins sa enlève cette théorie de ma tête^^

    A ce moment la j'aurais une autre question, comment faire un parcours des données d'une table sachant qu'il y a une variable de table et de colone dans la requête.
    Au début je voulais faire avec les curseurs quelque chose un peu comme sa :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    DECLARE CursTable CURSOR FOR 
    	SELECT @Colone
    	FROM @Table
     
    OPEN CursTable
    FETCH NEXT FROM CursTable
    INTO @DONNEE
     
    WHILE @@FETCH_STATUS = 0
    BEGIN
     
    END
    Le problème est que la seul commande que je connais qui prend en charge les variables de tables c'est la commande sp_executesql mais qui ne me permet pas de faire de parcours pour autant.

    Donc je reste coincé -_-

    Au début j'était partie avec le numéro de ligne en fesant une requête du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT '+ @Colone + ' FROM ' + @Table + ' WHERE '+@Colone_Primaire+' in (SELECT TOP 3 '+@Colone_Primaire+' FROM '+@Table+') and '+@Colone_Primaire+' not in (SELECT TOP 2 '+@Colone_Primaire+' FROM '+@Table+') '
    En m'appuyant sur la clé primaire. Mais comme toutes les tables n'en n'ont pas jme suis vite trouvé bloqué.

    Sinon merci beaucoup encore pour votre aide j'espère que quelqu'un connait une solution à ce problème.

    (si sa peut aider sinon, ce que je cherche à faire c'est un script qui créer des requêtes de type INSERT INTO pour exporter toutes les données d'une base. Script qui s'adapterais à n'importe quel base)

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 021
    Billets dans le blog
    6
    Par défaut
    Vous pouvez piloter un curseur avec du SQL dynamique...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    DECLARE @my_cur CURSOR
    EXEC sp_executesql
         N'SET @my_cur = CURSOR STATIC FOR 
           SELECT name FROM dbo.sysobjects; 
           OPEN @my_cur',
         N'@my_cur cursor OUTPUT', @my_cur OUTPUT
    FETCH NEXT FROM @my_cur
    mais il serait plus intéressant que vous nous disiez ce que vous voulez faire (au sens sémantique du terme ) autrement dit quel traitement de données....

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Membre expérimenté Avatar de Gaara-Manga
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France, Vienne (Poitou Charente)

    Informations forums :
    Inscription : Avril 2007
    Messages : 247
    Par défaut
    Sa fait plaisir de voir quelqu'un qui à l'air de s'y connaitre dans le domaine^^

    Alors le but de mon script c'est de générer une grosse requête d'INSERT INTO pour pouvoir exporter des données.
    (Je sais qu'il y a un module pour SQL Server nommée SQL Server Database Publishing Wizard mais mon patron préfère qu'on est la source)


    Donc ensuite voici comment moi j'ai procédé :
    Dans un premier temps je parcours chaque table à l'aide de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    DECLARE CursTable CURSOR FOR 
    	SELECT so.name
    	FROM sysobjects so 
    	WHERE  so.xtype = 'U'
    	ORDER BY so.name
     
    OPEN CursTable
    FETCH NEXT FROM CursTable
    INTO @Table
     
    WHILE @@FETCH_STATUS = 0
    BEGIN

    Dans ce même parcours, j'avais fait le parcours des enregistrements par numéro de ligne mais l'idée jlai abandonné par rapport à ce que vous m'aviez dit^^
    Sinon c'était avec cette partie de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    		SELECT I.rows
    		FROM sysobjects O join sysindexes I ON O.id=I.id
    		WHERE O.xtype='U' and O.name = @Table
    Je récupérais la clé primaire (la sa posé problème vu que toute les tables n'en avais pas forcément)
    En suite je faisais un parcours des colonnes avec la partie de code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    			DECLARE CursColone CURSOR FOR
    				SELECT name
    				FROM syscolumns
    				WHERE  id IN (SELECT id FROM sysobjects WHERE name = @Table)
     
    				ORDER BY colorder
     
    			OPEN CursColone
    			FETCH NEXT FROM CursColone
    			INTO @Colone
    Puis j'exécutais une requête qui me permettais de récupérer les infos de la table sous la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SET @sql = N'SELECT @rv='+ @Colone + ' FROM ' + @Table + ' WHERE '+@Colone_Primaire+' in (SELECT TOP '+@j+' '+@Colone_Primaire+' FROM '+@Table+') and '+@Colone_Primaire+' not in (SELECT TOP '+@k+' '+@Colone_Primaire+' FROM '+@Table+') '
    EXEC sp_executesql @sql, N'@rv varchar(8000) out',@rv = @Info out

    Avec quelques autres traitements je m'étais en forme la requête pour ensuite l'afficher :

    Voila en gros ce que fesait mon script(qui marche bien pour les bases dans lesquelles il y a une clé primaire pour chaque table).
    Le résultat final doit être en gros qu'il doit afficher quelque chose du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT INTO ConcertToMusique(Cm_code, Fk_concert, Fk_musique) VALUES('26', '3', '11')
     
    INSERT INTO Famille(Fa_code, Fa_libelle) VALUES('2', 'Corde')
    INSERT INTO Famille(Fa_code, Fa_libelle) VALUES('4', 'Vent')
    Avec toutes les valeurs de la base.

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 021
    Billets dans le blog
    6
    Par défaut
    Évitez d'utiliser les tables systèmes. Utilisez de préférence les vues d'informations de SCHEMA telles que INFORMATION_SCHEMA.TABLES / COLUMNS.

    Mieux, utilisez les procédures qui ont été développez par la communauté :
    http://vyaskn.tripod.com :: sp_generate_inserts

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  7. #7
    Membre expérimenté Avatar de Gaara-Manga
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France, Vienne (Poitou Charente)

    Informations forums :
    Inscription : Avril 2007
    Messages : 247
    Par défaut
    Jvois pas trop comment procéder en passant par les vues d'informations de INFORMATION_SCHEMA.TABLES / COLUMNS.

    Rien que pour lister les tables en passant par sa je sais pas comment faire -_-

    J'ai cherché dans le site que tu m'as passé mais j'ai rien appris pour le moment dessus.

  8. #8
    Membre expérimenté
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2007
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 193
    Par défaut
    Pour les tables informations.schema....

    Je vais juste reprendre des petites partie de code, pas tout refaire, j'espère que vous pourrez comprendre ce que je change.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    DECLARE CursTable CURSOR FOR 
    	SELECT so.name
    	FROM sysobjects so 
    	WHERE  so.xtype = 'U'
    	ORDER BY so.name
     
    OPEN CursTable
    FETCH NEXT FROM CursTable
    INTO @TABLE
     
    WHILE @@FETCH_STATUS = 0
    BEGIN
    devient

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    DECLARE CursTable CURSOR FOR 
    	SELECT table_name
    	FROM information.schema.tables 
    	ORDER BY table_name
     
    OPEN CursTable
    FETCH NEXT FROM CursTable
    INTO @TABLE
     
    WHILE @@FETCH_STATUS = 0
    BEGIN
    Et de la même manière

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    DECLARE CursColone CURSOR FOR
    				SELECT name
    				FROM syscolumns
    				WHERE  id IN (SELECT id FROM sysobjects WHERE name = @TABLE)
     
    				ORDER BY colorder
     
    			OPEN CursColone
    			FETCH NEXT FROM CursColone
    			INTO @Colone
    devient

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    DECLARE CursColone CURSOR FOR
    				SELECT column_name
    				FROM information_schema.columns				WHERE  table_name = @TABLE
     				ORDER BY colorder
     
    			OPEN CursColone
    			FETCH NEXT FROM CursColone
    			INTO @Colone
    Il existe aussi des tables information_schemas pour les routines, les indexes etc, aller jetter un coup d'oeil du coté du site msdn a ce sujet avec comme critère de recherche "vue système" ou qqch ainsi

  9. #9
    Membre expérimenté Avatar de Gaara-Manga
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France, Vienne (Poitou Charente)

    Informations forums :
    Inscription : Avril 2007
    Messages : 247
    Par défaut
    A okey en faite jconnaissais pas du tout sa.
    Je croyais que les information_schemas c'était bah ce qu'on voyait dans les tables utilisateurs.

    Jvais me pencher de ce coter pour voir les possibilités.

    Merci beaucoup sa fait du bien de sentir qu'on avance un ptit peu^^

    Edit : C'est ORDER BY ORDINAL_POSITION et non ORDER BY colorder

    Reédit : Par contre j'ai pas trouvée ou est ce que l'on trouvait ces tables

    Rereédit lol : J'ai regarder mais ce qu'on peut faire avec les information_schemas on peut tout aussi bien le faire avec les tables systèmes. C'est juste une autre façon de faire mais ya rien de plus par rapport à mon problèmes -_-

  10. #10
    Membre expérimenté
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2007
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 193
    Par défaut
    la différence entre les tables systèmes et les vues système est que les tables systèmes sont amenée a changé au cours des versions et donc votre code ne peux être assuré d'être portable entre les versions de sql server.
    Pour les vues systemes la compatibilité tente a toujours être maintenues.

  11. #11
    Membre expérimenté
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2007
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 193
    Par défaut
    Je n'avais pas lu en entier votre problème
    Je suis au travail en général qd je répodns et n'ai pas la possibilité de lire l'ensemble des posts.

    Je vois plus ou moins ce que vous voulez faire, il faudrait que je cherche dans mes scripts si j'ai a la maison des scripts de génération dynamique d'insert.

    C'est un problème sur lequel je me suis penché au travail et qui d'ailleurs est résolu, il faudrait que je vous trouve l'ensemble des requètes que j'utilise pour généré mon insert.

    Edit : J'avais décrit une partie de notre analyse mais par soucis de confidentialité, je préfère vous poster un exemple de code générant la liste des columns de manière générique, récupéré les valeurs n'est pas bcp plus difficile.
    De mon coté étant sur un trigger je traitais avec inserted, je ne sais pas ce que vous voulez faire comme genre de réplication complète ou pas Si c'est complète, sans update ni delete, ne vous interressez pas au numéro de ligne, créer simplement un cursor fastforward et parcourer séquentiellement les enregistrement dans l'ordre du curseur

    En fait mon travail est surtout fait dans la construction dynamique du trigger.

    Je suis en train de refaire le projet en C#3.5 avec Linq si cela vous interresse, mais mon projet n'est pas encore très aboutit de ce coté la

    Petit conseil utilisé des boucles while a la place de trigger

    a titre d'exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    declare @column varchar(20),
    @req varchar(max)
     
    set @req = 'INSERT INTO toto ('
    set @column = ''
     
    while(@column is not null)
    BEGIN
    	select @column = min(column_name) from information_schema.columns
    	where table_name = 'toto'
    	and column_name > @column
     
    	if(@column is not null)
    		set @req = @req + @column + ','
    END
     
    set @req = left(@req, len(@req) -1) + ')'
    print @req

  12. #12
    Membre expérimenté Avatar de Gaara-Manga
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France, Vienne (Poitou Charente)

    Informations forums :
    Inscription : Avril 2007
    Messages : 247
    Par défaut
    A oui en effet c'est beaucoup plus simple et plus clair que d'utiliser les triggers.

    Mais en faite la partie qui m'aurait intéressée, sa aurait été celle ou vous parcourez et récupérez les données de la table car c'est vraiment cette partie la ou je suis coincée.

    Merci encore beaucoup.

Discussions similaires

  1. Rajouter les numéros de ligne dans une colone d'une requete
    Par AntiSAL dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 02/11/2005, 20h07
  2. Afficher le numéro de ligne dans une requete SELECT
    Par tilb dans le forum Langage SQL
    Réponses: 4
    Dernier message: 01/09/2004, 11h20
  3. Méthode donnant le numéro de ligne d'un Memo contenant un texte
    Par kilinette dans le forum Composants VCL
    Réponses: 3
    Dernier message: 25/06/2004, 11h16
  4. [DomAST] Numéro de ligne d'un noeud
    Par Satch dans le forum Eclipse Platform
    Réponses: 1
    Dernier message: 30/03/2004, 11h15
  5. [JSP] Affichage numéro de ligne d'une exception
    Par PhoneKilleR dans le forum Servlets/JSP
    Réponses: 12
    Dernier message: 23/09/2003, 15h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo