如何替换 SQL 数据库中项目的任何实例

问题描述 投票:0回答:1

我正在使用 MS SQL 数据库,其中广泛使用对象“目标”。它以多种形式出现,例如字段名称(Target)、变量(@Target)以及多个表值函数中。

传统上,为了替换此类对象,我使用 SQL Server Management Studio (SSMS) 为受影响的数据库对象生成脚本,然后手动编辑这些脚本以进行替换,最后使用修改后的脚本创建一个新数据库。这种方法虽然有效,但可能相当费力。

我正在寻求一种更简化的方法。有没有一种方法可以直接在整个数据库中搜索和替换对“目标”对象的引用,而无需首先生成和手动编辑脚本?理想情况下,我正在寻找一种可以直接在现有数据库中实施的解决方案。

sql sql-server azure-sql-database
1个回答
0
投票

您可以做的是搜索使用该项目的所有数据库“对象”,此类脚本的示例如下

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
© www.soinside.com 2019 - 2024. All rights reserved.