2009-10-16 44 views
4

我們有時會編寫重命名錶或列並具有其他複雜邏輯的數據端口腳本。我們還在引用這些舊列或表的IF語句中使用SQL。我們有一個使用IF語句的標準來使得我們的SQL腳本能夠很好地運行。禁用SQLCMD語法檢查

然而,即使if語句的計算結果爲false,封裝在代碼塊中的代碼出錯了,但我猜測是因爲語法檢查。

if 1 = 0 
begin 

    select * from mydatabase.dbo.mytable; -- doesn't execute, but still errors because doesn't exist 

end 

另一個奇怪的是它並不總是一致的,有時它工作正常。

有沒有人知道我是否可以通過腳本禁用這些腳本檢查的方式。

感謝

注意

我知道人們會說,他們嘗試過類似的情況,並沒有錯誤。起初對我來說,它在SSMS中沒有錯誤,但在SQLCMD中出錯。

sqlcmd MyTestScript.sql -r 1 -U user -P password 

然後我把SSMS以SQLCMD模式查詢 - > CMDMODE,它仍然沒有給出錯誤。 然後重新運行幾次後,它開始出現錯誤。

+0

我不認爲這是可以做到的,但我會看着你的答覆。 – 2009-10-16 17:32:57

回答

1

我認爲在存儲過程中構建的execute_sql可以解決這個問題。

+0

是的,動態代碼會支持這個。 – 2009-10-16 18:26:09

0

在你的開發環境

DROP Procedure dbo.#TestProc 
GO 
CREATE Procedure dbo.#TestProc 
AS 

IF 1=0 
BEGIN 
SELECT 1 FROM XXXXX 
END 
ELSE 
BEGIN 
SELECT * 
FROM Information_Schema.Tables 
WHERE Table_Name = 'XXXXX' 
END 

GO 
EXEC#TestProc 

它編譯運行下面的代碼。它執行。它在編譯或執行期間不會出錯。

我使用SQL 2005

你可以從結果看,沒有所謂的XXXXX表。

我認爲你的條件實際上正在滿足和代碼執行。


淡香水

我去進一步比我打字:

的存儲過程被創建並運行以下

SELECT * FROM XXXXX.XXXXX /* owner XXXXX */ 
SELECT * FROM XXXXX.XXXXX.XXXXX /* database XXXXX */ 

代碼炸彈的每一個出當我完全符合名稱

SELECT * FROM XXXXX.XXXXX.XXXXX.XXXXX /* linked server XXXXX */ 

現在它爲鏈接的服務器找到並且沒有找到並引發錯誤。

Msg 7202, Level 11, State 2, Procedure #TestProc, Line 6 
Could not find server 'XXXXX' in sys.servers. 
Verify that the correct server name was specified. 
If necessary, execute the stored procedure sp_addlinkedserver 
to add the server to sys.servers. 
Msg 2812, Level 16, State 62, Line 1 
Could not find stored procedure '#TestProc'. 
0

鈍器,但你可以忽略錯誤。

:On Error ignore在腳本中?

-b和-V忽略「嚴重性< V」(未嘗試過)。可能對檢測「無對象」錯誤很有用,但當出現真正的錯誤時,將自己置於高於V的嚴重程度。

See SQLCMD in MSDN

2

嘗試使用的try-catch塊,易於使用和優雅。

如果1 = 0
BEGIN TRY
SELECT * FROM mydatabase.dbo.mytable;
END TRY
BEGIN CATCH
--error處理代碼
SELECT ERROR_MESSAGE()
END CATCH