2017-07-06 121 views
2

我想檢測MS SQL DB中以'NAV'開頭的數據庫。我使用此代碼試了一下:SQL錯誤 - 關鍵字'Database'附近的語法不正確

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

但我得到的錯誤信息:

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

知道什麼是錯的呢?

+1

這樣做...'declare @sql varchar(4000)=('USE'+ @DBName); print(@sql)',你會發現你至少需要一個空間(假設查詢只返回一個結果)。在嘗試執行動態SQL之前打印動態SQL總是很好,因此您可以看到實際執行的內容。 – scsimon

+0

您是否在使用'sa'來運行該查詢? – Alfabravo

+0

有關SQL Server的動態SQL問題的強制鏈接:http://www.sommarskog.se/dynamic_sql.html –

回答

2

把一個空間的使用後,把各地的數據庫名稱括號:

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

或者使用[QUOTENAME](https://docs.microsoft.com/zh-cn/sql/t-sql /函數/ quotename-transact-sql) – scsimon

3

我不知道在錯誤信息的關鍵字數據庫,但我點問題: 您連接USE和沒有空格的數據庫名稱:USENAV01不起作用。你應該使用'USE ' + QUOTENAME(@DBName)

其次,我不知道意圖是什麼,但是如果你做EXECUTE ('USE ' + @DBName);後跟其他(動態)查詢,則會在你的當前連接上執行以下查詢。換句話說,USE XXX對以下查詢無關緊要。第三,正如Jesse在下面的評論中提到的那樣;如果你有多個數據庫,其中有一個name like '%NAV%'(你的問題就是這個建議),那麼你的代碼只能被其中一個數據庫執行。沒有order by,哪一個將是不可預測的。如果你想執行所有相關數據庫的代碼,你必須循環遍歷它們。

+1

關於後續查詢的很好的一點。我希望這是一個水落下的例子,動態sql更長,並且值得動態。 – scsimon

+1

除此之外,如果有超過1個數據庫(如%NAV%),則此代碼將因爲您只能將一個分配給變量而中斷。你必須使用一個臨時表並循環來更精確。 – Jesse

+0

@Jesse,好點,補充回答。 – HoneyBadger

相關問題