Hello,
j'ai un schéma de base qui utilise une table propriétaire pour générer les clés primaires que j'ai reprise de l'article sur les meta données dans la partie SQL de ce site.
Pour celà j'utilise la table Tmeta_RefTables_TBL :
et un trigger d'insert sur chaque table qui incrémente automatiquement la clé ..
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 CREATE TABLE [Tmeta_RefTables_TBL] ( [TBL_ID] [bigint] NOT NULL , [TBL_NOM] [varchar] (128) NOT NULL , [TBL_PKREF] [bigint] NOT NULL , CONSTRAINT [PK_Tmeta_RefTables_TBL] PRIMARY KEY CLUSTERED ( [TBL_ID] ) ON [PRIMARY] ) ON [PRIMARY]
Un pb se posait néanmoins pour insérer un jeu de données à partir d'un select j'ai donc fait la ps que je vous livre ici car j'aimerais savoir si il y a une meilleure méthode plus simple , plus optimisée pour faire un insert into... select ?
Merci à tous et toutes ;)
voici ma ps :
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129 SET QUOTED_IDENTIFIER ON GO SET ANSI_NULLS ON GO CREATE PROCEDURE PS_SYS_DB_INSERT_WITH_SELECT @SELECT_QUERY VARCHAR(2048), @NomTableCible as varchar(128), @NomTrigger as varchar(128) AS SET TRANSACTION ISOLATION LEVEL SERIALIZABLE Declare @errMsg as varchar(256) DECLARE @SQL_Query1 as varchar(4096) DECLARE @SQL_Query2 as varchar(4096) DECLARE @BorneMin as varchar(8) DECLARE @TBL_ID as bigint DECLARE @MaxIDGen as bigint BEGIN TRANSACTION -- 1/ on chope la borne minimale de l'id SELECT @BorneMin = CAST ( TBL_PKREF+1 as varchar(8) ) , @TBL_ID=TBL_ID from Tmeta_RefTables_TBL Where TBL_NOM=@NomTableCible IF @@ERROR<> 0 BEGIN Set @errMsg = 'PS_SYS_DB_INSERT_WITH_SELECT - erreur lors du select @BorneMin' GOTO LBL_ERROR END -- 2/ on Disable le trigger --TRIGGER_INSERT_PK_Tmeta_TEST EXECUTE('ALTER TABLE ' + @NomTableCible + ' DISABLE TRIGGER ' + @NomTrigger) IF @@ERROR<> 0 BEGIN Set @errMsg = 'PS_SYS_DB_INSERT_WITH_SELECT - erreur lors du DISABLE TRIGGER' GOTO LBL_ERROR END -- 3/ On créé la table temporaire qui va bien SET @SQL_Query1 = ' SELECT IDENTITY(int,' + @BorneMin + ',1) as MyID,TSel.* INTO tmp_table FROM (' + @SELECT_QUERY +') as Tsel' EXECute(@SQL_Query1) IF @@ERROR<> 0 BEGIN Set @errMsg = 'PS_SYS_DB_INSERT_WITH_SELECT - erreur lors de l''insertion des données ds la table temporaire : ' + @SQL_query1 GOTO LBL_ERROR END -- 3-1/ On récupère l'ID le plus grand pour MAJ Temat_RefTables_TBL SELECT @MaxIDGen = IDENT_CURRENT('tmp_table') IF @@ERROR<> 0 BEGIN Set @errMsg = 'PS_SYS_DB_INSERT_WITH_SELECT - erreur lors du select IDENT_CURRENT ' GOTO LBL_ERROR END -- 4/ On insere dans la table SET @SQL_Query2 ='INSERT INTO ' + @NomTableCible + ' SELECT * FROM tmp_table' EXECUTE(@SQL_Query2) IF @@ERROR<> 0 BEGIN Set @errMsg = 'PS_SYS_DB_INSERT_WITH_SELECT - erreur lors de l''insertion des données ds la table finale : ' + @SQL_query2 GOTO LBL_ERROR END -- 5/ On remet le trigger en place EXECUTE('ALTER TABLE ' + @NomTableCible + ' ENABLE TRIGGER ' + @NomTrigger) IF @@ERROR<> 0 BEGIN Set @errMsg = 'PS_SYS_DB_INSERT_WITH_SELECT - erreur lors du ENABLE TRIGGER ' GOTO LBL_ERROR END -- 6/ On drop la table temporaire avant de valider la transaction DROP TABLE tmp_table IF @@ERROR<> 0 BEGIN Set @errMsg = 'PS_SYS_DB_INSERT_WITH_SELECT - erreur lors du DROP TABLE tmp_table' GOTO LBL_ERROR END -- 7/ On MAJ la table Tmeta_PK_ref avec la nouvelle clé de fin UPDATE Tmeta_RefTables_TBL SET TBL_PKREF=@MaxIDGen WHERE TBL_ID=@TBL_ID IF @@ERROR<> 0 BEGIN Set @errMsg = 'PS_SYS_DB_INSERT_WITH_SELECT - erreur lors du UPDATE Tmeta_RefTables_TBL SET TBL_PKREF=@MaxIDGen WHERE TBL_ID=@TBL_ID' GOTO LBL_ERROR END COMMIT TRANSACTION GOTO LBL_END LBL_ERROR: ROLLBACK TRANSACTION RAISERROR (@ErrMsg,16,1) LBL_END: GO SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO
Partager