2011-01-14 41 views
1

我有幾個我正在管理的數據庫,每個數據庫都需要一個特定存儲過程的副本。如何避免存儲過程中的T-SQL錯誤?

問題是,存儲過程將插入到除其中一個數據庫之外的所有數據庫的表中。對於那個數據庫,表是分區視圖,不可更新,我不需要插入。

我試圖做類似如下:

CREATE PROCEDURE st_doit AS 
    -- Do lots of other stuff... 
    IF(DB_NAME() <> 'db3') BEGIN 
     INSERT INTO mytable...; 
    END 

試圖在db3執行,因爲INSERT語句的存儲過程時,我還得到一個錯誤信息,即使該數據庫中,插入不會實際執行。將INSERT包含在TRY...CATCH塊中也沒有幫助。

爲了便於維護,我真的很想避免在db3有一個特殊的程序副本。通常,我不會在過程中使用像這樣的IF語句,但在這種特殊情況下,它確實是最好的解決方案,並且隨着時間的推移,它不會隨着時間的推移而成長爲一堆其他特殊情況。

那麼,如何強制SQL Server執行存儲過程,並且只有如果我實際嘗試插入到表中,會生成一個錯誤?

編輯:由於使用動態SQL對我來說有點太亂了,我的最終解決辦法是保持IF塊作爲一個陷阱,但內db3註釋掉這些塊。不理想,但有效。幸運的是,我不會經常改變這個SP,但我想要在每個數據庫中都有一個「完整的」副本。

回答

2

你不得不「躲」使用動態SQL的SQL Server的INSERT。

CREATE PROCEDURE st_doit AS 
    -- Do lots of other stuff... 
    IF(DB_NAME() <> 'db3') BEGIN 
     EXEC SP_EXECUTESQL N'INSERT INTO mytable...'; 
    END 
+0

哇,這很不幸。 :( – richardtallent 2011-01-14 20:46:36

3

我認爲唯一的方法是使用動態SQL

if(objectproperty(object_id('dbo.MyTable'), 'isUserTable') = 1) begin 
    -- insert the value 32 into MyColumn of MyTable 
    exec sp_executesql 
     N'insert into MyTable(MyColumn) values(@MyColumnParam)', 
     N'@MyColumnParam int', 
     32 

end 
+0

Upvoted使用objectproperty和參數。 – richardtallent 2011-01-14 20:48:56

0

對於IF塊內的零件,是否可以/更方便地使用SP?只有DB3這將是一個虛擬SP無所事事,併爲所有其他執行實際插入。原始的SP對於每個數據庫都是一樣的。編輯:當然,這將需要支持兩個「類似」SP,但我可以想象當初始SP非常複雜時,這種方法的一些實用性,因此特殊情況可能更容易維護第二個是較小的一個,它可以插入或不插入。