Salut à tous,

je viens d'écrire une procédure destinée à mettre à niveau les structures des tables entre deux bases (une procédure de livraison de structure de base quoi).
C'est encore tres sommaire pour l'instant, et ca ne fait pour l'instant qu'ajouter les colonnes de type varchar et decimal.

J'ai fait ca comme ca :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
42
43
44
45
46
47
48
49
50
 
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
 
 
 
 
 
ALTER PROCEDURE [SYSADM].[SP_COPY_DATABASE_STRUCTURE]
(
	@DB1 varchar(50),
	@DB2 varchar(50)
)
AS
 
DECLARE
@Instruction varchar(50)
 
BEGIN
	EXEC('SELECT DISTINCT 
		CASE(C1.DATA_TYPE) 
			WHEN ''varchar'' 
				THEN ''ALTER TABLE SYSADM.''+C1.TABLE_NAME+'' ADD [''+C1.COLUMN_NAME+''] [''+C1.DATA_TYPE+''] (''+CAST(C1.CHARACTER_MAXIMUM_LENGTH AS VARCHAR)+'') COLLATE ''+C1.COLLATION_NAME 
			WHEN ''decimal'' 
				THEN ''ALTER TABLE SYSADM.''+C1.TABLE_NAME+'' ADD [''+C1.COLUMN_NAME+''] [''+C1.DATA_TYPE+''] (''+CAST(C1.NUMERIC_PRECISION AS VARCHAR)+'',''+CAST(C1.NUMERIC_PRECISION_RADIX AS VARCHAR)+'')''
			ELSE ''ALTER TABLE SYSADM.''+C1.TABLE_NAME+'' ADD [''+C1.COLUMN_NAME+''] [''+C1.DATA_TYPE+'']''
		END AS ''instruction''
	INTO #TmpTbl
	FROM '+@DB1+'.INFORMATION_SCHEMA.COLUMNS C1, '+@DB2+'.INFORMATION_SCHEMA.COLUMNS C2            
	WHERE C1.TABLE_NAME = C2.TABLE_NAME AND C1.COLUMN_NAME NOT IN 
	(
	  SELECT COLUMN_NAME FROM @DB2.INFORMATION_SCHEMA.COLUMNS C3 WHERE C3.TABLE_NAME = C1.TABLE_NAME
	)')
 
	DECLARE CurTmp CURSOR FOR
	SELECT DISTINCT instruction from #TmpTbl
 
	OPEN CurTmp
	FETCH CurTmp INTO @instruction 
 
	WHILE @@Fetch_Status = 0
	BEGIN
		EXEC(@instruction)
		FETCH NEXT FROM CurTmp INTO @instruction
	END
 
	CLOSE Cur
	DEALLOCATE Cur
END
Quand je veux executer ma proc, je reçois les erreurs suivantes :
Msg*137, Niveau*15, État*2, Ligne*13
Must declare the scalar variable "@DB2".
Msg*208, Niveau*16, État*0, Procédure*SP_COPY_DATABASE_STRUCTURE, Ligne*33
Invalid object name '#TmpTbl'.

Y'a surement un truc tout bete que j'ai oublié, en tout cas pour le premier message mais je ne comprends ni l'un ni l'autre, et n'ayant aucune formation SQL je suis un peu bloqué ^^'
Vous pourriez m'expliquer ce qui cloche ?

Merci d'avance



EDIT : J'ai corrigé et perfectionné. Je n'utilise plus de table temporaire. Je mets maintenant à niveau de maniere plus évoluée : j'ajoute les colonnes manquantes, je retire les colonnes en trop, je mets à jour les types, tailles etc...Ca a l'air de marcher.
Je laisse tout de meme le fil ouvert si on peut m'expliquer pourquoi ca ne fonctionne pas avec une table temporaire. Et d'autre part si on peut m'aider à améliorer ou me suggérer des manières plus efficaces de procéder.