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

MS SQL Server Discussion :

Select from other db


Sujet :

MS SQL Server

  1. #1
    Membre régulier
    Inscrit en
    Janvier 2004
    Messages
    309
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 309
    Points : 91
    Points
    91
    Par défaut Select from other db
    Je voudrais mettre des donées qui sont comme suit/

    view1 de la base db1
    view1 de la base db2
    view1 de la base db2

    le resulta dans une table(Tb_Result) qui se trouve sur la db4

    Bien les views et la table ont la meme structure excepté que la table a un identifiant pour indiquer de quel vieuw il est venu le record

    Aide

  2. #2
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    INSERT INTO db4.dbo.Tb_Result (source, mes_colonnes)
    SELECT 1 as source, mes_colonnes FROM db1.dbo.view1
    UNION ALL
    SELECT 2 as source, mes_colonnes FROM db2.dbo.view1
    ...

  3. #3
    Membre régulier
    Inscrit en
    Janvier 2004
    Messages
    309
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 309
    Points : 91
    Points
    91
    Par défaut
    Merci Rudib pour ta reponse,

    Mais j'ai un petit souci, la table T_Result a une colone de plus que les vieuws, c'est à dire une colonne qui sert à dire, tel record viens de view 1, donc j'insere v1, pour vieuw 2, j'insere v2, etc..

    Alors ya il il une façon de proceder, merci d'avance

  4. #4
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    Salut,

    En lisant la requête que j'ai posée ci-dessus, tu verras que cela répond à ta question.
    ou
    que tu ajoutes dans le SELECT des colonnes de ta vue.

  5. #5
    Membre régulier
    Inscrit en
    Janvier 2004
    Messages
    309
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 309
    Points : 91
    Points
    91
    Par défaut
    Merci pour ta reponse

    Et si alors les vues avaient exactement la meme struture que la table T_Result

    Comment seraient la requete, ceci est correct ?

    INSERT INTO db4.dbo.Tb_Result (source, mes_colonnes)
    SELECT v1 as source FROM db1.dbo.view1
    UNION ALL
    SELECT v2 as sourceFROM db2.dbo.view2

    Exccuse moi, je suis un peu nouveau dans tout ca

    Merci d'avance

  6. #6
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    Salut,

    Merci d'utiliser la balise [CODE].

    La syntaxe est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    INSERT INTO db4.dbo.Tb_Result (colonne1, colonne2, colonne3)
    SELECT colonne1, colonne2, colonne3 FROM db1.dbo.view1
    UNION ALL
    SELECT colonne1, colonne2, colonne3 FROM db2.dbo.view2
    colonne1, colonne2, colonne3 sont des colonnes de tes vues. Dans cette syntaxe, tu indique explicitement les colonnes à insérer dans la table.

    veut dire : SELECT 'une constante de type chaîne de caractères' AS alias
    Alias étant l'alias de colonne.
    Exeécute simplement
    dans Query Analyzer pour voir le résultat.
    Ca te permet de mélanger dans le SELECT sur ta vue, des valeurs de colonnes et une constante indiquant la source des données.

  7. #7
    Membre régulier
    Inscrit en
    Janvier 2004
    Messages
    309
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 309
    Points : 91
    Points
    91
    Par défaut
    Merci Rudib etb les autres pour votre,

    Ca marche bien sauft que les vieuw contiennent chacun 400.000 records et plus et au tottal j'ai 14 vieuws. Ce qui fait touner sql server pendant un temps et il donne le message d'erreur

    Server time out

    Cela est dû au nombre important de records.

    y a il une methose pour outrepasser cette situtaion.

    Merci pour vos idées.

  8. #8
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    Comment lances-tu ton code ? Quelle est ta méthode d'accès aux données ?
    Tu as normalement un paramètre ou une propriété QueryTimeout sur laquelle tu peux jouer.

    Mais si cela prend beaucoup de temps, il faut peut-être changer ta stratégie, notamment pour éviter des attentes trop longues de verrous s'il y a beaucoup de concurrence (utilisateurs simultanés) sur ton serveur.

  9. #9
    Membre régulier
    Inscrit en
    Janvier 2004
    Messages
    309
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 309
    Points : 91
    Points
    91
    Par défaut
    Merci pour la réponse,

    J'accede les données à partir de la db4 je lance une requete qui recupere
    les données des vieuws et puis je mets tout dans la table T-Result

    Il n' ya pas de concurrence d'accès je fais tout en local, au fait je fait des analyses pour des clients et je leur communique les reulmtats.

    Tous les paramettres sont mis à zero(0), ce qui signifie que le temps est illimité. Mais comme c'est des données enormes, l'attente devient trop long et il s'arrete en me disant server time out.

    J'ai lu quelque chose sur les packages mais c'est pas trop cliar pour moi , je n'ai pas pu m'en servir.

    Et je compte bien passer par apres par ASP pour visualiser les resulmtats.

    Merci d'avance pour vos idées, afin de ma debloquer.

  10. #10
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    Citation Envoyé par faamugol
    Merci pour la réponse,

    Tous les paramettres sont mis à zero(0), ce qui signifie que le temps est illimité. Mais comme c'est des données enormes, l'attente devient trop long et il s'arrete en me disant server time out.
    Il n'y a par défaut pas de timeout du côté du serveur, ta requête peut tourner trois semaines, SQL server ne t'arrêtera pas, donc cela vient nécessairement de ta méthode d'accès aux données, c'est pour ça que je te l'ai demandée. Tu ne m'as pas vraiment répondu mais je suppose que tu utilises Query Analyzer ? Donc regarde les options de QA dans l'onglet Connexion.

    Ceci dit, tu peux aussi songer à insérer par blocs, en bricolant celà dans un batch ou une procédure stockée, par exemple en segmentant par une colonne date.

  11. #11
    Membre régulier
    Inscrit en
    Janvier 2004
    Messages
    309
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 309
    Points : 91
    Points
    91
    Par défaut
    Merci rudib encore une fois pour ton temps et ta reponse rapide.
    Effectivemennt, j'utilise Query Analyzer.

    Mais je n'ai pas bien compris, tu dis:
    Donc regarde les options de QA dans l'onglet Connexion.

    Et tu poursuit:

    Ceci dit, tu peux aussi songer à insérer par blocs, en bricolant celà dans un batch ou une procédure stockée, par exemple en segmentant par une colonne date.Il me semble que ca va etre la solution, mais est ce possible de mdonner plus de details sur:" en segmentant par une colonne date" .

    Comment on le fait en pratique ??

    Je precise bien que je dois utiliser ASP poour visualiser les données sur un navigateur (IE).

    Merc d'avance pour vos idées.

  12. #12
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    Salut,

    Dans Query Analyser, Menu Tools -> Options (ou CTRL+SHIFT+O), tu as un onglet Connections, dans cet onglet une valeur Query Time-out (seconds) qui doit être à zéro.

    Aussi, pour optimiser, supprime tous les index de ta table destination et recrée-les après insertion, et disable les triggers éventuels.

    L'insertion par blocs est utile en production. Si tu lances la requête chez toi sur un serveur où il n'y a pas d'accès concurrentiels, tu peux peut-être t'en passer.

    L'idée est de trouver un moyen de partitionner logiquement tes données. Souvent on dispose d'une colonne de type datetime qui est un bon support de partitionnement, ou ta colonne autoincrémentale. Un exemple avec une colonne identity (macle) :
    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 @rowcount int
     
    SET @rowcount = 1
     
    SET ROWCOUNT 10000
     
    WHILE @rowcount > 0 BEGIN
     
    	INSERT INTO db4.dbo.Tb_Result (macle, 1, colonne1, colonne2, colonne3)
    	SELECT macle, source, colonne1, colonne2, colonne3 FROM db1.dbo.view1
    	WHERE macle > (SELECT MAX(macle) FROM db4.dbo.Tb_Result WHERE source = 1)
     
    	SET @rowcount = @@ROWCOUNT
     
    END -- WHILE
     
    SET ROWCOUNT 0

  13. #13
    Membre régulier
    Inscrit en
    Janvier 2004
    Messages
    309
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 309
    Points : 91
    Points
    91
    Par défaut
    Merci Rudib,

    Comme tu es decidé de m'aider,

    Alors j'ai une colonne datetime, comment dois je proceder ?

    J'avoue que je ne comprends pas le role de macle, vue que moi je fais tout simplement

    INSERT INTO db4.dbo.Tb_Result
    SELECT * FROM db1.dbo.v1
    union all
    SELECT * FROM db2.dbo.v2
    union all
    SELECT * FROM db3.dbo.v3

    Ca a bien l'air de marcher sauf pour le server time out

    Alors comment dois je faire car le views contiennt bien un champs datetime.

    Merci d'avance pour tes effforts

  14. #14
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    Salut,

    t'aider d'accord, peut-être pas faire le travail à ta place

    Premièrement : as-tu regardé les options de Query Analyser ? Comme je j'ai dit, il n'y a pas de timeout du côté du serveur, donc ça vient du client.

    Je pensais à une clé parce qu'il y en a souvent... Y a-t-il des colonnes numériques autoincrémentales dans les tables sous-jacentes à tes vues ? Si oui, tu peux te baser sur le code déjà posté. Il est plus pratique parce que tu contournes plus facilement les problèmes de doublon en faisant des BETWEEN pour les dates.

  15. #15
    Membre régulier
    Inscrit en
    Janvier 2004
    Messages
    309
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 309
    Points : 91
    Points
    91
    Par défaut
    Merci pour ta reponse,

    Je n'ai pas de colonne autoincrement et j'ai verifié les options tout est à zero
    Donc le problem ne vient pas de là.

    Je sais que je dois faire les insertions en etappes car les tables sont grosses.

    Je veux peut etre savoir en me basant sur la date comment faire pour excecuter la requete en etappes.

    Merci d'avance

  16. #16
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    voici en exemple (et non testé, à vérifier que tout se passe bien), de code pour partitionner l'insert par date (ici par semaine) :

    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 @rowcount int, @data datetime
     
    SET @rowcount = 1
    SELECT @date = MIN(madate) FROM db1.dbo.view1
    SET @date = SELECT CAST(FLOOR(CAST(@date AS FLOAT)) AS DATETIME)
     
    WHILE @rowcount > 0 BEGIN
     
    	INSERT INTO db4.dbo.Tb_Result (macle, 1, colonne1, colonne2, colonne3)
    	SELECT macle, source, colonne1, colonne2, colonne3 FROM db1.dbo.view1
    	WHERE madate BETWEEN @date AND DATEADD(millisecond, 604799996, @date)
    	-- 604799996 = 6 jours + 23:59:59:997
     
    	SET @date = DATEADD(day, 7, @date)
    	SET @rowcount = @@ROWCOUNT
     
    END -- WHILE

  17. #17
    Membre régulier
    Inscrit en
    Janvier 2004
    Messages
    309
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 309
    Points : 91
    Points
    91
    Par défaut
    Merci Rudib et tous ceux qui ont pris le temps de lire mes posts

    Merci Rudib encore une fois parce que ca marche tres bien..
    J'ai vriament bien appris de toi..

    J'attends que lise avant de mettre [Resolu]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [COUNT] select ... from ... where count !
    Par tmcgrady dans le forum Langage SQL
    Réponses: 5
    Dernier message: 30/11/2007, 17h29
  2. SELECT * FROM (Transform...pivot...)... ???
    Par davidso dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 20/01/2006, 18h04
  3. Réponses: 5
    Dernier message: 31/10/2005, 13h25
  4. un SELECT FROM ????
    Par tarik75 dans le forum Langage SQL
    Réponses: 18
    Dernier message: 17/07/2005, 12h04
  5. Equivalent du Select * from ::Fn_Fonction()
    Par WOLO Laurent dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 09/07/2004, 09h48

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