2016-06-25 13 views
1

別のデータベースのテーブルへの参照がたくさんあるビューを作成しています。TSQLで変数を使用し、SQL Server Management Studioでフォーマットを維持する

ある時点で、他のデータベースを変更する必要があります。

次の開発者が別のデータベースを使用するようにスクリプトを変更しやすくしたいと考えています。

これは明らかにそれが必要のように動作:

CREATE VIEW ViewName 
AS 
    SELECT * 
    FROM AnotherDatabase.SchemaName.TableName; 

しかし、私はやるとき:

Msg 137, Level 15, State 2, Procedure ViewName, Line 3
Must declare the scalar variable "@DB".

私は何ができる何かのように:

DECLARE @DB CHAR(100) 
SET @DB = 'AnotherDatabase' 
GO 

CREATE VIEW ViewName 
AS 
    SELECT * 
    FROM @DB.SchemaName.TableName; 

私はエラーを取得します

DECLARE @SQL ... 
SET @SQL = ' ... FROM ' + @DB + ' ... ' 
EXEC (@SQL) 

しかし、これは、この動的SQLのアプローチがSSMSの書式を削除したため、次の開発者にとってより簡単にすることを目的としています。

私の質問は次のとおりです。データベース参照を交換する必要があるT-SQLコードを次の開発者が容易に維持できるようにするにはどうすればよいですか?

注:

  • 私は、他のデータベースが同じサーバー上にあるSQL Server 2008 R2の
  • を使用しています。
+0

シノニムを作成することをお勧めしますが、これは3つの部分ではなく2つの部分オブジェクトの命名を使用するよう強制します。 – PhillipH

答えて

2

SQLCMD変数の使用を検討してください。これにより、展開時に実際のデータベース名を指定することができます。 SQL Serverツール(SSMS、SQLCMD、SSDT)は、スクリプト実行時にSQLCMD変数名を割り当てられた文字列値に置き換えます。 SQLCMDモードは、メニュー・オプションQuery - > SQLCMDモード・オプションから現在の照会ウィンドウに対してオンにすることができます。

:SETVAR OtherDatabaseName "AnotherDatabaseName" 

CREATE VIEW ViewName AS 
SELECT * 
    FROM $(OtherDatabaseName).SchemaName.TableName; 
GO 

この方法は、SQLオブジェクトがソース管理下に置かれている場合に最適です。

+0

これも良い選択肢です。オブジェクトがすでにデータベースに存在する場合には、状況を処理するためにそこに何かを含めることができます。 – Yobik

+0

素敵でシンプルなソリューション - ありがとう –

2

変数を宣言すると、変数はステートメントの実行中にのみ存在します。 DDLの一部として変数を持つことはできません。あなたは同義語の束を作成することができますが、私はそれを少しでも行うことを検討します。

あなたのデータベース名が経時的に変化するという考えは、普通の、おそらくは一度限りの出来事ではないようです。ただし、新しいデータベースを指すようにすばやく切り替える必要がある場合は、SQLで直接ライト・ユーティリティを作成して、新しいデータベースを指すビューを自動的に生成することもできます。

実装は次のようになります。私たちは、以下のデータベースを持っていると仮定すると

仮定

  • ユーティリティをSQLで管理して管理するのではなく、アプリケーションを構築することをお勧めします。

コード:私はいくつか設定テーブルを設定していここ

create database This; 
create database That; 
go 

設定。彼らは2つの簡単なことを行います:

  1. 特定の構成のターゲットデータベース名を指定できます。
  2. ビューのDDLを定義できます。アイデアは、DDLが変数を使用して動的に解決されるDan Guzmanの考え方に似ています。ただし、このアプローチでは、ネイティブSQLCMDモードを使用せず、代わりに動的SQLを使用します。

ここに設定テーブルがあります。あなたが設定を設定する設定

次の設定

use This; 

create table dbo.SomeToolConfig (
    ConfigId int identity(1, 1) primary key clustered, 
    TargetDatabaseName varchar(128) not null); 

create table dbo.SomeToolConfigView (
    ConfigId int not null 
     references SomeToolConfig(ConfigId), 
    ViewName varchar(128) not null, 
    Sql varchar(max) not null, 
    unique(ConfigId, ViewName)); 

。この場合、私はTargetDatabaseNameThatに設定しています。 SomeToolConfigViewに挿入されているSQLは、ビューのDDLです。私は2つの変数,1つの{{ViewName}}{{TargetDatabaseName}}を使用しています。これらの変数は構成値に置き換えられます。

insert SomeToolConfig (TargetDatabaseName) 
    values ('That'); 

insert SomeToolConfigView (ConfigId, ViewName, Sql) 
    values 
     (scope_identity(), 'dbo.my_objects', ' 
create view {{ViewName}} 
as 
    select * 
    from {{TargetDatabaseName}}.sys.objects;'), 
     (scope_identity(), 'dbo.my_columns', ' 
create view {{ViewName}} 
as 
    select * 
    from {{TargetDatabaseName}}.sys.columns;'); 
go 

ツール

ツールは、構成識別子をとるストアドプロシージャです。次に、その識別子に基づいて、構成内のビューを削除して再作成します。ストアドプロシージャの

シグネチャは次のようになります。

exec SomeTool @ConfigId; 

申し訳ありません - 私はスクートしなければならないので、私は、実装を残し、私は遅かれ​​早かれよりも応じる考えました。

これが役に立ちます。

+0

"軽いユーティリティ"とはどういう意味ですか? –

+1

@MartinCarlsson - 私は、私が何を意味するかについて、もう少し詳しく述べました。それが役に立てば幸い。ありがとう。 – Yobik

+0

ありがとう!これは、問題を解決できる本当にクールなパターンです。このクライアントでは、SQL Serverにしかアクセスできず、他のアプリケーションを実行することができません。週末に「SomeTool」と書いて、他のいくつかのケースを処理できるようにするつもりだと思う。 –

関連する問題