7
votes

Trouver toutes les tables non référencées dans les procédures stockées

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.

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?


4 commentaires

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é.


8 Réponses :


0
votes

vérifier cette discussion Script TSQL pour trouver des tables non utilisées par des procédures stockées, des vues, des fonctions, etc.

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.


0 commentaires

0
votes

Peut-être quelque chose sur ces lignes: xxx


0 commentaires

0
votes

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. XXX


0 commentaires

4
votes

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)  )


2 commentaires

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 dans sys.sql_expression_depends 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!



4
votes

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


0 commentaires

0
votes

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


0 commentaires

0
votes

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>%')


0 commentaires

0
votes

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


0 commentaires