Where in XML

Where in XML - SQL/NoSQL - Programmation

Marsh Posté le 01-08-2008 à 15:21:27    

Bonjour,
Voila j'essaie de faire une requête de recherche assez poussé sur du SQL Server 2005 (crosoft)
Le soucis c'est que mon where est pas encore tout a fait au point :

Code :
  1. WHERE
  2.    (
  3.    (
  4.  (AMC.MotCleId in
  5.   (SELECT ParamValues.MotCleId.value('.','VARCHAR(50)')
  6.    FROM @Params.nodes('/root/MotsCles/MotCleId') as ParamValues(MotCleId)))
  7.    OR ((@Params IS NULL)
  8.    OR (@@ROWCOUNT = 0))
  9. )
  10. AND
  11. (...[dautre requete pareil])
  12. ))


 
Et le soucis c'est que j'ai mon OR params ou rowcount qui se tick a chaque fois lorsque je passe les attribut XML concerné.
Mon probleme est que Si le select FROM xml est vide ca ne bloque pas la suite ( du coup que ca ne fasse pas le IN en faite )
Voila j'espere avoir etait suffisament conci

Reply

Marsh Posté le 01-08-2008 à 15:21:27   

Reply

Marsh Posté le 01-08-2008 à 15:39:32    

euh... un peu trop même.
 
j'ai un mal de chien à tenter de comprendre :
 
1/ ce que tu veux faire
2/ ce qu'il se passe
 
grossomodo :
 

Code :
  1. SELECT *
  2. FROM x
  3. WHERE
  4. (
  5.  motcleid IN
  6.  (
  7.    SELECT id FROM something
  8.  )
  9.  OR
  10.  (
  11.    params IS NULL
  12.    OR rowcount = 0
  13.   )
  14. )
  15. AND someothertest


 
d'après l'indentation (complètement surréaliste) de tes parenthèses, c'est ce que je comprends.
 
donc là, le AND de la fin est toujours évalué.
par contre le IN n'est bloquant que si ni param is null et ni rowcount = 0
 
déjà, les () autour d'un OR, ça sert à rien quand il est précédé d'un autre OR.
 
bon, toi, tu veux que ça fasse quoi ? (parceque ta phrase "mon problème est que ..." est parfaitement imbittable, encore plus que tes parenthèses imbriquées :o)


Message édité par MagicBuzz le 01-08-2008 à 15:40:50
Reply

Marsh Posté le 01-08-2008 à 15:43:29    

Ah oué bon dsl
Donc en faite je balance en parametre un truk XML qui ressemble a ca <root><MotsCles><MotCleId>1</MotCleId></MotsCles></root>
et je ve tester si dans mon select * from article AS A WHERE A.MotCleId is in (SELECT * FROM XML) MAIS UNIQUEMENT si mon select from XML n'est pas vide...
D'ou le test du rowcount = 0 savoir si mon select retourne bien quelque chose.


Message édité par korben31 le 01-08-2008 à 16:12:33
Reply

Marsh Posté le 01-08-2008 à 15:53:51    

or (SELECT count(*) FROM @Params.nodes('/root/MotsCles/MotCleId')) = 0
 
ça serait pas plus propre ?

Reply

Marsh Posté le 01-08-2008 à 15:54:58    

(éventuellement, @params.nodes étant un nodelist, regarde dans la doc si peux pas pas faire un truc genre @params.nodes.count = 0 qui sera encore plus propre)


Message édité par MagicBuzz le 01-08-2008 à 15:55:26
Reply

Marsh Posté le 01-08-2008 à 16:12:42    

Yes merci, bon pour le Count j'ai pas trouver de sujet sur google,
ensuite faut rajouter un AS sinon il veux pas  
Voila j'ai finit ma requete de 120 lignes :p
Je te remercie pour ton aide

Reply

Marsh Posté le 04-08-2008 à 17:14:52    

Sinon je voulais savoir niveau perf ce que vaux cette technique ?
Parce que je monte vite a 2sec ( 4 types en xml )
et je ne peut pas me le permettre ( 0.5sec a tout cassé )
 
par exemple faire un in @texte avec des spectateur ? et pas in @XML
genre je passe @texte = 3 4 5 6  
et regarder si l'id et dans ma chaine de caractère ? est ce que ca prendrai pas moins de temps et est ce faisable ?


Message édité par korben31 le 04-08-2008 à 17:46:04
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed