Une seule instruction DROP pour supprimer plusieurs objets de base de données de même type

Voici comment, dans la même instruction, supprimer plusieurs procédures stockées ou tables …

Supposons que nous voulons supprimer quatre tables dont les noms sont :

– Client
– Client_Commande
– Client_Livraison
– Livraison

On peut écrire :

1
2
3
4
5
6
7
8
9
10
11
---------------------------------
-- Nicolas SOUQUET - 08/06/2009 -
---------------------------------
DROP TABLE dbo.Client
GO
DROP TABLE dbo.Client_Commande
GO
DROP TABLE dbo.Client_Livraison
GO
DROP TABLE dbo.Livraison
GO

Et dès lors si l’on veut supprimer un jeu de procédures stockées correspondant à certains critères, on se voir obligé d’écrire :

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
---------------------------------
-- Nicolas SOUQUET - 08/06/2009 -
---------------------------------
DECLARE curProcedures CURSOR FOR
  SELECT name
  FROM sys.procedures
  WHERE name LIKE '%client%'
  OR name LIKE '%livraison%'
FOR READ ONLY
 
DECLARE @nomProc SYSNAME,
    @SQL VARCHAR(128)
 
OPEN curProcedures
FETCH NEXT FROM curProcedures INTO @nomProc
WHILE @@FETCH_STATUS = 0
BEGIN
  SET @SQL = 'DROP PROCEDURE dbo.' + @nomProc
 
  PRINT @nomProc  
  EXEC (@SQL)
 
  FETCH NEXT FROM curProcedures INTO @nomProc
END
 
DEALLOCATE curProcedures

Mais la syntaxe suivante est aussi valable :

1
2
3
4
---------------------------------
-- Nicolas SOUQUET - 08/06/2009 -
---------------------------------
DROP TABLE dbo.Client, dbo.Client_Commande, dbo.Client_Livraison, dbo.Livraison

Et on peut alors écrire :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
---------------------------------
-- Nicolas SOUQUET - 08/06/2009 -
---------------------------------
DECLARE @SQL NVARCHAR(2048),
    @separateur NCHAR(6)
 
SET @separateur = N', dbo.'
 
SELECT @SQL = ISNULL(@SQL, '') + name + @separateur
FROM sys.procedures
WHERE name LIKE '%client%'
OR name LIKE '%livraison%'
 
SELECT @SQL = 'DROP PROCEDURE ' + LEFT(@SQL, LEN(@SQL) - LEN(@separateur))
 
PRINT @SQL
EXEC (@SQL)

ElSuket

Laisser un commentaire