我正在使用 MS SQL 数据库,其中广泛使用对象“目标”。它以多种形式出现,例如字段名称(Target)、变量(@Target)以及多个表值函数中。
传统上,为了替换此类对象,我使用 SQL Server Management Studio (SSMS) 为受影响的数据库对象生成脚本,然后手动编辑这些脚本以进行替换,最后使用修改后的脚本创建一个新数据库。这种方法虽然有效,但可能相当费力。
我正在寻求一种更简化的方法。有没有一种方法可以直接在整个数据库中搜索和替换对“目标”对象的引用,而无需首先生成和手动编辑脚本?理想情况下,我正在寻找一种可以直接在现有数据库中实施的解决方案。
您可以做的是搜索使用该项目的所有数据库“对象”,此类脚本的示例如下
SELECT DISTINCT
o.name AS Object_Name,
o.type_desc,
m.*
FROM sys.sql_modules m
INNER JOIN sys.objects o ON m.object_id = o.object_id
WHERE m.definition Like '%Target%'
然后你可以更正每个过程/函数/视图或其他内容
您还可以找到这样的无效对象,但请注意,这并不总是返回所有问题,但它对我这样的替换操作有很大帮助。
select * from
(
select QuoteName(OBJECT_SCHEMA_NAME(referencing_id)) + '.' + QuoteName(OBJECT_NAME(referencing_id)) AS ProblemObject,
o.type_desc,
ISNULL(QuoteName(referenced_server_name) + '.', '')
+ ISNULL(QuoteName(referenced_database_name) + '.', '')
+ ISNULL(QuoteName(referenced_schema_name) + '.', '')
+ QuoteName(referenced_entity_name) AS MissingReferencedObject
from sys.sql_expression_dependencies sed
left join sys.objects o on sed.referencing_id=o.object_id
where (is_ambiguous = 0)
and (OBJECT_ID(ISNULL(QuoteName(referenced_server_name) + '.', '')
+ ISNULL(QuoteName(referenced_database_name) + '.', '')
+ ISNULL(QuoteName(referenced_schema_name) + '.', '')
+ QuoteName(referenced_entity_name)
) IS NULL)
) a
--where a.MissingReferencedObject not in ('[inserted]','[deleted]')
order by ProblemObject, MissingReferencedObject