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 14/06/2011, 16h13   #1
Nouveau Membre du Club
 
Inscription : décembre 2008
Messages : 63
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France

Informations forums :
Inscription : décembre 2008
Messages : 63
Points : 27
Points : 27
Par défaut Problème d' incrément rang

Bonjour ,

Afin de repérer les TRANSACTIONS NON commiter, j'ai développé un petit script qui permet d'identifier cette transaction, mais je n'arrive pas à incrémenter ma boucle afin qu'il passe à la BD suivante.

Ci dessous le script :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
 
USE master
GO
 
DECLARE @DATABASE nvarchar(100)
DECLARE @Nb_Db int
DROP TABLE #DB_temp 
 
SELECT name INTO #DB_temp 
FROM sys.DATABASES
WHERE name NOT IN ('master','msdb','model','tempdb')
 
SET @Nb_Db = 0
DECLARE DatabaseCursor CURSOR FOR
        SELECT name FROM #DB_temp
 
OPEN DatabaseCursor
 
FETCH NEXT FROM DatabaseCursor INTO @DATABASE
WHILE @Nb_Db <> (SELECT count(name) FROM #DB_temp)
	BEGIN
		BEGIN TRY
			--DBCC OPENTRAN(@Database)
			PRINT 'DBCC OK ' + @DATABASE
		END TRY
 
		BEGIN CATCH
			SELECT
				ERROR_NUMBER() AS ErrorNumber
				,ERROR_SEVERITY() AS ErrorSeverity
				,ERROR_STATE() AS ErrorState
				,ERROR_PROCEDURE() AS ErrorProcedure
				,ERROR_LINE() AS ErrorLine
				,ERROR_MESSAGE() AS ErrorMessage
		END CATCH
		SET @Nb_Db = @Nb_Db +1
	END
		CLOSE DatabaseCursor
		DEALLOCATE DatabaseCursor
Pourriez-vous m'aider ?

Merci d'avance !
Blacknounou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/06/2011, 16h19   #2
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour,

En effet, il manque un FETCH dans la boucle !

De plus, pour votre condition de sortie de boucle, vous pouvez vérifier si le curseur à encore des lignes sous le coude :

Code SQL :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
 
USE master
GO
 
DECLARE @DATABASE nvarchar(100)
DROP TABLE #DB_temp 
 
SELECT name INTO #DB_temp 
FROM sys.DATABASES
WHERE name NOT IN ('master','msdb','model','tempdb')
 
SET @Nb_Db = 0
DECLARE DatabaseCursor CURSOR FOR
        SELECT name FROM #DB_temp
 
OPEN DatabaseCursor
 
FETCH NEXT FROM DatabaseCursor INTO @DATABASE
 
WHILE @@FETCH_STATUS = 0
	BEGIN
		BEGIN TRY
			--DBCC OPENTRAN(@Database)
			PRINT 'DBCC OK ' + @DATABASE
		END TRY
 
		BEGIN CATCH
			SELECT
				ERROR_NUMBER() AS ErrorNumber
				,ERROR_SEVERITY() AS ErrorSeverity
				,ERROR_STATE() AS ErrorState
				,ERROR_PROCEDURE() AS ErrorProcedure
				,ERROR_LINE() AS ErrorLine
				,ERROR_MESSAGE() AS ErrorMessage
		END CATCH
 
		FETCH NEXT FROM DatabaseCursor INTO @DATABASE
 
	END
		CLOSE DatabaseCursor
		DEALLOCATE DatabaseCursor
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/06/2011, 16h22   #3
Nouveau Membre du Club
 
Inscription : décembre 2008
Messages : 63
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France

Informations forums :
Inscription : décembre 2008
Messages : 63
Points : 27
Points : 27
Merci pour cette réponse rapide !!!!
Blacknounou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/06/2011, 16h27   #4
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 669
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 669
Points : 8 729
Points : 8 729
Bonjour,

Encore une fois le curseur ne sert à rien, et mettre un WHILE dans votre curseur ici ne sert à rien non plus :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
SET NOCOUNT ON
GO
 
DECLARE @db TABLE
(
	database_name sysname
)
 
DECLARE @database_name sysname
	, @sql nvarchar(128)
 
INSERT	INTO @db (database_name)
SELECT	name
FROM	sys.DATABASES
WHERE	name NOT IN ('master','msdb','model','tempdb', 'ReportServer', 'ReportServerTempDB', 'distribution')
AND	source_database_id IS NULL -- la BD n'est pas un snashot
AND	state_desc = 'ONLINE'
 
WHILE EXISTS
(
	SELECT	*
	FROM	@db
)
BEGIN
	SELECT	TOP (1) @database_name = database_name
	FROM	@db
 
	SET	@sql = N'DBCC OPENTRAN (' + @database_name + ')'
	PRINT	'------------------------' + @database_name + '------------------------'
	EXEC	(@sql)
 
	DELETE	FROM @db
	WHERE	database_name = @database_name
END
@++
__________________
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 14/06/2011, 16h29   #5
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Citation:
Envoyé par Blacknounou Voir le message
Merci
de rien

Citation:
Envoyé par Blacknounou Voir le message
pour cette réponse rapide !!!!
Dans laquelle j'ai omis de retirer le SET @Nb_Db = 0
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/06/2011, 16h50   #6
Nouveau Membre du Club
 
Inscription : décembre 2008
Messages : 63
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France

Informations forums :
Inscription : décembre 2008
Messages : 63
Points : 27
Points : 27
Citation:
Envoyé par elsuket Voir le message
Bonjour,

Encore une fois le curseur ne sert à rien, et mettre un WHILE dans votre curseur ici ne sert à rien non plus :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
SET NOCOUNT ON
GO
 
DECLARE @db TABLE
(
	database_name sysname
)
 
DECLARE @database_name sysname
	, @sql nvarchar(128)
 
INSERT	INTO @db (database_name)
SELECT	name
FROM	sys.DATABASES
WHERE	name NOT IN ('master','msdb','model','tempdb', 'ReportServer', 'ReportServerTempDB', 'distribution')
AND	source_database_id IS NULL -- la BD n'est pas un snashot
AND	state_desc = 'ONLINE'
 
WHILE EXISTS
(
	SELECT	*
	FROM	@db
)
BEGIN
	SELECT	TOP (1) @database_name = database_name
	FROM	@db
 
	SET	@sql = N'DBCC OPENTRAN (' + @database_name + ')'
	PRINT	'------------------------' + @database_name + '------------------------'
	EXEC	(@sql)
 
	DELETE	FROM @db
	WHERE	database_name = @database_name
END
@++
Je prends aussi.

Merci .
Blacknounou 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 05h17.


 
 
 
 
Partenaires

Hébergement Web