Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
963 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  SQl Server variable type text , ntext

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

SQl Server variable type text , ntext

n°1144756
madkane
Posté le 09-07-2005 à 00:33:18  profilanswer
 

Bonjour tous le monde,
je vous soumet un petit problème SQl, que je rencontre actuellement.
J'ai une variable de type text qui doit recevoir une phrase assez longue.
Je n'ai pas utiliser de VARCHAR(80000) car je les dépasse largement.
Le problème du type text c'est qu'on ne peut pas les définr en global.  
Il faut définir la variable dans une table comme :
 
CREATE TABLE TABLEAU(
      chaine TEXT
)
 
CREATE TABLE2 TABLEAU(
      chaine2 TEXT
)
 
Le souci c'est que j'ai besoin de concatener 2 chaines et je crois qu'il est impossible de 'SETter' ce type (trop grand)
 
Ce que je veux si je n'ai pas été assez claire.
 
SET chaine = 'a'
SET chaine2 = 'b'
 
Je veux obtenir 'ab'
 
Merci

mood
Publicité
Posté le 09-07-2005 à 00:33:18  profilanswer
 

n°1146389
Arjuna
Aircraft Ident.: F-MBSD
Posté le 11-07-2005 à 14:42:02  profilanswer
 

hmpf, ça me semble pas gagné en effet...
 
faudra que je regarde s'il y a une solution, à l'occasion. là j'ai pas le temps :D

n°1146452
Arjuna
Aircraft Ident.: F-MBSD
Posté le 11-07-2005 à 15:15:30  profilanswer
 

Pffff...
 
A première vue, ça a l'air simple, mais quand on essaie de faire de façon automatisée, ça se complique...
 
Regarde à partie de là (aide de SQL Server)
 
Notes
Les fonctions et instructions suivantes peuvent être utilisées avec des données de type NText, text ou image.
 
Fonctions Instructions  
DATALENGTH READTEXT  
PATINDEX SET TEXTSIZE  
SUBSTRING UPDATETEXT  
TEXTPTR WRITETEXT  
TEXTVALID    
 
 
 
Seul souci, c'est que le READTEXT ne semble pas permettre d'écrire dans une variable.
Deplus, UPDATETEXT ne permet pas de faire une sous-requête à la place de la constante attendue.
 
A partir de là, je n'arrive pas à faire la concaténation directement à partir des données de la base :/

n°1146483
Arjuna
Aircraft Ident.: F-MBSD
Posté le 11-07-2005 à 15:24:02  profilanswer
 

En gros, au final, ça devrait ressembler à ça, mais je suis bloqué au niveau du READTEXT qui ne veux pas se mettre dans une variable...
 

Code :
  1. create table testtext (id int not null, val text not null)
  2. go
  3. -- On crée les deux lignes à concaténer
  4. insert into testtext (id, val) values (1, 'toto')
  5. insert into testtext (id, val) values (2, 'titi')
  6. -- On crée la ligne dans laquelle on va concaténer la chaîne 1 et la chaîne 2
  7. insert into testtext (id, val) values (3, '')
  8. declare @strCur int
  9. declare @strLen1 int
  10. declare @strLen2 int
  11. DECLARE @ptrRead binary(16)
  12. SELECT @ptrRead = TEXTPTR(val)
  13.    FROM testtext
  14.       WHERE id = 1
  15. DECLARE @ptrWrite binary(16)
  16. SELECT @ptrWrite = TEXTPTR(val)
  17.    FROM testtext
  18.       WHERE id = 3
  19. select @strLen1 = DATALENGTH(val) from testtext where id = 1
  20. set @strCur = 0
  21. while @strCur < @strLen1
  22. begin
  23. -- Faut mettre cette merde dans une variable
  24. READTEXT testtext.val @ptrRead @strCur 1
  25. -- Et la mettre à la place de "@@@@truc@@@@"
  26. updatetext testtext.val @ptrWrite @strCur 0 @@@@truc@@@@
  27. -- Et après, faudra optimiser pour lire des blocs plus gros que 1 caractère à la fois ;)
  28. set @strCur = @strCur + 1
  29. end
  30. SELECT @ptrRead = TEXTPTR(val)
  31.    FROM testtext
  32.       WHERE id = 2
  33. select @strLen2 = DATALENGTH(val) from testtext where id = 1
  34. while @strCur < @strLen1 + @strLen2
  35. begin
  36. -- Faut mettre cette merde dans une variable
  37. READTEXT testtext.val @ptrRead @strCur 1
  38. -- Et la mettre à la place de "@@@@truc@@@@"
  39. updatetext testtext.val @ptrWrite @strCur 0 @@@@truc@@@@
  40. -- Et après, faudra optimiser pour lire des blocs plus gros que 1 caractère à la fois ;)
  41. set @strCur = @strCur + 1
  42. end
  43. select *
  44. from testtext

n°1146520
Arjuna
Aircraft Ident.: F-MBSD
Posté le 11-07-2005 à 15:31:42  profilanswer
 

Groumpf !
 
Essaie de comprendre cette usine à gaz, je te laisse comprendre pourquoi les énormités qui sont dedans... Et surtout, je te laisse te prendre la tête pour tout optimiser, parceque là ça fait peur :D
 

Code :
  1. drop table testtext
  2. go
  3. create table testtext (id int not null, val text not null)
  4. go
  5. -- On crée les deux lignes à concaténer
  6. insert into testtext (id, val) values (1, 'toto')
  7. insert into testtext (id, val) values (2, 'titi')
  8. -- On crée la ligne dans laquelle on va concaténer la chaîne 1 et la chaîne 2
  9. insert into testtext (id, val) values (3, space(99999999))
  10. declare @strCur int
  11. declare @strLen1 int
  12. declare @strLen2 int
  13. declare @truc as varchar(1)
  14. DECLARE @ptrRead binary(16)
  15. SELECT @ptrRead = TEXTPTR(val)
  16.    FROM testtext
  17.       WHERE id = 1
  18. DECLARE @ptrWrite binary(16)
  19. SELECT @ptrWrite = TEXTPTR(val)
  20.    FROM testtext
  21.       WHERE id = 3
  22. select @strLen1 = DATALENGTH(val) from testtext where id = 1
  23. set @strCur = 0
  24. while @strCur < @strLen1
  25. begin
  26. -- Faut mettre cette merde dans une variable
  27. select @truc = substring(val, @strCur + 1, 1) from testtext where id = 1
  28. -- Et la mettre à la place de "@@@@truc@@@@"
  29. updatetext testtext.val @ptrWrite @strCur 0 @truc
  30. -- Et après, faudra optimiser pour lire des blocs plus gros que 1 caractère à la fois ;)
  31. set @strCur = @strCur + 1
  32. end
  33. SELECT @ptrRead = TEXTPTR(val)
  34.    FROM testtext
  35.       WHERE id = 2
  36. select @strLen2 = DATALENGTH(val) from testtext where id = 1
  37. while @strCur < @strLen1 + @strLen2
  38. begin
  39. -- Faut mettre cette merde dans une variable
  40. select @truc = substring(val, @strCur + 1 - @strLen1, 1) from testtext where id = 2
  41. -- Et la mettre à la place de "@@@@truc@@@@"
  42. updatetext testtext.val @ptrWrite @strCur 0 @truc
  43. -- Et après, faudra optimiser pour lire des blocs plus gros que 1 caractère à la fois ;)
  44. set @strCur = @strCur + 1
  45. end
  46. select *
  47. from testtext


 
En tout cas, CA MARCHE !!!!
 

Code :
  1. (1 ligne(s) affectée(s))
  2. (1 ligne(s) affectée(s))
  3. (1 ligne(s) affectée(s))
  4. id          val                                                                                                                                                                                                                                                             
  5. ----------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  6. 1           toto
  7. 2           titi
  8. 3           tototiti                                                                                                                                                                                                                                                       
  9. (3 ligne(s) affectée(s))

n°1148079
madkane
Posté le 12-07-2005 à 15:58:56  profilanswer
 

Merci à toi Arjuna,
j'ai lu et je vais peux être me servir de ta solution si mes tests exploses pour l'instant je te donne la solution que j'ai trouvé. (Text, NTEXT et IMAGe c'est de la merde en barre, la plupart des fonctions ont un buffer limiter et n'accepte pas ces types)
 
j'ai trouvé une solution qui me permet de réussir la concaténation.
J'ai lu la documentation SQlServer à ce sujet juste après avoir trouvé une solution.
Il faut que je te dise l'ensemble de mon projet.
Je dois créer un fichier Xml qui se compos d'une partie fixe:
Partie 1
--------
<releve>
 <.....>
 Blabla
 </.....>
</releve>
 
et l'autre variable:
Partie2
-------
<convive>
 <enfant1>
  <....>  
  </....>
 <enfant1>
 <enfant2>
  <....>  
  </....>
 <enfant2>
</convive>
 
Je récupère ces 2 parties à partir d'un FOR XML EXPLIT, donc je ne peux pas prédire le nombre caractères en sortie mais je sais que je vais dépassé les 8000.
 
Le but de la concaténation était d'obtenir :
 
<releve>
  <enfant1>
  <....>  
  </....>
 <enfant1>
 <enfant2>
  <....>  
  </....>
 <enfant2>
</convive>
 <.....>
 Blabla
 </.....>
</releve>
 
Donc ce que j'ai fait c'est que j'ai coup' grâce à la fonction LEFT la partie fixe en 2.
J'ai fait un INSERT-SELECT de la partie Partie 2 et je fais un insert à nouveau de la fin de la partie 1.
Ca marche à condition que la partie 1 ne dépasse pas 16000 caractères. Le souci c'est que c'est un bordel car les variables de type text sont stocké sur plusieurs lignes.
 
@+

n°1148150
Arjuna
Aircraft Ident.: F-MBSD
Posté le 12-07-2005 à 16:32:06  profilanswer
 

Hmmm... Ca reste pas très clair pour moi :D
 
En gros... Tu as une "partie 2" générée à partir de :
 
select ... from ... where ... for xml auto
 
OK, jusque là, pas de problème.
 
Le résultat, tu le récupères comment ? Tu le met où ?
 
Ensuite, ta "partie 1", elle vient d'où ? C'est fixe dans ton programme ? Stocké dans une table ? Récupéré comme "partie 2" ?
 
En tout cas, j'ai bien envie de jouer un peu avec ce problème là, ça peut toujours servir :)
 
 
PS: Sinon, truc sympa...
Tu sais qu'avec une PS SQL Server, tu peux instancier une DLL et jouer avec ?
Du coup, tu pourrais sans problème instancier un objet DOM, faire tes bidouilles avec à coup de AddNode(), puis enrefisrter le résultat final à l'aide de la propriété .text

n°1149042
madkane
Posté le 13-07-2005 à 14:04:36  profilanswer
 

Je vais essayer d'éclaircir au mieux.
J'utilise FOR XML EXPLICIT pour récupérer les informations de la base de données et former mon fichier XML.
Le résultat est une string en sortie.
J'utilise FOR XML EXPLICIT 2 fois (Tous se fait dans une seule procédure).
 
Le problème c'est que le select affiche le résultat mais celui-ci est stocké nulle part.
J'utilise OPENROWSET qui me renvoit le résultat de mon select que je veux stocker dans une variable.
Le problème c'est que le résultat renvoyé dépasse la capacité de la mémoire virtuel 8000.
Donc j'utilise une variable TEXT qui ne peut être que défini dans une table.
 
Je fais:
CREATE TABLE TEMP(
 cle INT IDENTITY,
 partie1 TEXT
)
 
INSERT INTO TEMP(partie1)(SELECT OP)
OP : OP est la string renvoyé par OPENROWSET  
 
Arjuna: Le résultat, tu le récupères comment ? Tu le mets où ?  
 
Là le résultat est directement dans ma table TEMP, voila une partie du code
 
Code :
 
insert into TEMP (partie1)  
SELECT a.[XML_F52E2B61-18A1-11d1-B105-00805F49916B]
FROM OPENROWSET('MSDASQL',
       'DRIVER={SQL Server};
 SERVER=SI-REG-ETUDES\SQL_AGORA;UID=agora;PWD=agora',
       'SELECT 1 AS Tag,  
 NULL AS Parent,
 NULL AS [racine!1!]
 .....
        UNION
 SELECT 2 AS
 ....
 FOR XML EXPLICIT')as a
 
La j'ai récupérer ma partie 1, la partie 2 je la récupére de la même manière que la partie 1.
 
Maintenant je les concatènes:
j'ai 2 tables avec chacune une string de plus de 800 caractères.
 
 
TABLE 1: Le drapeau de couleur est suspendu en haut de l'immeuble
 
TABLE 2: rouge, vert, bleu  
 
La table 2 peux grandir en fonction des éléments dans la base de données, je peux avoir juste rouge
 
je veux au final : Le drapeau de couleur rouge, vert, bleu est suspendu en haut de l'immeuble
 
Donc il faut utiliser la commande LEFT (SQL) qui va récupérer: Le drapeau de couleur
La commande RIGHT va récupérer : est suspendu en haut de l'immeuble
 
DAns une table final qui contiendra le résultat final je stocke la partie LEFT et j'insère les éléments de la table 2 puis j'insère la partie RIGHT.
 
Il faut se méfier LEFT et RIGHT, car il ne fonction pas sur des variable de type TEXT sans astuce
et le résultat est directement dans la table.
 
Au final la commande bcp me permet de mettre le résultat dans un fichier.
 
Voila, si tu as des questions no problem
 
@+

n°1149176
Arjuna
Aircraft Ident.: F-MBSD
Posté le 13-07-2005 à 15:34:22  profilanswer
 

OK, je regarde ça :)
 
Sinon, tu viens de me faire découvrir "openrowset()", comment c'est trop terrible ce truc !
 

Code :
  1. select *
  2. from
  3. tsttbl,
  4. openrowset('MSDASQL', 'dsn=test2', 'select * from [page$]') a,
  5. openrowset('MSDASQL', 'dsn=test', 'select * from test') b
  6. where cast(a.f1 as numeric) = tsttbl.id
  7. and b.id = tsttbl.id


 
Et hop ! Je fais une jointure entre une table SQL Server, une table Access et une page Excel :pt1cable:

n°1149209
Arjuna
Aircraft Ident.: F-MBSD
Posté le 13-07-2005 à 16:01:10  profilanswer
 

Bon, ben ça fait grossomodo ce que tu veux :)
 

Code :
  1. drop procedure test
  2. go
  3. drop function partie1
  4. go
  5. drop function partie2
  6. go
  7. drop table table1
  8. go
  9. drop table table2
  10. go
  11. create table table1 (id numeric not null, val varchar(500))
  12. go
  13. create table table2 (id numeric not null, val varchar(50))
  14. go
  15. create function partie1()
  16. returns table
  17. as
  18. return (select [XML_F52E2B61-18A1-11d1-B105-00805F49916B] val from openrowset('MSDASQL', 'DRIVER={SQL Server};SERVER=localhost;UID=sa;PWD=pdta;database=tstdb', 'select val from table1 for xml auto') tmp)
  19. go
  20. create function partie2()
  21. returns table
  22. as
  23. return (select [XML_F52E2B61-18A1-11d1-B105-00805F49916B] val from openrowset('MSDASQL', 'DRIVER={SQL Server};SERVER=localhost;UID=sa;PWD=pdta;database=tstdb', 'select val from table2 for xml auto') tmp)
  24. go
  25. create procedure test
  26. as
  27. create table #prout (id numeric, val text)
  28. insert into #prout (id, val) (select 1, val from partie1())
  29. insert into #prout (id, val) (select 2, val from partie2())
  30. insert into #prout (id, val) (select 3, space(999999999))
  31. declare @strCur int
  32. declare @strCur2 int
  33. declare @strLen1 int
  34. declare @strLen2 int
  35. declare @truc as varchar(1)
  36. DECLARE @ptrRead binary(16)
  37. SELECT @ptrRead = TEXTPTR(val)
  38.    FROM #prout
  39.       WHERE id = 1
  40. DECLARE @ptrWrite binary(16)
  41. SELECT @ptrWrite = TEXTPTR(val)
  42.    FROM #prout
  43.       WHERE id = 3
  44. select @strLen1 = DATALENGTH(val) from #prout where id = 1
  45. set @strCur = 0
  46. while @strCur < @strLen1
  47. begin
  48.     -- Faut mettre cette merde dans une variable
  49.     select @truc = substring(val, @strCur + 1, 1) from #prout where id = 1
  50.     -- Et la mettre à la place de "@@@@truc@@@@"
  51.     updatetext #prout.val @ptrWrite @strCur 0 @truc
  52.     -- Et après, faudra optimiser pour lire des blocs plus gros que 1 caractère à la fois ;)
  53.     set @strCur = @strCur + 1
  54. end
  55. SELECT @ptrRead = TEXTPTR(val)
  56.    FROM #prout
  57.       WHERE id = 2
  58. select @strLen2 = DATALENGTH(val) from #prout where id = 1
  59. set @strCur2 = @strCur - 42
  60. while @strCur < @strLen1 + @strLen2
  61. begin
  62.     -- Faut mettre cette merde dans une variable
  63.     select @truc = substring(val, @strCur + 1 - @strLen1, 1) from #prout where id = 2
  64.     -- Et la mettre à la place de "@@@@truc@@@@"
  65.     updatetext #prout.val @ptrWrite @strCur2 0 @truc
  66.     -- Et après, faudra optimiser pour lire des blocs plus gros que 1 caractère à la fois ;)
  67.     set @strCur = @strCur + 1
  68.     set @strCur2 = @strCur2 + 1
  69. end
  70. select *
  71. from #prout
  72. drop table #prout
  73. go
  74. insert into table1 (id, val) values (1, 'Le drapeau de couleur est suspendu en haut de l''immeuble')
  75. insert into table2 (id, val) values (1, 'Rouge')
  76. insert into table2 (id, val) values (2, 'Vert')
  77. insert into table2 (id, val) values (3, 'Bleu')
  78. exec test


 
Sortie :
 

Code :
  1. (1 ligne(s) affectée(s))
  2. (1 ligne(s) affectée(s))
  3. (1 ligne(s) affectée(s))
  4. (1 ligne(s) affectée(s))
  5. (1 ligne(s) affectée(s))
  6. (1 ligne(s) affectée(s))
  7. (1 ligne(s) affectée(s))
  8. id                   val                                                                                                                                                                                                                                                             
  9. -------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  10. 1                    <table1 val="Le drapeau de couleur est suspendu en haut de l&apos;immeuble"/>
  11. 2                    <table2 val="Rouge"/><table2 val="Vert"/><table2 val="Bleu"/>
  12. 3                    <table1 val="Le drapeau de couleur <table2 val="Rouge"/><table2 val="Vert"/><table2 val="Bleu"/>est suspendu en haut de l&apos;immeuble"/>                                                                                                                     
  13. (3 ligne(s) affectée(s))

mood
Publicité
Posté le 13-07-2005 à 16:01:10  profilanswer
 

n°1149694
madkane
Posté le 14-07-2005 à 00:40:11  profilanswer
 

Oui j'arrive à obtenir le même résultat que toi pour optimiser tu peux mettre ta table #prout
 en autoincrement comme ça à l'insertion tu ne te soucie plus de l'id.
Tu utilise un pointeur de TEXT, moi non car lorsque tu mets des variables de plus de 8000 dans une base de donnée par défaut, il te met 2033 caractères  
sur la première ligne avec 1 comme repère et les restes tous les 2033.
 
Donc tu as :
#prout
______
id chaine
1  blablaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa jusqu'à 2033
2  blablaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa jusqu'à 2033
 
etc.
Donc je fais un WHILE avec une recherche du mot couleur dès que je le trouve je casse la boucle
et je retiens l'indice de boucle.
Dans mon texte je sais que le mot je vais le touvé sur la première ligne mais on sait jamais donc c'est un test qui normalement va s'arrêter
sur la première ligne.
 
L'auto incrément t'evite la numérotation
J'avoue que tes variables me déstabilise mais tu fais 3 insert pour les couleurs alors que c'est une string qui contient les 3 mots.
Losrque tu fais SELECT COULEUR FROM tableCouleur tu obtiens  
'Rouge, Vert' par exemple donc un select suffit
Voila du code:
 
@v_nbCaractere : nombre de caractères de la partie gauche
 
-- Partie Gauche
 
INSERT INTO table3(phraseFinale) SELECT LEFT(CONVERT(VARCHAR(8000), partie1), @v_nbCaractere-1) AS Gauche
           FROM TABLE1
           WHERE idpartie1 = 1 (a optimiser)
 
 
--Partie 2
INSERT INTO table3(phraseFinale) SELECT partie2 FROM ..partie2
Cette partie peut faire 1600 caractères je ne vais jamais la SET
 
 
-- 2033 est la taille maximal d'une ligne
-- Le debut de la partie de gauche tient sur la première ligne
SET @v_fin = (2033-@v_nbCaractere+1)  
 
 
--Partie Droite
 
SELECT RIGHT(CONVERT(VARCHAR(8000), partie1),@v_fin)AS Droite
FROM TABLE1
 
 
INSERT INTO table3(phraseFinale)  SELECT RIGHT(CONVERT(VARCHAR(8000), partie1),@v_fin)AS Droite
            FROM TABLE1
 
SELECT phraseFinale FROM table3
 
 
Je veux juste ajouter que tu dois te méfier de OPENROWSET() car c'est pas pratique lorsque tu mets un long select dans ta query,
si il y a un bug il ne te dira pas où.
Comme la query est une string pas question de faire un Where ID = @variable dedans, il n'accepte pas
L'astuce que j'ai trouvé est de mettre @variable dans une table.
Attention OPENROWSET() n'accepte pas les select sur mes tables temporaires    
 
Pour les varibles text la plupart des trucs que tu peux faire sur des varchar ne sont pas accepter
 
 

n°1149703
Arjuna
Aircraft Ident.: F-MBSD
Posté le 14-07-2005 à 00:51:40  profilanswer
 

pour le openrowset(), je ne tiens pas à l'utiliser pour faire des requêtes de SQL Server à SQL Server : il y a déjà tout ce qu'il faut de base.
 
mais pour aller lire dans des autres bases hétéroclites, ça rox carrément.
 
sinon, une solution simple au "where id = @id" c'est de faire :
 
set @query = 'select truc from latable where id = ' + @id
et d'utiliser ensuite la variable @query :)

n°1149710
Arjuna
Aircraft Ident.: F-MBSD
Posté le 14-07-2005 à 01:01:30  profilanswer
 

en fait, le openrowset semble super utile dans des cas spécifiques du genre :
 
-> j'ai un PABX qui s'interface avec un soft. Ce dernier sort des logs au format CSV sous la forme :
 
numéro_de_téléphone;poste_interne;durée
 
Chaque fichier CSV correspond à une journée. Il peut faire mettons 10 000 lignes.
 
Afin de ne pas surcharger inutilement la base, parceque je ne m'en sers pas tous les jours, je préfère garder les logs sous ce format, plutôt que recopier dans la base de données.
 
Par contre, lorsqu'une personne du call center reçoit un numéro de téléphone, je dois lui afficher le nombre de fois que ce numéro a déjà appelé, et quels sont les agents qui ont répondu, et ce, sur 7 jours d'historique.
 
Ainsi, je peux faire :
 

Code :
  1. declare @numeroTel varchar(10)
  2. set @numeroTel = '0123456789'
  3. declare @query varchar(8000)
  4. set @query = 'select posteInterne, duree from fichier where numeroTel = ''' + @numeroTel + ''''
  5. select jour, agent, duree
  6. from
  7. (
  8.    select convert(char(10), dateadd(d, getDate(), -6), 103) jour, a.agent, f.duree
  9.    from agent a, openrowset('driver CSV', 'c:\logs\' + convert(char(10), dateadd(d, getDate(), -6), 103) + '.csv', @query) f
  10.    where a.poste = f.posteInterne
  11.    union
  12.    ...
  13. )


 
=> Ca, franchement, c'est terrible !

n°1149832
madkane
Posté le 14-07-2005 à 11:42:16  profilanswer
 

Bonjour,
je ne sais pas encore ce qu'est un PABX qui s'interface avec un soft.
Et quel est la particularité du format CSV.
J'ai bien saisi que tu veux garder les logs en mettant les résultats du SELECT dans un fichier LOG sous c:\logs\
C'est de la balle comme ca tu évite de surcharger la base de données.J'ai pas compris comment tu sauvergardetes données dans ton dossier log et est-ce que OPENROWSET() te renvoie bien une table.
 
Cette partie tu va s devoir me l'expliquer:
Par contre, lorsqu'une personne du call center reçoit un numéro de téléphone, je dois lui afficher le nombre de fois que ce numéro a déjà appelé, et quels sont les agents qui ont répondu, et ce, sur 7 jours d'historique.

n°1152118
Arjuna
Aircraft Ident.: F-MBSD
Posté le 18-07-2005 à 00:17:43  profilanswer
 

-> un PABX, c'est un équipement téléphonique, un standard sans hôtesse si tu préfères : X postes sont reliés à un seul numéro de téléphone externe, et ce dernier s'occupe de relayer plusieurs appels simultanés de la même ligne sur des postes différents. ils disposent la plupart du temps d'une interface RS232 qui permet de suivre en temps réel, sur un ordinateur, l'activité des appels.
 
=> dans le cas que je donne en exemple, le PABX est relié à un serveur, dont le drivers écrit simplement des logs au fichier CSV au fur et à mesure des appels.
 
Le CSV n'a rien de particulier, pas plus que le TSV, les fichiers à pas fixe, ou n'importe quel autre format de transfert (XML, etc.) Il est seulement le plus répendu, donc le plus probable. Il se traduit par un fichier texte formatté en colonnes, dont les valeurs sont séparées par des virgules (CSV = Coma Separated Values), et donc très facile à lire, sans perte de place contrairement au XML ou les fichiers à pas fixe.
 
Esuite, dans mon exemple, plutôt que d'attendre la fin de la journée que le log soit terminé, pour le recopier dans une base de données, je veux pouvoir faire des statistiques "en temps réel" sur ses données, tout en les liant à des données de ma base.
 
OpenRowSet retourne sous la forme d'une table temporaire le résultat d'une requête de type sélection, se basant non pas sur une table de SQL Server, mais un lien OLE DB, c'est à dire que depuis une requête SQL Server, on peut faire une requête portant sur des tables de différents SGBD, ou directement lire certains formats courants, tels que le CSV, le format Excel ou autres.
 
Donc dans mon exemple, si je veux récupérer des informations du PABX portant sur les 7 derniers jours, je fais simplement un gros UNION portant sur des OPENROWSET qui ouvre les logs des 7 derniers jours.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  SQl Server variable type text , ntext

 

Sujets relatifs
SQL Server 2000 : Stats sur l'utilisation des index ?problème avec code d'un menu horizontal type slider
Variable globale d'une page à une autreProblème d'incompatibilité de type (erreur 13)
Récupération de variable à partir d'un fichier .txtacceder a sql server 2005 depuis une machine!
sauvegarde de la abse de données sql server 2000Récupérer variable créée dynamiquement
lire un fichier text ou autre avec javascript 
Plus de sujets relatifs à : SQl Server variable type text , ntext


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR