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?
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
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%';
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.
Disclaimer: Je travaille pour ApexSQL en tant qu'ingénieur support
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):
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).
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à.
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
.
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