web-dev-qa-db-fra.com

Trouver toutes les procédures stockées qui font référence à une colonne spécifique dans une table

J'ai une valeur dans une table qui a été modifiée de manière inattendue. La colonne en question est CreatedDate: elle est définie lors de la création de mon élément, mais elle est modifiée par une procédure stockée.

Pourrais-je écrire un type d'instruction SELECT pour obtenir tous les noms de procédure qui référencent cette colonne à partir de ma table?

31
Pomster

Une option consiste à créer un fichier de script.

Faites un clic droit sur la base de données -> Tâches -> Générer des scripts

Ensuite, vous pouvez sélectionner toutes les procédures stockées et générer le script avec tous les sps. Vous pouvez donc trouver la référence à partir de là.

Ou

-- Search in All Objects
SELECT OBJECT_NAME(OBJECT_ID),
definition
FROM sys.sql_modules
WHERE definition LIKE '%' + 'CreatedDate' + '%'
GO

-- Search in Stored Procedure Only
SELECT DISTINCT OBJECT_NAME(OBJECT_ID),
object_definition(OBJECT_ID)
FROM sys.Procedures
WHERE object_definition(OBJECT_ID) LIKE '%' + 'CreatedDate' + '%'
GO

Source SQL SERVER - Rechercher la colonne utilisée dans la procédure stockée - Rechercher la procédure stockée pour le nom de la colonne

46
huMpty duMpty

Si vous souhaitez obtenir des procédures stockées en utilisant une colonne spécifique uniquement, vous pouvez utiliser la requête suivante: 

SELECT DISTINCT Name
FROM sys.Procedures
WHERE object_definition(OBJECT_ID) LIKE '%CreatedDate%';

Si vous souhaitez obtenir des procédures stockées en utilisant une colonne spécifique de la table, vous pouvez utiliser la requête ci-dessous:

SELECT DISTINCT Name 
FROM sys.procedures
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%tbl_name%'
AND OBJECT_DEFINITION(OBJECT_ID) LIKE '%CreatedDate%';
24
Akash KC

Vous pouvez utiliser ApexSQL Search , il s'agit d'un complément gratuit de SSMS et de Visual Studio, qui peut répertorier tous les objets faisant référence à une colonne de table spécifique. Il peut également rechercher des données stockées dans des tables et des vues. Vous pouvez facilement filtrer les résultats pour afficher un type d'objet de base de données spécifique faisant référence à la colonne.

enter image description here

Disclaimer: Je travaille pour ApexSQL en tant qu'ingénieur support

21
Milena Petrovic

Vous pouvez utiliser les vues système contenues dans information_schema pour rechercher dans les tables, vues et _ (procédures non chiffrées) procédures stockées avec un seul script. J'ai développé un tel script il y a quelque temps, car j'avais besoin de rechercher des noms de champs partout dans la base de données.

Le script ci-dessous répertorie d'abord les tables/vues contenant le nom de la colonne que vous recherchez, puis le code source des procédures stockées contenant la colonne. Il affiche le résultat dans une table distinguant "BASE TABLE", "VIEW" et "PROCEDURE", et (éventuellement) le code source dans une seconde table:

DECLARE @SearchFor nvarchar(max)='%CustomerID%' -- search for this string
DECLARE @SearchSP bit = 1 -- 1=search in SPs as well
DECLARE @DisplaySPSource bit = 1 -- 1=display SP source code

-- tables
if (@SearchSP=1) begin  
  (
  select '['+c.table_Schema+'].['+c.table_Name+'].['+c.column_name+']' [schema_object], 
            t.table_type 
  from information_schema.columns c
  left join information_schema.Tables t on c.table_name=t.table_name
  where column_name like @SearchFor 
  union
  select '['+routine_Schema+'].['+routine_Name+']' [schema_object], 
         'PROCEDURE' as table_type from information_schema.routines
  where routine_definition like @SearchFor
        and routine_type='procedure'
  )
  order by table_type, schema_object
end else begin
  select '['+c.table_Schema+'].['+c.table_Name+'].['+c.column_name+']' [schema_object], 
         t.table_type 
  from information_schema.columns c
  left join information_schema.Tables t on c.table_name=t.table_name
  where column_name like @SearchFor 
  order by c.table_Name, c.column_name
end     
-- stored procedure (source listing)
if (@SearchSP=1) begin      
    if (@DisplaySPSource=1) begin
      select '['+routine_Schema+'].['+routine_Name+']' [schema.sp], routine_definition 
      from information_schema.routines
      where routine_definition like @SearchFor
      and routine_type='procedure'
      order by routine_name
    end
end

Si vous exécutez la requête, utilisez l'option "result as as text". Vous pouvez alors utiliser "find" pour localiser le texte de recherche dans le jeu de résultats (utile pour le code source long).

Remarque: vous pouvez définir @DisplaySPSource sur 0 si vous souhaitez uniquement afficher les noms SP. Si vous recherchez uniquement des tables/vues, mais pas des SP, vous pouvez définir @SearchSP à 0.

Exemple de résultat (recherchez CustomerID dans la base de données Northwind, les résultats sont affichés via LinqPad):

 Sample Result

Note que j'ai vérifié ce script avec une vue de test dbo.TestOrders.__ et qu'il a trouvé le CustomerID dans cette vue même si c.* a été utilisé dans l'instruction SELECT (la table référencée Customers contient le CustomerID et par conséquent la vue montre colonne).

2
Matt

essaye ça..

SELECT Name
FROM sys.procedures
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%CreatedDate%'
GO

ou vous pouvez générer un script de toutes les procédures et rechercher à partir de là.

1
Nitu Bansal

j'ai eu le même problème et j'ai trouvé que Microsoft a un systable qui montre dépendances .

SELECT 
    referenced_id
    , referenced_entity_name AS table_name
    , referenced_minor_name as column_name
    , is_all_columns_found
FROM sys.dm_sql_referenced_entities ('dbo.Proc1', 'OBJECT'); 

Et cela fonctionne avec Views et Triggers.

1
Rafa Barragan

Vous pouvez utiliser la requête ci-dessous pour identifier les valeurs. Mais gardez à l'esprit que cela ne vous donnera pas les résultats de la procédure stockée cryptée.

SELECT DISTINCT OBJECT_NAME(comments.id) OBJECT_NAME
    ,objects.type_desc
FROM syscomments comments
    ,sys.objects objects
WHERE comments.id = objects.object_id
    AND TEXT LIKE '%CreatedDate%'
ORDER BY 1
0
Gopakumar N.Kurup