Actualisation et éxecution automatique

arthur -  
Reivax962 Messages postés 3742 Statut Membre -
Bonjour, tous.
J'utilise sql server management studio.
Je lance chaque semaine des requetes du genre:

SELECT Client,
Cout,
LEFT([Time],
'Week36' as Semaine,
FROM dbo.mabase
WHERE
LEFT([Time], 8)>= '20100906'
and LEFT([Time], 8)<= '20100912'

Je me donne la peine d'actualiser manuellement la requete. Par exemple, pour la semaine prochaine il me faudra écrire Week37,20100913,20100919 aux lignes correspondantes.
J'attire votre attention sur le 'Week 36', il est entre apostrophes, c'est un champ que la requete crée, il ne se retrouve donc pas dans la base.

Je voudrais m'épagner de cette actualisation manuelle et aussi automatiser l'éxecution hebdomadaire de cette requete.
Du moins, je ne suis pas administrateur dans le serveur.
Merci de m'aider explicitement à le faire.

10 réponses

Reivax962 Messages postés 3742 Statut Membre 1 011
 
Bonjour,

Pour l'automatisation, le mieux est de passer par un job SQL.
Mais puisque tu n'es pas administrateur, je te conseille de créer un fichier .bat qui exécute la requête. Pour ce faire, il faudrait que tu aies SQL Server d'installé sur ton poste.
Dans le fichier .bat, tu places le code suivant :
sqlcmd -H hostname -U user -P password -d database -i fichier.sql > resultat.txt
En remplaçant :
hostname par l'IP ou le nom du serveur hébergeant ta base
user par le nom d'utilisateur pour s'y connecter
password par le mot de passe à utiliser
database par le nom de ta base de données
fichier.sql par le nom du fichier texte dans lequel tu as écrit ta requête.

Le résultat se retrouvera dans un fichier resultat.txt.

Ensuite, ce fichier .bat doit être appelé : pour ça, je te conseille le planificateur de tâches de Windows.

Pour ta requête, tu peux la modifier comme ceci :
SELECT Client,
Cout,
LEFT([Time],8)
'Week' + cast(datepart(WW, dateadd(d, -7, getdate())) as varchar(2)) as Semaine,
FROM dbo.mabase
WHERE
datepart(WW, dateadd(d, -7, getdate()) = datepart(WW, [Time])

datepart(WW, uneDate) donne le numéro de semaine de uneDate.
Par contre, il faut que tu te méfies des conditions aux limites : plusieurs normes existent sur la numérotation de la première et de la dernière semaine de l'année (un vendredi 1er janvier fait-il partie de la dernière semaine de l'année précédente, ou de la première de l'année qui débute ?).
Je te laisse vérifier que la norme que tu utilises correspond bien et, au besoin, je te laisse adapter la requête.

Xavier
0
arthur
 
Merci Xavier.
Je crois que ça va aller.
Pour l'instant, après un test d'exécution de ma requete tel que vous l'aviez modifié, j'ai le message d'erreur suivant :

"Conversion failed when converting datetime from character string"

J'ose croire que c'est parce que notre champ [Time] est au fait de type Char(14).En voici un enregistrement : 20100913121010. Ceci fait allusion au 13 septembre 2010, 12 heures, 10 minutes, 10 secondes.

Qu'en penses-tu?

Arthur.
0
Reivax962 Messages postés 3742 Statut Membre 1 011
 
Oui c'est bien le problème.
Dans ce cas, remplace tous les Time de ma requête par des LEFT(Time, 8)
0
arthur
 
Encore grand merci Xavier.
Seulement que j'ai rencontré des problèmes avec la norme de semaines.
Avec
SET DATEFIRST 1;
j'ai su ramener le premier jour de la semaine à Lundi au lieu du Dimanche.
Voici ce qui me reste:
datepart (WW, '20100104')
me renvoie "2".
Pourtant je souhaiterais que la semaine du lundi 04 01 2010 soit la première de l'année afin que mes numérotations de semaines soient conservées.
Arthur.
0
Reivax962 Messages postés 3742 Statut Membre 1 011
 
Oui, c'est le genre de problème qu'on rencontre en comptant en numéro de semaine...
Sous SQLServer 2008, le support des semaines ISO se fait en remplaçant WW par isowk dans la requête que je t'ai donnée.
0
arthur
 
salut xavier.
voici le contenu du fichier texte dénommé RESULTAT que produit le script bat:
"
HResult 0x2 Level 16 State 1
Named Pipes Provider: Could not open a connection to SQL Server [2].
"

prière de m'aider.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Reivax962 Messages postés 3742 Statut Membre 1 011
 
Bonjour,

Il faut vérifier que les paramètres donnés correspondent bien à ton serveur sql :

sqlcmd -H hostname -U user -P password -d database -i fichier.sql > resultat.txt
En remplaçant :
hostname par l'IP ou le nom du serveur hébergeant ta base
user par le nom d'utilisateur pour s'y connecter
password par le mot de passe à utiliser
database par le nom de ta base de données
fichier.sql par le nom du fichier texte dans lequel tu as écrit ta requête.

Xavier
0
arthur
 
Ca vient de marcher. En remplaçant le H par le S.
Merci.
Du moins, le resultat (fichier text) en question semble ne pas etre requis afin d'etre importé dans une table.
En voici la structure:

date ProductID ServiceType ChargeMode
-------- -------------------- ----------- ----------
20100916 0100121800 0 4
20090916 0100113400 0 7

Alors que je m'attendai à avoir:

20100916 100121800 0 4
20090916 100113400 0 7

En plus après importation, toutes les colonnes s'entassent en une seule et les deux premières lignes s'érigent en enregistrements indésirables :

dateProductIDServiceTypeChargeMode
-------------------------------------
20100916010012180004
20090916010011340007
0
arthur
 
N'y a-t-il pas moyen de renvoyer les résultats directement vers une table SQL SERVER spécifiée (*)?

sqlcmd -S ssss -U uuuu -P pppp -d dddd -i iiii.sql > (*)
0
Reivax962 Messages postés 3742 Statut Membre 1 011
 
Bonjour,

Si tu veux les renvoyer dans une table, c'est ta requête SQL qu'il faut changer, pas la ligne de commande, en utilisant la commande INTO, ou directement en faisant un INSERT.

Le INTO crée une nouvelle table, et plante si elle existe déjà (y a peut-être moyen d'écraser, je ne sais pas)
Le INSERT nécessite que la table soit créée au préalable.

Je te laisse lire la doc microsoft sur le sujet.

Xavier
0
arthur
 
salut.
le problème c'est que la requete select dont il est question se fait from une table d'une base d'un serveur donné tandis que je veux renvoyer le resultat dans une table d'un autre serveur c'est à dire login et pswrd différents.
et alors, insert ou into ne marchent pas pour de transactions entre deux serveurs différents en ce que je sache.
thanks.
0
Reivax962 Messages postés 3742 Statut Membre 1 011
 
Cela peut marcher en déclarant des serveurs liés.
0