2017-07-10 5 views
-1

Ich möchte den Datenbanknamen in gespeicherten Prozeduren/Sichten dynamisch ändern können.Den Datenbanknamen dynamisch in der gespeicherten Prozedur festlegen

Beispiel:

SELECT USER_FNM 
FROM MYBASE_01.DBO.USERS 

Ich möchte MYBASE_01 dynamisch haben, vielleicht in einigen Variablen gespeichert. Ist das möglich?

Mein Grund dafür ist, ich habe viele Ansichten, wo Datenbankname enthalten ist. Beim Deployment muss ich diesen Namen in jeder Ansicht ändern. Es wäre viel einfacher, wenn der Name einer Datenbank nur in einer Variablen gespeichert werden kann, so dass diese nicht für alle Ansichten geändert werden muss.

+0

Sie können eine dynamische SQL-Zeichenfolge ausführen, in der Sie in Ihrem Namen eine Zeichenfolgevariable verwenden. Sie würden Ihre Abfrage in eine 'EXEC() 'einbetten. – EMUEVIL

+0

Für gespeicherte Prozeduren könnten Sie dynamische SQL nutzen (obwohl das ein Zeichen dafür ist, dass etwas nicht ideal entworfen ist), aber Ihre Ansichten stecken Sie fest. Sie können dynamische Sqls oder Variablen in Sichten nicht verwenden. –

+1

Klingt mehr nach einem Fall für SQLCMD-Variablen in Ihrem Bereitstellungsskript ('$ (database)'). Wollen Sie wirklich die Datenbank um * runtime * ändern? Wenn dies der Fall ist, ist es viel sinnvoller, eine 'USE db' auf Ihrer Verbindung von der Client-Software zu erstellen. Wenn die Anzahl der Objekte, auf die Sie auf diese Weise zugreifen, begrenzt ist, sollten Sie ['CREATE SYNONYM'] (https://docs.microsoft.com/sql/t-sql/statements/create-synonym-transact-sql) als Alias ​​verwenden transparent. –

Antwort

1

Sie können Abfragen für dynamische Tabellen mit dynamischem SQL ausführen. Solange das String-Literal "@DBNAMEVAR" nirgendwo anders in Ihrer Abfrage erscheint, sollte dies funktionieren. Um Ihre Abfrage in eine Zeichenkette zu konvertieren, ersetzen Sie einfach jedes einzelne Anführungszeichen durch zwei einfache Anführungszeichen und setzen Sie dann ein einfaches Anführungszeichen und den Anfang und das Ende.

HINWEIS: Dies ist anfällig für SQL-Injektion, also bereinigen Sie diese Eingabe oder jemand könnte Ihre Datenbank bitten, etwas zu tun.

DECLARE @DBNAMEVAR nvarchar(100); SET @DBNAMEVAR = 'MYBASE_01'; 
DECLARE @sql nvarchar(max); 

SET @sql = REPLACE('SELECT USER_FNM FROM @DBNAMEVAR.DBO.USERS','@DBNAMEVAR',@DBNAMEVAR) 
EXEC(@sql) 
+1

Bitte beachten Sie, dass dies anfällig für SQL-Injektion ist. –

+0

['QUOTENAME'] (https://docs.microsoft.com/sql/t-sql/functions/quoteame-transact-sql) ist dein Freund. –

+0

@JeroenMostert danke für den Tipp! Ich habe den Befehl schon einmal gesehen, aber nie irgendwo angewendet. – EMUEVIL

Verwandte Themen