Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/01/2011, 21h37   #1
Membre actif
 
Inscription : septembre 2007
Messages : 630
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 630
Points : 165
Points : 165
Par défaut pb avec requête UPDATE sous SQL 2008

Bonjour,
je fais une requête simple de ce style :
Code :
1
2
UPDATE F_COMPTET SET CT_Pays = 'FRANCE' WHERE (CT_Ville= 'abacourt')
UPDATE F_COMPTET SET CT_Pays = 'FRANCE' WHERE (CT_Ville= 'Abainville')
MAIS ici j'ai mis 2 lignes, moi j'en ai environ 98000.

Lorsque je clique sur 'Exécuter', SQL 2008 me renvoie l'erreur :
Citation:
TITRE*: Microsoft SQL Server Management Studio
------------------------------

Impossible d'exécuter le script.

------------------------------
INFORMATIONS SUPPLÉMENTAIRES*:

Une exception de type 'System.OutOfMemoryException' a été levée. (mscorlib)

------------------------------
BOUTONS*:

OK
------------------------------

Savez-vous pourquoi il ne veut pas ? et surtout comment le faire par requête ?

Merci
tibofo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/01/2011, 22h08   #2
Membre Expert
 
Homme Etienne ZINZINDOHOUE
Ingénieur développement
Inscription : mars 2010
Messages : 1 138
Détails du profil
Informations personnelles :
Nom : Homme Etienne ZINZINDOHOUE
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Ingénieur développement
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2010
Messages : 1 138
Points : 2 466
Points : 2 466
Envoyer un message via Yahoo à zinzineti
ça donne quoi si tu mets BEGIN ... END ?

Code :
1
2
3
4
5
6
7
 
BEGIN
UPDATE F_COMPTET SET CT_Pays = 'FRANCE' WHERE (CT_Ville= 'abacourt')
...........
..........
UPDATE F_COMPTET SET CT_Pays = 'FRANCE' WHERE (CT_Ville= 'Abainville')
END
__________________
Etienne ZINZINDOHOUE
Billets-Articles
zinzineti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/01/2011, 22h20   #3
Membre actif
 
Inscription : septembre 2007
Messages : 630
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 630
Points : 165
Points : 165
Merci pour ta proposition.


ça fait pareil ! cela plante
Citation:
Une exception de type 'System.OutOfMemoryException' a été levée. (mscorlib)
tibofo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/01/2011, 22h24   #4
Membre Expert
 
Homme Etienne ZINZINDOHOUE
Ingénieur développement
Inscription : mars 2010
Messages : 1 138
Détails du profil
Informations personnelles :
Nom : Homme Etienne ZINZINDOHOUE
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Ingénieur développement
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2010
Messages : 1 138
Points : 2 466
Points : 2 466
Envoyer un message via Yahoo à zinzineti
Au fait il y a un problème de mémoire.

Tu seras obligé d'exécuter tes requêtes en plusieurs étapes.

Commence par des lots de 1000 pour voir.
__________________
Etienne ZINZINDOHOUE
Billets-Articles
zinzineti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/01/2011, 10h51   #5
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 723
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Expert SQL Server
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 723
Points : 6 844
Points : 6 844
Bonjour,

Quelle est la configuration de votre serveur ?
De combien de mémoire disposez vous et quelle est la quantité de mémoire libre ?

Je suppose que vous lancez votre requête depuis un SSMS local à votre instance SQL Server ?

++
mikedavem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/01/2011, 16h30   #6
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 665
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2005
Messages : 4 665
Points : 8 710
Points : 8 710
Par défaut u

Bonjour,

Pour avoir à générer puis exécuter ce style de scripts assez souvent, j'ai eu le même problème que vous au début.
C'est une erreur purement SQL Server Management Studio, car il ne parvient pas à gérer l'ensemble du texte de la requête ou du lot de requêtes.
Il vous arrivera la même chose si vous tentez de changer des caractères avec la fonctionnalité de recherche et remplacement sur une suite de requêtes très longue.

Ce que j'ai donc fait dans ces cas là c'est créer une table dans laquelle je stocke les instructions à exécuter en les précédant d'un 'GO' + CHAR(13) + CHAR(10) toutes les 1000 lignes :


Code :
1
2
3
4
5
6
INSERT	maTableExport(script_line)
	SELECT	CASE
			WHEN n % 1000 = 0 THEN 'GO' + CHAR(13) + CHAR(10)
			ELSE ''
		END + 'UPDATE F_COMPTET SET CT_Pays = ''' + maColonne + 'WHERE CT_Ville= ''' + monAutreColonne + ''')
	FROM	mesTables

La colonne n est une colonne de type entier avec la propriété d'auto-incrémentation, que je peuple avant.

Et pour générer le fichier de script, j'utilise BCP :

Code :
1
2
3
DECLARE @bcp_command varchar(256) = 'BCP "SELECT script_line FROM maBD.dbo.maTableExport" queryout C:\monDossier\monFichier.txt -T -c'
 
EXEC xp_cmdshell @bcp_command
.

En outre, vous pourriez construire votre batch autrement, pour n'avoir à faire qu'un seul UPDATE, ce qui éviterait d'avoir à lire la table autant de fois que vous avez d'instructions dans votre lot.
Pour cela vous pouvez recourir à une table temporaire (#table) si vous n'avez pas un grand nombre de valeurs, ou à une table de base que vous créez et supprimez respectivement au début et à la fin du batch.
Dans votre cas :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
CREATE TABLE #affecte_pays
(
    CT_Pays varchar(32) NOT NULL
    , CT_Ville varchar(32) NOT NULL
)
 
INSERT    #affecte_pays VALUES
('FRANCE', 'abacourt')
, ...
, ('FRANCE', 'Abainville')
GO
 
UPDATE        dbo.F_COMPTET
SET        CT_Pays = TMP.CT_Pays
FROM        dbo.F_COMPTET AS C
INNER JOIN    #affecte_pays AS TMP
            ON C.CT_Ville = TMP.CT_Ville
GO
 
DROP TABLE #affecte_pays
GO
Le jeu d'instructions est le même pour une table de base.
La seule différence c'est que lorsque vous utilisez une table temporaire, celle-ci est stockée dans TempDB, qui est une base de données utilisée pour bien d'autres choses par le moteur de bases de données.
Donc en utilisant une telle table, vous le dérangez un peu.

Notez au passage qu'effectuer une jointure sur des chaînes de caractères est assez contre-performant comparé à une jointure sur des entiers

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/01/2011, 21h20   #7
Membre actif
 
Inscription : septembre 2007
Messages : 630
Détails du profil
Informations forums :
Inscription : septembre 2007
Messages : 630
Points : 165
Points : 165
Merci à tous pour vos réponses.
Merci elsuket pour votre réponse très évoluée.
Je vais essayer ceci !!

En fait, je ne suis pas sur un serveur mais sur mon PC équipé de SQL 2008, sur lequel je fais des tests pour un client.
tibofo est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h32.


 
 
 
 
Partenaires

Hébergement Web