Sql-Server

使用條件更改視圖的特定行

  • September 27, 2016

我最近開始在一家維護四百五百個客戶數據庫的公司工作,並且正在對程式碼進行各種維護任務(畢竟我是初級水平)。我的任務是在整個公司範圍內的一組視圖中辨識一個特定的錯誤,並更改每一個。我已經能夠通過 SQLSearch(一個救命稻草)辨識出所有的罪魁禍首,但現在我的任務是在近 1,200 個視圖中將一個特定的程式碼行修改為新標準。

我知道:

  • 錯誤的程式碼行(有 3 種變體,我都知道這三種)
  • 我需要用正確的程式碼行替換錯誤的行
  • 哪些視圖和哪些數據庫有錯誤。
  • 每個數據庫中有多少視圖目前“錯誤”

如何在不手動操作的情況下輕鬆修改視圖以更正錯誤?

這很容易用 PowerShell 實現(您可以在其中使用正則表達式來完成您的工作)但為了簡單起見,我將使用 t-sql 解決方案和一個簡化範例,如下所示

-- assume you have a view called dbo.v and you want to replace one line in this view
use tempdb
go
drop view dbo.v
go
create view dbo.v
as
   select A = 'test 1'
   union all
   select A = 'test 2' -- we will change this to 'test 222'
   union all
   select A = 'test 3'
go
-- assume we will replace the line select A = 'test 2'
declare @sql varchar(max);
declare @original_string varchar(300) = 'select A = ''test 2''';
declare @replace_string varchar(300) = 'select A = ''test 222''';


select  @sql=definition from sys.sql_modules
where object_id = object_id('dbo.v')


set @sql = replace(@sql, @original_string, @replace_string);
set @sql = replace(@sql, 'create view', 'alter view');
--print @sql -- uncomment it if needed

exec (@sql)
go

引用自:https://dba.stackexchange.com/questions/150798