Dump load d'une base de données

Description

dans le cas du passage de SQL 7 à SQL 2000 j'ai été confronté à un probleme. Le classement entre ces 2 moteurs avaient changé.
plusieurs options sont donc possible :
1 - installé SQL 2000 avec le meme classement que sql 7
2 - transférer les données d'une base sql 7 vers sql 2000

j'ai choisi cette seconde option et comme mes clients n'ont pas tous l'outil d'import et d'export de sql, j'ai écrit ce petit script.

Source / Exemple :


-- Script de Dump et de load des données d'une base vers une autre 
-- Note : 
--	Les 2 bases doivent avoir la meme structure
--      si il existe des données dans la base de destination, elles seront supprimées
--      Les 2 bases doivent être installées sur le même moteur
--      le transfert des données passant par un dossier disque, ne pas oublier de le créer avant
--	il est conseillé de désactiver les contraintes d'intégrité avant de lancer le traitement
--      
Set NOCOUNT ON
go
Declare @BaseSource 	VarChar(50)
Declare @BaseDest 	VarChar(50)
Declare @TableName	VarChar(50)
Declare @CmdExport	VarChar(2000)
Declare @CmdImport	VarChar(2000)
Declare @Requete	VarChar(5000)
Set @BaseSource = 'NombaseSource'
Set @BaseDest   = 'Nombasedest'
Exec master..Xp_CmdShell 'Del C:\Dump\*.Txt', NO_OUTPUT
Exec master..Xp_CmdShell 'Del C:\Dump\Log\*.Log', NO_OUTPUT

Declare Cur_Table Cursor For
	Select name from sysobjects where type='U'
	And (name like 'T\_%' escape '\' Or name like 'W\_%' escape '\' Or name like 'X\_%' escape '\')
	Order by Name

Open Cur_Table
Fetch Next From Cur_Table Into @TableName
While @@Fetch_Status = 0 
Begin
	Print ''
	Print '----------> ' + Upper(@TableName) + ' <----------'

	Print 'Export dans C:\Dump\' + @TableName + '.txt à partir de ' + @BaseSource + '.Dbo.' + @TableName
	Set @CmdExport = 'BCP "' + @BaseSource + '.Dbo.' + @TableName + '" Out "c:\Dump\' + @TableName + '.txt" -n -V 70 -U sa -P bigboss -E -e C:\Dump\Log\' + @TableName + '_Exp.log -a 65535 -m 10000 -R'
 	--Print @CmdExport
	Exec master..Xp_CmdShell @CmdExport, NO_OUTPUT
-- 
 	Print 'Vidage de la table ' +  @BaseDest + '.Dbo.' + @TableName + ' avant import'
 	Set @Requete = 'Delete ' +  @BaseDest + '.Dbo.' + @TableName 
 	Exec (@Requete)
-- 
 	Print 'Import dans ' +  @BaseDest + '.Dbo.' + @TableName + ' à partir de C:\Dump\' + @TableName + '.txt' 	
 	Set @CmdImport = 'BCP "' + @BaseDest + '.Dbo.' + @TableName + '" In "c:\Dump\' + @TableName + '.txt" -n -V 70 -U sa -P bigboss -E -e C:\Dump\Log\' + @TableName + '_Imp.log -a 65535 -m 10000 -R'
 	Print @CmdImport
	Exec master..Xp_CmdShell @CmdImport, NO_OUTPUT

	Fetch Next From Cur_Table Into @TableName
End
Close Cur_Table

Print ''
Print ''
Print '----------> Contrôle du nombre d''enregistrements transférés <----------'
Open Cur_Table
Fetch Next From Cur_Table Into @TableName
While @@Fetch_Status = 0 
Begin
	Print 'Contrôle de la table : ' + @TableName
	Set @Requete = 'Declare @NbLgBaseSource Int
			If Exists(Select Name From ' + @BaseSource + '.Dbo.SysObjects Where Name = ''' + @TableName + ''')
			Begin
				Select @NbLgBaseSource = Count(*) From ' + @BaseSource + '.Dbo.' + @TableName + '
			End
			Else
			Begin
				Set @NbLgBaseSource = 0
			End
			Declare @NbLgBaseDest	Int
			If Exists(Select Name From ' + @BaseDest + '.Dbo.SysObjects Where Name = ''' + @TableName + ''')
			Begin
				Select @NbLgBaseDest = Count(*) From ' + @BaseDest + '.Dbo.' + @TableName + '
			End
			Else
			Begin
				Set @NbLgBaseDest = 0
			End
			If @NbLgBaseSource <> @NbLgBaseDest
			Begin
				Print ''ERREUR --- Nombre de ligne différent entre ' + @BaseSource + '.Dbo.' + @TableName + ''' + ''('' + Cast(@NbLgBaseSource as VarChar) + 
				'') et ' + @BaseDest + '.Dbo.' + @TableName + ''' + ''('' + Cast(@NbLgBaseDest as VarChar) + '')''
			End'
	--print @requete
	Exec (@Requete)
	Fetch Next From Cur_Table Into @TableName
End
Close Cur_Table
Deallocate Cur_Table
Print 'Traitement terminé !'

Set NOCOUNT OFF

Conclusion :


cez n'est peut etre pas la meilleure solution mais en tout cas cela marche.

a vos claviers pour les critiques

Pat

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.