J'ai la base de données SQL Server avec de nombreuses tables, d'autres que je ne veux plus, je veux les supprimer. Toute l'interactivité de la base de données est via la procédure stockée à ces tables. p>
Y a-t-il un script SQL de base de données que je peux utiliser qui répertoriera toutes les tables non référencées dans l'une des procédures stockées dans la base de données? P>
8 Réponses :
vérifier cette discussion Script TSQL pour trouver des tables non utilisées par des procédures stockées, des vues, des fonctions, etc. p>
et cet article (énumérés de la discussion ci-dessus) http: //www.msqltips. com / tip.asp? Conseil = 1294 discute des dépendances d'objet SQL. p>
Peut-être quelque chose sur ces lignes:
La première requête répertorie la table avec le nom Proc stocké qui l'utilise.
La deuxième requête répertorie la table avec le nombre de Procs stockés l'utilisant.
Si SQL Server 2008, les informations de dépendances sont désormais fiables.
SELECT SCHEMA_NAME(t.schema_id), t.name FROM sys.tables t WHERE is_ms_shipped = 0 AND NOT EXISTS (SELECT * FROM sys.sql_expression_dependencies d WHERE d.referenced_entity_name = t.name AND (( is_ambiguous = 1 or is_caller_dependent=1) OR d.referenced_id = t.object_id) )
Les dépendances cross-db sont-elles exactes? Je pensais qu'ils n'étaient toujours pas
@JNK - Il y a un référencé_database_name code> dans
sys.sql_expression_depends code> qui peut être examiné. Je n'ai pas tenu compte de cela dans ma réponse et, en outre, ma réponse aurait besoin de peaufiner si l'OP dispose de colonnes nommées exactement la même chose que l'une de leurs tables. J'ai laissé cela comme un exercice pour l'op!
Vous ne pouvez pas faire cela si vous utilisez une T-SQL dynamique. Dynamic T-SQL ne s'affichera pas dans aucune enquête sur les dépendances d'objet.
à la place, vous pouvez utiliser le DMV sys.db_index_usage_stats pour déterminer quels objets n'ont pas été référencés par aucune question. Voici une requête que j'ai faite sur Sqlserverpedia pour que: P>
http://sqlserverpedia.com/wiki/ Find_indexes_not_in_use p>
La requête est conçue pour les index de réglage des performances, vous devez donc modifier quelques lignes. Voici la requête modifiée: P>
SELECT o.name , indexname=i.name , i.index_id , reads=user_seeks + user_scans + user_lookups , writes = user_updates , rows = (SELECT SUM(p.rows) FROM sys.partitions p WHERE p.index_id = s.index_id AND s.object_id = p.object_id) , CASE WHEN s.user_updates < 1 THEN 100 ELSE 1.00 * (s.user_seeks + s.user_scans + s.user_lookups) / s.user_updates END AS reads_per_write , 'DROP INDEX ' + QUOTENAME(i.name) + ' ON ' + QUOTENAME(c.name) + '.' + QUOTENAME(OBJECT_NAME(s.object_id)) as 'drop statement' FROM sys.dm_db_index_usage_stats s INNER JOIN sys.indexes i ON i.index_id = s.index_id AND s.object_id = i.object_id INNER JOIN sys.objects o on s.object_id = o.object_id INNER JOIN sys.schemas c on o.schema_id = c.schema_id WHERE OBJECTPROPERTY(s.object_id,'IsUserTable') = 1 AND s.database_id = DB_ID() ORDER BY reads
Voici celui que vous pouvez essayer:
select name from sys.tables t left join sys.sql_dependencies d on t.object_id = d.referenced_major_id where d.referenced_major_id is null
Si performace n'est pas une grande partie d'un problème, vous pouvez essayer ce qui suit.
Select Distinct Object_Name(ID) From syscomments Where ID Not In (Select ID From syscomments Where Text Like '%<TableName>%')
La plupart de ce code ne fonctionnent pas s'il existe des schémas autres que "DBO" ou si le schéma par défaut de l'utilisateur n'est pas "DB". Voici une mise à jour de l'un des scripts pour résoudre ce problème:
select t.Table_Schema + '.' + t.table_name from INFORMATION_SCHEMA.TABLES t where not exists ( select 1 from INFORMATION_SCHEMA.ROUTINES r where object_definition(object_id(r.routine_schema + '.' + r.ROUTINE_NAME)) like '%'+t.TABLE_NAME+'%' ) order by t.TABLE_NAME
Cette question est presque identique à Celui-ci mais les réponses sont différent.
@Dok - lequel? Vous avez reliées à cette question!
@Martin merci pour la prise. Celui-ci , référencé dans la réponse de Mitul, est le DUP.
@DOK: Cela pourrait être une bonne blague pour une question sur la récursivité.