2010-10-13 18 views
4

Je travaille dans Sql Server 2008 et il y a un changement de table dans ma base de données. Donc j'ai besoin de savoir quelles sont les requêtes que j'utilise cette table ou j'ai besoin de savoir quelles seront les requêtes qui jetteront des erreurs. J'ai changé certains SP pour qu'ils fonctionnent correctement. Mais il y a beaucoup de requêtes qui peuvent causer des erreurs. est possible de trouver toutes les requêtes qui renverront l'erreur comme la table non trouvée ou la colonne non trouvée.Y at-il une requête pour trouver le SP qui contient des erreurs?

J'ai obtenu le sp qui utilise par la requête suivante

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

Mais le problème est qu'il retourne tous les SP qui contient le name.But pour certaines requêtes que j'ai changé le nom mais utilise encore 'ID_machine' comme nom d'alias.Ainsi, la requête ci-dessus renvoie tout le SP qui contient 'ID_machine'. Il peut être utilisé dans une requête dans SP ou peut être utilisé comme paramètre.Alors, comment puis-je obtenir la requête qui provoquera erreur due à l'absence de table ou de colonne

Dans certains sp il affiche une erreur de ce type lors de l'exécution

Invalid object name 'tblMachineryHdr'. 

Que ce soit possible de savoir ce que toutes les déclarations Les erreurs SP comme ça? Merci d'avance!

Répondre

2

Je ne sais pas si vous pouvez comprendre cela avec juste quelques questions - mais il existe des outils qui peuvent vous aider à faire cela - particulièrement utile pour le faire avant de faire un changement!

Voir par exemple. SQL Dependency Tracker de Red Gate en option - extrêmement utile!

1

Essayez cette requête:

SELECT [Name] 

FROM SYSCOMMENTS c 

    INNER JOIN 
     SYSOBJECTS o 
    ON c.id = o.id 

WHERE c.text LIKE '%mytable%' 

Remplacer « matable » avec le nom de la table que vous avez changé. Cela retournera un ensemble de données avec les noms de toutes les procédures stockées et les UDF qui référencent votre table.

PS: Avant de changer le nom que vous pouvez exécuter sp_depends « matable » pour découvrir les dépendances. Mais si le nom de la table a déjà été modifié, la requête ci-dessus devrait toujours fonctionner.

0

Dans SQL Server 2008, vous pouvez utiliser sp_refreshsqlmodule pour rechercher des colonnes manquantes dans des tables existantes et sys.sql_expression_dependencies pour rechercher des tables manquantes.

CREATE DATABASE test20101013 
GO 

USE test20101013 
GO 

CREATE PROCEDURE dbo.foo1 
AS 
SELECT willexist FROM dbo.bar 

GO 

CREATE PROCEDURE dbo.foo2 
AS 
SELECT wontexist FROM dbo.bar 

GO 
/*Returns foo1 and foo2 as table doesn't exist yet*/ 
SELECT * 
FROM sys.sql_expression_dependencies 
WHERE referenced_id IS NULL 

GO 

CREATE TABLE dbo.bar 
(
willexist INT 
) 
GO 

/*Returns nothing as table now exists*/ 
SELECT * 
FROM sys.sql_expression_dependencies 
WHERE referenced_id IS NULL 

GO 

EXEC sp_refreshsqlmodule 'dbo.foo1' /*Succeeds*/ 
EXEC sp_refreshsqlmodule 'dbo.foo2' /*Throws Error about missing column*/ 

GO 

USE master 
ALTER DATABASE test20101013 SET single_user WITH ROLLBACK IMMEDIATE 
DROP DATABASE test20101013