2012-05-02 42 views
11

有一些辦法可以阻止Changed database context to ...消息時,一塊的SQL中有一個USE database如何阻止「更改數據庫上下文來......」消息

+1

你從哪裏得到這些信息?我以前從來沒有見過。 –

+0

@ ta.speot.is你會看到它們,例如,當使用'SQLCMD.exe'時? –

回答

22

你需要設置sqlcmderrorlevel,缺省值爲0注意:不要與返回,說,cmd.exe作爲ERRORLEVELsqlcmd退出代碼在這裏混淆錯誤級別。

要爲所有的sqlcmd會話的禁用此消息,使用-m命令行選項:

sqlcmd -m 1 <other options> 

要的代碼塊禁用此消息,使用:setvar批處理命令:

USE [mydb] 
GO 

-- Disable message for next USE command 
:setvar SQLCMDERRORLEVEL 1 
USE [mydb] 
GO 

-- Reenable 
:setvar SQLCMDERRORLEVEL 0 

... 

要在Management Studio中使用:setvar(或其他SQLCMD批處理命令),您需要爲您所在的查詢窗口(菜單「Query/SQLCMD Mode」)啓用SQLCMD模式。當以':'開頭的行具有灰色背景時,您會看到它已啓用。

+0

非常好,工作過。感謝您的幫助 – SteveC

+0

嗨,我在運行使用delphi構建的應用程序時收到了此消息。我需要在兩者之間修改數據庫。您的方式正在SQL管理工作室中工作,但是當我嘗試從代碼傳遞cmd時,我得到了錯誤,因爲「語法附近的語法不正確。」是否有人有此解決方案? – kvsbhavani

+1

@ kvsbhavani這是預期的:':setvar'語法是所謂的「批處理模式」的一部分,它只被SQLCMD.EXE和SSMS支持(參見我的答案的最後一段)如果你正在處理它代碼中,我建議你發佈一個新的問題,關於SO –

5

另一個想法是在您的SQL中使用三部分名稱,例如而不是...

USE Pubs; SELECT name FROM dbo.Authors;

...寫信...

SELECT name FROM Pubs.dbo.Authors;

+0

感謝您的指針...不知道我看中非模糊我的代碼:-) – SteveC

+0

我試過了。 - 它沒有在這裏工作 – Algoman

+0

可能也沒有用於工作我因爲我連接後仍然有mssql_select_db調用(afaik也發出USE命令)...我不知道 - 我通過在每次USE後添加SELECT 1(如user2335044建議)來解決此問題 – Algoman

1

在我的情況下,容易和簡單的解決辦法是先運行一個小的查詢,如SELECT 1; 。消息Changed database context...因此與此第一個查詢相關聯,並且在沒有此錯誤消息的情況下檢索了以下查詢。

5

我具有SQLCMD運行目錄中的所有我的.sql腳本發佈更新。但是當你用USE myDB啓動所有的東西的時候,你會在日誌文件中得到一個重複更改的上下文消息,這個消息很枯燥。所以我使用這一個班輪代替。如果上下文實際發生了變化,您仍然會收到該消息,這很好。

IF EXISTS(SELECT DB_NAME() WHERE DB_NAME()NOT IN( 'MYDB'))使用MYDB

+0

這是一個好主意,因爲這意味着我可以在查詢窗口中運行腳本(無需打開SQLCMD模式)並將它與SQLCMD一起使用,而不會由於重複的上下文更改輸出而掩蓋錯誤消息。 – LawrenceF

相關問題