2014-05-15 26 views
1

簡而言之,我管理一組版本化的SQL腳本,其中一個要求是它們需要向後兼容,因爲可以多次執行相同的腳本,仍然可以保證最終版本具有相同的最終結果。基本上說,我們在版本3上。我們需要能夠反覆運行版本1,2和3的腳本,沒有錯誤,並且仍然保證最終結果是相同的完整版本3.SQL - 如何:然後在沒有動態SQL的同一腳本中執行GO(執行新查詢)?

現在在正常情況下這很容易(只需檢查column/table/type是否正確,如果不是則創建/修改),但是如何處理例如長度超過8000個字符且不能作爲動態SQL執行的觸發器?在安裝版本2時,觸發器被刪除,最後創建新的觸發器以匹配v2的數據模型。但是,如果v3刪除了v2觸發器引用的列之一,則該觸發器現在將失敗。

我無法進行任何形式的IF檢查來查看我們的日誌是否有v3腳本,或者數據模型是否與要求不匹配。我討厭讓別人做體力勞動來做一些我肯定可以自動化的方式。那麼有沒有什麼好的噱頭,訣竅或只是我錯過了,可以幫助?

感謝您的幫助。 :)

回答

1

但你如何處理一個觸發器的方式超過8000個字符長,並且不能作爲動態SQL執行?

它可以使用sp_executesql執行,其中sql語句的大小僅受可用數據庫服務器內存的限制。

您需要檢查對象是否存在,並在需要或刪除時創建它。

if object_id(N'your_table_name','U') is null 
CREATE TABLE 
... 
GO 
/* add column */ 
if not exists (select * from sys.columns 
       where object_id=object_id('TableName','U') and name='ColumnName') 
ALTER TABLE TableName 
ADD ColumnName 
GO 
/* creating Stored Procedure */ 
if object_id(N'ProcedureName','P') is null 
EXEC sp_executesql N'CREATE PROCEDURE ProcedureName AS print 1' 
GO 

ALTER PROCEDURE ProcedureName 

AS 
/*your actual code here*/ 
GO 

/* and so on */ 

對象類型object_id功能,你可以看到here

+0

太棒了。謝謝一堆!我之前嘗試過使用sp_executesql,但由於當時忙,我錯過了你似乎無法用GO執行多個查詢,但我可以將它們分成幾批sp_executesql,所以這是完美的! :) – Kahn

+0

@Kahn很高興幫助:) –