2017-09-12 13 views
1

別のデータベースを参照するデータベースに約20のビューがあります。データベースAと呼ぶことにしましょう。これらのビューをポイントするスクリプトで更新する方法が必要です単一のtsqlスクリプトを使用してビュー内のデータベースAの名前をデータベースBの名前に置き換え、ビューをそのままに保つ方法はありますか?置換を行い、ビューをクエリウィンドウに出力できますが、生成されたALTER文を実行して、手動で出力を実行する必要はありません。tsqlスクリプトを使用してコードを置き換えてビューを更新する方法はありますか

更新私がやりたいことはhttps://stackoverflow.com/a/2983927/6084613と似ていますが、スクリプトによって出力が実行されています。それは可能ですか?

+0

SSMS:DBを右クリックし、スクリプトを生成し、ビューを選択し、スクリプトを新しいウィンドウにドラッグして検索して置き換えて実行します。 –

+0

ありがとうAlex K.それは私が長い間それをやった方法ですが、私はより速い解決策が必要です。また、複数のデータベースでは、置き換えを実行した後に間違ったデータベース(たとえば、デフォルト)を更新する可能性があるため、そのように行うのはエラーが発生しやすいです。 –

答えて

2

クエリ定義を変数に入れてから、sp_executeSQLで実行するだけです。

しかし、私は注意を払う必要があります。 たとえば、すべてのビューが正確なテキスト 'CREATE VIEW'を持っているわけではありません。 手書きの場合は、たとえば「CREATE VIEW」や「CREATE VIEW」などがあります。 また、 'DB1'は私に '[DB1]'と書くかもしれません。

したがって、より洗練されたロジックを追加するか、またはexectutingする前にすべてを検証します。

Declare @queryDef nvarchar(max) 

    SELECT @queryDef = REPLACE (REPLACE (sm.definition, 'CREATE VIEW', 'ALTER VIEW'), 'DB1.', 'DB2.') 
    FROM sys.sql_modules sm JOIN sys.objects o 
     ON sm.object_id = o.object_id 
    WHERE 
     sm.definition LIKE '%DB1.%' AND o.type = 'V' 

    print @queryDef 
    exec sp_executeSql @querydef 
+0

これは素晴らしい動作します。ありがとう!私が見つけた唯一の問題は、一度に1つのビューを更新するようだが、それを関数として保存し、検索から返されたすべてのビューに対して実行できることです。私はまだCREATEを置き換えることで何の問題も見つけられませんでしたが、知っておいてよかったです。 –

3

同じようにSQLを作成しました。このスクリプトは、

declare @OldDb varchar(250), @newDB varchar(250) 
select @OldDb = '' , ---------->>> provide old db name 
@newDB = '' ---------->>> provide new db name 

    create table #ViewList (Id int identity , ViewName varchar(250)) 
insert into #ViewList 
select TABLE_NAME from INFORMATION_SCHEMA.VIEWS where TABLE_NAME IN () ---------->>> provide you view list 

create table #ViewDef( ViewDef nvarchar(max) , ViewName varchar(250) ,Id int ) 

declare @minId int , @maxid int , @sql nvarchar(max) ='' , @ViewName varchar(250) 

select @minId = min(Id) , @maxid = max(id) from #ViewList 

while @minId <= @maxid 

begin 

select @ViewName = ViewName from #ViewList where id = @minId 

set @sql = ' insert into #ViewDef (ViewDef) 
exec sp_helptext '+ @ViewName +' 
update #ViewDef 
set ViewName = '''+ @ViewName +''', 
id = ' + cast(@minId as varchar(10)) +' 
where id is null 
update #ViewDef 
set ViewDef = replace(ViewDef , '''+ @OldDb+''','''+ @newDB +''') 
where id = ' + cast(@minId as varchar(10)) +' 
update #ViewDef 
set ViewDef = replace(ViewDef , ''create'',''alter'') 
where id = ' + cast(@minId as varchar(10)) +' 
' 
exec sp_executesql @sql 

SET @sql = '' 

select @sql = @sql + ViewDef from #ViewDef where id = @minId 

exec sp_executesql @sql 
--print @sql 

set @minId = @minId +1 

end 

を修正したいビューの2入力 1.旧DB名 2.新しいDB名 3.リスト**スクリプトをテストし、任意の損失を避けるために、あなたの古い定義を保存してくださいかかります上記のスクリプトにバグがある場合

関連する問題