2016-06-25 22 views
1

Ich erstelle einige Ansichten mit vielen Verweisen auf Tabellen in einer anderen Datenbank.Variablen in TSQL verwenden und Formatierung in SQL Server Management Studio beibehalten

Irgendwann muss sich die andere Datenbank ändern.

Ich möchte es dem nächsten Entwickler leicht machen, die Skripte zu ändern, um eine andere Datenbank zu verwenden.

Dies funktioniert natürlich, wie es sollte:

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

Aber wenn ich tun:

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

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

ich den Fehler:

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

ich so etwas tun konnte:

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

Das geht aber gegen den Zweck, es für den nächsten Entwickler einfacher zu machen - weil dieser dynamische SQL-Ansatz die Formatierung in SSMS entfernt hat.

Also meine Frage ist: Wie mache ich es einfach für den nächsten Entwickler, T-SQL-Code zu erhalten, wo er die Datenbankreferenz austauschen muss?

Hinweise:

  • ich SQL Server 2008 R2 mit
  • Die anderen Datenbank auf demselben Server befindet.
+0

Ich würde vorschlagen, ein Synonym zu erstellen - aber dies würde Sie zwingen, zwei Teil Objektnamen zu verwenden, anstatt dreiteilig. – PhillipH

Antwort

2

Verwenden Sie SQLCMD-Variablen. Dadurch können Sie den tatsächlichen Datenbanknamen zum Zeitpunkt der Bereitstellung angeben. SQL Server-Tools (SSMS, SQLCMD, SSDT) ​​ersetzen die SQLCMD-Variablennamen durch die zugewiesenen Zeichenfolgenwerte, wenn das Skript ausgeführt wird. Der SQLCMD-Modus kann für die aktuellen Abfragefenster über die Menüoption Abfrage -> SQLCMD-Modus aktiviert werden.

:SETVAR OtherDatabaseName "AnotherDatabaseName" 

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

Dieser Ansatz funktioniert am besten, wenn SQL-Objekte unter Versionskontrolle stehen.

+0

Dies ist auch eine gute Alternative. Möglicherweise möchten Sie etwas hinzufügen, um die Situation zu behandeln, falls das Objekt bereits in der Datenbank vorhanden ist. – Yobik

+0

Schöne und einfache Lösung - danke –

2

Wenn Sie Variablen deklarieren, leben sie nur während der Ausführung der Anweisung. Sie können keine Variable als Teil Ihrer DDL verwenden. Du könntest eine Reihe von Synonymen erstellen, aber ich denke darüber nach, es etwas zu tun.

Die Idee, dass sich Ihre Datenbanknamen im Laufe der Zeit ändern werden, scheint etwas ungewöhnlich und denkbar einmalig zu sein. Wenn Sie jedoch immer noch schnell auf eine neue Datenbank wechseln können, sollten Sie in Erwägung ziehen, direkt in SQL ein Light-Dienstprogramm zu erstellen, um die Ansichten automatisch so zu generieren, dass sie auf die neue Datenbank verweisen.

Eine Implementierung kann in etwa so aussehen.

Annahmen

  • haben wir die folgenden Datenbanken Unter der Annahme.
  • Angenommen, Sie bevorzugen das Dienstprogramm in SQL statt eine Anwendung zu erstellen, um es zu verwalten.

Code:

create database This; 
create database That; 
go 

Konfiguration

Hier Ich gründe einige Konfiguration Tabellen auf. Sie werden zwei einfache Dinge tun:

  1. Erlauben Sie Ihnen, den Namen der Zieldatenbank für eine bestimmte Konfiguration anzugeben.
  2. Ermöglicht Ihnen, die DDL der Ansicht zu definieren. Die Idee ist der Idee von Dan Guzman ähnlich, wo die DDL dynamisch unter Verwendung von Variablen aufgelöst wird. Dieser Ansatz verwendet jedoch nicht den systemeigenen SQLCMD-Modus und verwendet stattdessen dynamisches SQL.

Hier sind die Konfigurationstabellen.

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)); 

die Konfigurationseinstellung

Als nächstes setzen Sie die Konfiguration. In diesem Fall setze ich TargetDatabaseName auf That. Die SQL, die in SomeToolConfigView eingefügt wird, ist die DDL für die Ansicht. Ich verwende zwei Variablen, eine {{ViewName}} und {{TargetDatabaseName}}. Diese Variablen werden durch die Konfigurationswerte ersetzt.

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 

Das Werkzeug

Das Werkzeug ist eine gespeicherte Prozedur, die eine Konfigurationskennung erfolgt. Basierend auf dieser Kennung werden die Ansichten in der Konfiguration gelöscht und neu erstellt.

Die Signatur für die gespeicherte Prozedur wie folgt aussehen kann:

exec SomeTool @ConfigId; 

Sorry - verließ ich die Umsetzung aus, weil ich Scoot müssen, aber ich dachte, später als früher reagieren.

Hoffe, das hilft.

+0

Was meinst du mit "Licht Utility"? –

+1

@MartinCarlsson - Ich fügte ein bisschen mehr Detail hinzu, was ich meinte. Ich hoffe es hilft. Vielen Dank. – Yobik

+0

Danke! Dies ist ein wirklich cooles Muster, das Probleme auf der ganzen Linie lösen kann. Auf diesem Client habe ich nur Zugriff auf SQL Server und kann keine andere Anwendung ausführen. Ich denke, ich werde ein Wochenende damit verbringen, das "SomeTool" mit der Fähigkeit zu schreiben, ein paar andere Fälle zu bearbeiten. –