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 :

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]
et un trigger d'insert sur chaque table qui incrémente automatiquement la clé ..

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