2010-01-14 3 views
2

J'ai besoin de trouver une instruction d'insertion dans une table spécifique. Malheureusement, l'application n'est pas la mienne pour commencer, il y a plus de 100 procédures stockées dans la base de données, j'ai parcouru le code en écrivant chaque nom de procédure stockée du début à la fin de ce processus et je n'arrive toujours pas à le trouver. Je sais que le processus doit se produire parce qu'un autre processus qui en dépend fonctionne correctement. Je ne peux pas le trouver.SQL Server 2008 - Recherche de commandes/d'appels/de texte spécifiques

Y at-il une sorte de TSQL qui me permettrait d'effectuer des recherches dans plusieurs procédures stockées pour une ligne de texte spécifique ... plus spécifiquement « INSERT INTO [tablename] »

MISE À JOUR

J'ai essayé en utilisant:

SELECT routine_name, routine_type 
FROM INFORMATION_SCHEMA.ROUTINES 
WHERE ROUTINE_DEFINITION LIKE '%INSERT INTO [tablename]%' 

Tout droit, en remplaçant [nom_table] par le nom de ma table. Cela renvoie 0 lignes.

J'ai une procédure avec cette ligne exacte, et j'aurais supposé qu'elle aurait été retournée dans la requête ci-dessus, mais elle ne ramènerait rien du tout.

MISE À JOUR # 2

Après avoir utilisé l'outil de recherche sql Redgate (en utilisant INSERT INTO [tablename]) renvoie 1 sp, mais je suis toujours dans le déni que cela est correct en raison de certains des tsql (à la fin de la sp ses tables de chute qui sont encore dans la base de données ...) (c'est où mon in-expérience à sql brille à travers)

Je ne peux toujours pas trouver d'où il est appelé à partir de si ...

MISE À JOUR # 3

Je viens de faire une recherche sur la solution entière pour 'INSERT INTO [nom_table]' pour voir si elles n'ont peut-être PAS utilisé une procédure stockée pour cet appel, et rien ... ne l'a trouvé nulle part.

+0

Vous devriez également vérifier les déclencheurs, cette insertion peut être effectuée à partir d'un déclencheur –

+0

C'était l'une des premières choses que j'ai vérifiées ... il n'y a pas de déclencheurs. Probablement aurait dû mettre cela dans la question originale. – Patrick

+0

Pour vérifier si le proc correct a inséré RAIESERROR statment dans le corps, recompilez proc et regardez si votre propre erreur apparaît lors de l'opération, c'est bien proc. N'oubliez pas de supprimer l'instruction raiserror lorsque le test est terminé. Description de l'instruction RAIESERROR sur MSDN: http://msdn.microsoft.com/en-us/library/ms178592.aspx – ThinkJet

Répondre

2

Pendant l'exécution de l'application, exécutez Profiler pour capturer les requêtes exécutées. Les événements à surveiller sont SQL: BatchCompleted, RPC: Terminé et SP: StmtCompleted.

Notez également que le mot "INTO" est facultatif pour l'instruction INSERT, donc recherchez également "INSERT [nom_table]".

+0

il s'est avéré qu'il exécutait un processus COMPLETEMENT différent qui faisait réellement les calculs ... même en le parcourant je ne suis pas sûr comment cela fonctionne du côté de .net ... im pensant que cela a quelque chose à voir avec un sous-rapport qui est directement lié à la procédure stockée dans la base de données ... J'ai mis à jour le processus OTHER et il fonctionne maintenant. – Patrick

1
SELECT routine_name, routine_type 
FROM INFORMATION_SCHEMA.ROUTINES 
WHERE ROUTINE_DEFINITION LIKE '%INSERT INTO [tablename]%' 

avertissement: cela peut prendre un certain temps. Si votre système est une production lourde, ne fonctionnent pas sur la table entière, mais ajouter une condition supplémentaire pour rechercher uniquement un tas de routines stockées à un moment

EDIT:

Peut-être que vous devriez essayer quelque chose autre. Faire un vidage de texte de toutes les routines, et utiliser grep pour rechercher cela. Je suis sûr que vous pouvez obtenir un grep for windows. Le vidage se fait facilement avec le studio de gestion: naviguez jusqu'à la base de données, faites un clic droit et choisissez des tâches> générer des scripts.

+0

Sachez que vous aurez besoin d'échapper les crochets si vous les utilisez, quelque chose comme: LIKE '% INSERT INTO | [nomtable |]%' ESCAPE '|'. À moins que les crochets ne soient juste destinés à le mettre en évidence comme étant un espace réservé pour le vrai nom de table :) – AdaTheDev

+0

Assez curieusement, il ne renvoie même pas la procédure 1 que j'ai été capable de trouver qui avait l'appel dedans. Malheureusement, sp n'est pas appelé pendant cette procédure. – Patrick

1

Essayez

SELECT * FROM sys.syscomments 
WHERE text LIKE '%CREATE PROCEDURE%' 
AND text LIKE '%INSERT INTO%' 

ou

SELECT ROUTINE_NAME, ROUTINE_DEFINITION 
FROM INFORMATION_SCHEMA.ROUTINES 
WHERE ROUTINE_DEFINITION LIKE '%INSERT INTO%' 
AND ROUTINE_TYPE='PROCEDURE' 

2ème trouvé here

+0

Essayé les deux et aucun travaillé .... – Patrick

+0

Vous voulez dire qu'ils ont retourné 0 lignes? – rosscj2533

+0

Correct ... ils "ont travaillé" ... mais n'ont pas retourné ce dont j'avais besoin donc ils n'ont pas "travaillé" pour moi>< – Patrick

1

Juste pour ajouter aux réponses précédentes que je ne vais pas répéter, je pense qu'il est une bonne idée d'avoir tous les objets de la base de données sont scriptés (et conservés dans le contrôle de la source). Donc, j'ajouterais la suggestion que vous tuez 2 oiseaux avec une pierre - script la base de données, puis recherchez les scripts SQL générés.

5

Procédez également à une procédure stockée!

GO 

SET ANSI_NULLS ON 

GO 

SET QUOTED_IDENTIFIER ON 

GO 

/* 
exec sp_find_procs_containing 'insert into tablename' 
*/ 

CREATE PROCEDURE [dbo].[sp_find_procs_containing]  
@search VARCHAR(100) = '' 
AS 
SET @search = '%' + @search + '%' 
SELECT   ROUTINE_NAME, ROUTINE_DEFINITION 
FROM   
INFORMATION_SCHEMA.ROUTINES 
WHERE   
ROUTINE_DEFINITION LIKE @search 
ORDER BY ROUTINE_NAME 

GO 
1

Jetez un oeil à cet outil porte rouge: sql search encore en version bêta, mais il doit travailler

+0

outil génial, tyvm il fonctionne à renvoyer des informations assez rapidement. – Patrick

1

Vous avez probablement quelques LF, CR/LF s, ou des espaces supplémentaires là-bas qui empêchent votre recherche de travail. Réduisez votre chaîne de recherche jusqu'à ce que vous obteniez une correspondance (essayez simplement d'utiliser le nom de la table) ou modifiez-la en: %INSERT%SOMETHING%INTO%SOMETHING%, etc.

+0

Il trouve 1 instance du nom de la table ... le SELECT qui en extrait les informations, mais il ne trouve pas l'INSERT qui y place les informations. – Patrick

+1

Comment savez-vous que l'instruction 'INSERT' est dans la base de données et ne provient pas d'une application accédant à la base de données? – RedFilter

+0

Aucune autre application n'accède à la base de données, à part l'application sur laquelle je travaille. Tout le SQL pour ce processus est contenu dans les procédures stockées. – Patrick

Questions connexes