2017-07-06 9 views
2

Ich möchte Datenbanken beginnend mit 'NAV'in einer MS SQL DB erkennen. Ich versuchte es mit diesem Code:SQL-Fehler - Falsche Syntax in der Nähe des Schlüsselwortes 'Datenbank'

DECLARE @DBName NVARCHAR(MAX); 
SET @DBName = (SELECT name FROM master.dbo.sysdatabases where name LIKE '%NAV%'); 
EXECUTE ('USE' + @DBName); 

Aber ich habe die Fehlermeldung:

Msg 156, Level 15, State 1, Line 1 
Incorrect syntax near the keyword 'Database'. 

Sie wissen, was es falsch ist?

+1

tun Sie dies ... 'deklarieren @sql varchar (4000) = ('USE' + @DBName); Drucken Sie (@sql) 'und Sie werden sehen, dass Sie ein Leerzeichen auf einem Minimum benötigen (vorausgesetzt, dass die Abfrage nur ein Ergebnis zurückgibt). Es ist immer gut, den dynamischen SQL auszudrucken, bevor Sie ihn ausführen, damit Sie sehen können, was gerade ausgeführt wird. – scsimon

+0

Verwenden Sie 'sa', um diese Abfrage auszuführen? – Alfabravo

+0

Obligatorischer Link für dynamische SQL-Fragen für SQL Server: http://www.sommarskog.se/dynamic_sql.html –

Antwort

2

Setzen Sie einen Raum nach dem Gebrauch und setzen Klammern um den Namen der Datenbank:

DECLARE @DBName NVARCHAR(MAX); 
SET @DBName = (SELECT name FROM master.dbo.sysdatabases where name LIKE '%NAV%'); 
EXECUTE ('USE [' + @DBName + ']'); 
+0

Oder verwenden Sie [QUOTENAME] (https://docs.microsoft.com/en-us/sql/t-sql/functions/quoteename-transact-sql) – scsimon

3

Ich bin mir nicht sicher über die Keyword-Datenbank in der Fehlermeldung, aber ich habe vor Ort Probleme: Sie verketten USE und die Datenbankname ohne Leerzeichen: USENAV01 funktioniert nicht. Sie sollten 'USE ' + QUOTENAME(@DBName) verwenden.

Zweitens, ich weiß nicht, was die Absicht ist, aber wenn man EXECUTE ('USE ' + @DBName); von anderen (dynamisch) Abfragen gefolgt tut, werden die folgenden Anfragen auf Ihrer aktuellen Verbindung ausgeführt. Mit anderen Worten, die USE XXX spielt für die folgenden Abfragen keine Rolle.

Drittens, wie von Jesse im folgenden Kommentar erwähnt; Wenn Sie mehr als eine Datenbank mit einer name like '%NAV%' haben (die Ihre Frage vorschlägt), wird Ihr Code nur für eine dieser Datenbanken ausgeführt. Welcher ist, ist ohne eine order by unvorhersehbar. Wenn Sie Code für alle relevanten Datenbanken ausführen möchten, müssen Sie sie durchlaufen.

+1

sehr guter Punkt auf die folgenden Abfragen. Ich hoffe, dass dies ein wassergefülltes Beispiel war und der dynamische Sql länger ist und es verdient, dynamisch zu sein. – scsimon

+1

Darüber hinaus, wenn es mehr als 1 Datenbank wie% NAV% gibt, wird dieser Code brechen, wie Sie nur einer Variablen zuweisen können. Sie müssten eine temporäre Tabelle verwenden und durchgehen, um genauer zu sein. – Jesse

+0

@Jesse, guter Punkt, hinzugefügt, um zu antworten. – HoneyBadger

Verwandte Themen