Je veux trouver toutes les procédures stockées où une table particulière est utilisée. Il y a beaucoup de procédures stockées dans la base de données, il est donc impossible de vérifier chaque procédure.
Existe-t-il un moyen d'utiliser une requête de recherche pour pouvoir rechercher les procédures stockées?
J'ai essayé ce code:
SELECT distinct so.name
FROM syscomments sc
INNER JOIN sysobjects so ON sc.id=so.id
WHERE sc.TEXT LIKE '% RejectionReason %'
Où RejectionReason
est le nom de ma table, mais toutes les procédures où RejectionReason
est utilisé comme nom de colonne sont affichées.
SELECT o.name, o.type_desc, p.name, p.type_desc
FROM sys.sql_dependencies d
INNER JOIN sys.objects o
ON d.object_id = o.object_id
INNER JOIN sys.objects p
ON d.referenced_major_id = p.object_id
AND o.name = 'RejectionReason'
ou
SELECT o.name, t.TABLE_NAME, c.text
FROM syscomments c
JOIN sysobjects o
ON c.id = o.id
JOIN INFORMATION_SCHEMA.Tables t
ON c.text LIKE '%RejectionReason%'
ou
EXEC sp_depends @objname = N'RejectionReason';
si aucun de ceux-ci ne vous aide à consulter ce blog: http://blog.sqlauthority.com/2010/02/04/sql-server-get-the-list-of-object-dependencies-sp_depends-and- information_schema-routines-and-sys-dm_sql_referencing_entities /
Essayez d’utiliser l’outil gratuit de RedGate Recherche SQL .
Voici un morceau de code qui espère que cela fonctionnera. Il suffit de changer le nom de la table, cela dépend de votre code
SELECT DISTINCT so.name
FROM syscomments sc INNER JOIN sysobjects so on sc.id=so.id
WHERE sc.text LIKE '%tablename%'
par exemple.:
SELECT DISTINCT so.name
FROM syscomments sc INNER JOIN sysobjects so on sc.id=so.id
WHERE sc.text LIKE '%users%'
Vous obtiendrez la liste des procédures de magasin et les relations de table.
Conformément à MSDNsp_depends
sera supprimé dans les prochaines versions si vous l'utilisez, vous pouvez utiliser le query
SELECT referencing_schema_name, referencing_entity_name, referencing_id, referencing_class_desc, is_caller_dependent
FROM sys.dm_sql_referencing_entities ('dbo.TableName', 'OBJECT');
Je suis conscient de deux possibilités.
Premièrement, SQL Management Studio a une option pour afficher les dépendances. Cliquez avec le bouton droit de la souris sur la table et sélectionnez View Dependencies
. Toutefois, cela ne mettra pas en évidence les utilisateurs dans lesquels le nom du fichier est incorporé dans du SQL dynamique.
La deuxième option consiste à cliquer avec le bouton droit de la souris sur la base de données et à sélectionner Generate Scripts
. Suivez l’assistant et écrivez tous les fichiers USP dans une nouvelle fenêtre de requête, puis recherchez le nom de votre table. Ceci est plus laborieux, mais trouvera toutes les utilisations.
J'utilise le script SQL suivant pour rechercher des noms de colonnes et dans toutes les procédures stockées de votre base de données . Vous pouvez également l'utiliser pour rechercher des tables dans des procédures stockées.
Spécifiez le terme à rechercher dans la variable@SearchFor
(comme vous le feriez dans une expression LIKE
, par exemple/'%LastName%'
pour rechercher des colonnes et des procédures stockées contenant LastName
).
Il trouvera les noms des colonnes dans les tableaux ainsi que du texte dans les procédures stockées. Le script peut même afficher le code source SP si vous définissez @SPNameOnly
sur 0.
--
-- Purpose: Search field names in all tables, views stored procedures
--
DECLARE @SearchFor nvarchar(max)='%Search_SP_Or_Table_Or_View%' -- 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 or t.table_name like @SearchFor
UNION
select '['+routine_Schema+'].['+routine_Name+']' [schema_object],
'PROCEDURE' as table_type from information_schema.routines
where routine_definition like @SearchFor or routine_name 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 or t.table_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 or routine_name like @SearchFor
and routine_type='procedure'
order by routine_name
end
end
Cela retournera les SP et les vues.
SELECT DISTINCT o.name AS Object_Name,o.type_desc
FROM sys.sql_modules m
INNER JOIN sys.objects o
ON m.object_id=o.object_id
WHERE m.definition Like '%TableName%'
Je suppose que ce script montre tous les objets dépendants de la table, y compris les SP.
USE MYDatabase
GO
DECLARE @TableName varchar(100)
SET @TableName = 'mytable'
SELECT
SourceSchema = OBJECT_SCHEMA_NAME(sed.referencing_id)
,SourceObject = OBJECT_NAME(sed.referencing_id)
,ReferencedDB = ISNULL(sre.referenced_database_name, DB_NAME())
,ReferencedSchema = ISNULL(sre.referenced_schema_name,
OBJECT_SCHEMA_NAME(sed.referencing_id))
,ReferencedObject = sre.referenced_entity_name
,ReferencedColumnID = sre.referenced_minor_id
,ReferencedColumn = sre.referenced_minor_name
FROM sys.sql_expression_dependencies sed
CROSS APPLY sys.dm_sql_referenced_entities(OBJECT_SCHEMA_NAME(sed.referencing_id)
+ '.' + OBJECT_NAME(sed.referencing_id), 'OBJECT') sre
WHERE sed.referenced_entity_name = @TableName
AND sre.referenced_entity_name = @TableName
pour plus de détails, vous pouvez consulter . http://sqlserverplanet.com/sql-server-2008/find-dependent-objects/
SysObjects stocke des informations de base sur tous les objets de votre base de données. Il est utile que vous le sachiez, car il nous indique le nom de chaque objet et son type.
SysComments stocke le texte réel (code) de vos procédures et fonctions stockées. Il contient un champ ID qui renvoie au champ ID dans SysObjects.
select so.name, text
from sysobjects so, syscomments sc
where so.id = sc.id
and text like '%RejectionReason%'