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
| CREATE PROCEDURE SP_Riad3
AS
-- variables locales de la procédure
DECLARE @NomTable VARCHAR(128), -- nom de la table
@SQL VARCHAR(1000) -- texte de la requête dynamique
-- pas de messages intempestifs
SET NOCOUNT ON
-- déclaration du curseur pour recuperer les noms des colonnes
DECLARE CursBase CURSOR
FOR
SELECT COLONNES.name
FROM syscolumns AS COLONNES INNER JOIN
sysobjects AS TABLES ON TABLES.id = COLONNES.id
WHERE (TABLES.name = 'tableXXXX')
-- gestion de la table des résultats : nom de la table qui contiendra les differences
SET @NomTable = 'DATA'
-- vidage si existence de cette table, sinon création
IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.tables WHERE TABLE_NAME = @NomTable)
DELETE FROM DATA
ELSE
CREATE TABLE DATA
(
obj VARCHAR(128),
OLD VARCHAR(128),
NEW VARCHAR(128),
diff VARCHAR(128))
-- ouverture du curseur
OPEN CursBase
-- lecture de la première ligne
FETCH CursBase INTO @NomTable
-- boucle ligne à ligne
WHILE @@FETCH_STATUS = 0
BEGIN
if @NomTable='Date' goto suite
declare @str varchar(1500)
SET @str = 'INSERT INTO DATA SELECT t1.obj, t1.' + @NomTable + ' AS old, t2.' + @NomTable +' AS NEW, ''' + @NomTable + ''' AS diff
FROM tablexxx AS t1 INNER JOIN
tablexxx AS t2 ON t1.obj = t2.obj AND t1.'+@NomTable+' <> t2.'+@NomTable+' AND t1.Date < t2.Date'
suite:
print (@str)
exec (@str)
FETCH CursBase INTO @NomTable
END
-- fermeture et désallocation d'espace mémoire du curseur
CLOSE CursBase
DEALLOCATE CursBase
-- envoi des données
SELECT * FROM DATA
-- pas de messages intempestifs
SET NOCOUNT OFF |
Partager