problème T-SQL

problème T-SQL - SQL/NoSQL - Programmation

Marsh Posté le 02-03-2006 à 09:50:25    

Bonjour,
j'ai un probleme avec  cette requete :
 
declare @requete varchar(100)
declare @resultat varchar(100)
declare @table varchar(10)
 
set @table = 'matable.monchamps'
 
set @resultat =(select count(*) from @table)
 
print(@resultat)
 
 
--> résultat: La variable '@table' doit être déclarée.
 
si je met 'from matable.monchamps' au lieu de 'from @table' ca marche,  
@resultat recoit bien le resultat du count(*)
 
Comment je peux faire pour utiliser @table ?
 
merci
 
 

Reply

Marsh Posté le 02-03-2006 à 09:50:25   

Reply

Marsh Posté le 02-03-2006 à 12:22:43    

Tu es sûr que ca fonctionne avec 'select count(*) from matable.monchamps' ? ;)
 
declare @resultat varchar(100)  
declare @table varchar(10)  
declare @champs varchar(10)
 
set @table = 'matable'
set @champs = 'monchamps'
 
set @resultat =(select count(@champs) from @table)  
 
print(@resultat)

Reply

Marsh Posté le 02-03-2006 à 14:11:44    

ben dans l'exemple je donne pas le nom réel de la table et du champs
 
une idée pour mon probleme ?

Reply

Marsh Posté le 02-03-2006 à 14:36:16    

J'avais bien compris que ce n'était pas le nom réel.  
 
Si tu fais un count(*) sur une table en lui indiquant ensuite le nom du champs à compter ça revient à faire un count(nomduchamps) dans une table ? ou alors j'ai oublié un bout de cerveau en me levant ce matin ? :)  
 
L'exemple donné dans mon post au dessus doit être bon non ?

Reply

Marsh Posté le 02-03-2006 à 14:54:38    

oui ca revient quelque part a faire un count(nomduchamps) sauf qu'avec le count(*) le * permet de pas avoir a preciser un champs particulier
 
mais ca marche toujours pas mee avec ton exemple.
 
En fait il faudra que  
le script SQL lise la chaine de la requete avec la variables @table incluse,
puis l'executer
puis récupérer le résultat du count() dans la variables @resultat
 
ca doit pourtant pas bien etre compliqué normalement .....
 

Reply

Marsh Posté le 02-03-2006 à 15:34:36    

Euh je ne comprends pas...  
 
Dans ton exemple tu donne :  
 
set @table = 'matable.monchamps'  puis la tu indique que tu fais un count(*) pour ne pas avoir a préciser le nom d'un champs donc à quoi correspond 'monchamps' dans ton exemple ?  
 
Si tu fais ça :  
 
declare @resultat varchar(100)  
declare @table varchar(10)  
declare @champs varchar(10)  
   
set @table = 'matable'  
set @champs = 'monchamps'  
   
set @resultat =(select count(@champs) from @table)  
   
print(@resultat)  
 
qui revient à faire : Select count(*) from matable  
 
Ca fonctionne très bien... Mais je ne dois pas comprendre ce que tu cherches à faire :/

Reply

Marsh Posté le 02-03-2006 à 15:50:24    

j'ai compris ce que tu voulais dire.
Mon exemple est pourri. j'ai oublié d'enlever '.monchamps' qui n'a rien a faire ici.
 
Voici les 2 choses que je cherche a faire :
 
1 - créer une requete count(*) sur un nom de table inclus dans une variable  
 
exemple:
 
set @table = 'matable'
set @requete = (select count(*) from @table)
 
2 - récupérer le résultat du count(*) dans une variable @resultat

Reply

Marsh Posté le 10-03-2006 à 11:51:25    

Ah mais oui je suis bête :/
 
Tu ne peux pas passer un nom de table dans une variable en Transact...
 
C'est un peu plus complexe ce que tu veux faire. Il faut écrire une Procédure stockée qui te permettra de mettre le nom de la table en variable.

Reply

Marsh Posté le 10-03-2006 à 12:16:23    

oué ben finalement j'ai utilisé une table #temporaire pour faire intermediaire entre le resultat de requete et la variable d'affectation
 
concernant le nom de table, c pourtant en theorie de programmation une operation super simple( concatenation de chaines)
mais je vois que le Transact SQL c de la prog SQL sous certains aspects, mais qui connait certaines limites (dont acte)

Reply

Marsh Posté le 10-03-2006 à 12:16:35    

merci pour ta solution

Reply

Marsh Posté le 10-03-2006 à 12:16:35   

Reply

Marsh Posté le 10-03-2006 à 15:36:03    

declare @query as varchar(8000)
declare @resultat as numeric
 
set @query = 'select @resultat = count(*) from ' + @table
execute(@query)
print(@resultat)

Reply

Marsh Posté le 10-03-2006 à 15:44:20    

justement ce script que tu nous montre Arjuna,  
je l'ai deja testé et il marche pas
meci quand meme d'avoir essayé
 
en fait execute() exécute une requete en dynamique sans tenir compte du reste du script
 
Voici le message que je recois et qui le confirme :
"La variable '@resultat' doit être déclarée."

Reply

Marsh Posté le 10-03-2006 à 15:47:47    

:heink:
 
moi ça a toujours marché...
 
vais faire le test, ça a intérêt à pas marcher :o

Reply

Marsh Posté le 10-03-2006 à 15:51:52    

Resolved en un quart de pouillème de seconde :o
 
Faut chercher un peu, et ne pas hésiter à être goret, SQL Server il sait tout manger, même les requêtes qu'on sait pas relire :p
 

Code :
  1. begin
  2. declare @table as varchar(255)
  3. declare @query as varchar(8000)
  4. --declare @resultat as numeric
  5. set @table = 'tie'
  6. set @query = 'declare @resultat numeric select count(*) from ' + @table + ' print @resultat'
  7. execute(@query)
  8. --print(@resultat)
  9. end

Reply

Marsh Posté le 10-03-2006 à 15:56:11    

ps: sinon, à noter que dans une PS, le code que j'ai posté marche (chavais bien que ça marchait :o)

Reply

Marsh Posté le 10-03-2006 à 15:59:22    

résolument non chez moi ca marche pas
quoiqu'il en soit mon chef de projet acceptra pas que je fasse un truc "goret"

Reply

Marsh Posté le 10-03-2006 à 16:02:26    

enfin oui le execute() marche, j'ai bien le resultat affiché dans l'Analyseur de Requetes  
mais c'est pour mettre ce resultat dans la variable @resultat et pouvoir utiliser @resultat dans les script suivant de mon fichier, que ca marche pas.

Reply

Marsh Posté le 10-03-2006 à 16:23:35    

evidement, dans ce cas c'est pas évident...

Reply

Marsh Posté le 10-03-2006 à 16:29:58    

tout le probleme est là ;-)

Reply

Marsh Posté le 10-03-2006 à 16:40:38    

Tiens voilà un truc propre :  
 
declare @resultat varchar(100)    
declare @table varchar(10)    
declare @sql nvarchar(500)
 
set @table = 'MaTable'  
   
set @sql ='select @rv=count(*) from '+ @table    
 
exec sp_executesql @sql, N'@rv int out',@rv = @resultat out
   
print(@resultat)


Message édité par THX le 10-03-2006 à 16:40:58
Reply

Marsh Posté le 10-03-2006 à 17:05:15    

yesss
ca marche nickel
merci !

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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