Script SQL pour modifier toutes les references de table dans toutes les procédures stockées

J'ai créé une nouvelle database avec des copys de tables existantes mais j'ai changé les noms de ces tables, y at-il un script sql que je puisse exécuter (peut-être en utilisant SysObjects) pour modifier toutes les references à ces tables?

Merci.

Ne vous ROUTINE_DEFINITION pas à INFORMATION_SCHEMA.ROUTINES parce que ROUTINE_DEFINITION est seulement nvarchar(4000) . Vous avez besoin de sys.sql_modules où la definition est nvarchar (max)

essayez l'un d'entre eux pour find la procédure que vous devez modifier:

 SELECT DISTINCT LEFT(s.name+'.'+o.name, 100) AS Object_Name,o.type_desc --, m.definition FROM sys.sql_modules m INNER JOIN sys.objects o ON m.object_id=o.object_id INNER JOIN sys.schemas s ON o.schema_id=s.schema_id WHERE m.definition Like '%'+@SearchValue+'%' ORDER BY 1 SELECT OBJECT_SCHEMA_NAME(m.object_id)+'.'+OBJECT_NAME(m.object_id) --, m.definition FROM sys.sql_modules m WHERE m.definition like '%whatever%' SELECT OBJECT_SCHEMA_NAME(m.object_id)+'.'+OBJECT_NAME(m.object_id), o.type_desc --,m.definition FROM sys.sql_modules m INNER JOIN sys.objects o ON m.object_id=o.object_id WHERE m.definition like '%whatever%' 

vous pouvez décommenter m.definition pour listr le contenu, mais je trouve préférable de simplement identifier toutes les procédures et de les consulter manuellement, car vous ne voulez pas exécuter les commands UPDATE sur les tables système. Script les procédures nécessaires, faire les changements (search / rlocation ou manuellement), puis exécutez les scripts!

Non.

Je crois que SQL Refactor de Redgate a cette fonctionnalité. Sinon, vous pouvez écrire tous les objects et soit manuellement, soit par code, faire une search et replace.

SQL Server 2005 prend également en charge les synonymes qui pourraient être utiles.

Voici un morceau de SQL que vous pouvez utiliser pour récupérer la définition des procédures stockées qui correspondent à certains critères de search. Vous pouvez simplement le changer pour faire une search et replace comme Martin l'avait suggéré.

Changez simplement '% TABLE_NAME%' en fonction de vos critères de search ou du nom de la table que vous souhaitez modifier.

J'espère que cela t'aides.

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

Si c'est à court terme (comme une database de test), la solution la plus simple consiste à créer une vue pour chaque table que vous avez modifiée, en utilisant l'ancien nom. Par exemple, si vous avez changé les tests table à tests_new vous pouvez faire:

 CREATE VIEW dbo.tests AS SELECT * FROM dbo.tests_new 

Toutes vos procédures feront reference à dbo.tests dans datatables de dbo.tests_new .

C'est une très très mauvaise idée si ce sera une database permanente / de production, car elle ajoute juste une couche d'obfuscation à votre structure et en fera un cauchemar à maintenir.

Vous ne pouvez pas modifier les references de table dans sprocs via le dictionary de données système. Vous devez get le script qui crée la procédure stockée et modifier les noms de table dans le script. Si vous avez les scripts c'est une simple search et remplacez pour la plupart.

Si vous n'avez pas les scripts, vous pouvez get le text des scripts de procédure stockée à partir de sys.sql_modules ou les récupérer via SSMS.