2015-08-26 32 views
1

我們有一個基於傳入的參數更新某些表的過程,特別是某個狀態。我在組織上知道這個問題可以通過對這些數據使用單個表來消除,但這不是一個選項 - 這不是我的數據庫。基於存儲過程參數設置表

要更新這些表,我們運行一個存儲過程。唯一的問題是每個狀態都有一個存儲過程,這使得代碼更新變得很糟糕。爲了儘量減少需要維護的代碼量,我們希望轉向一個存儲過程,該過程需要一個狀態參數,並更新正確的表。我們希望沒有50條If語句,所以我認爲這樣做的唯一方法是將SQL代碼保存爲文本,然後執行該字符串。 IE:

SET @SSQL = 'UPDATE TBL_' + @STATE +' SET BLAH = FOO' 
EXEC @SSQL; 

我想知道是否有辦法做到這一點,而不使用字符串來更新基於該參數的正確表。這些存儲過程長達數千行。

謝謝大家!

回答

0

而是整個腳本保存爲SQL文本並執行它,就像使用類似的代碼更新所需的表下方,因爲你需要在那裏休息繼續,因爲它是

EXEC('UPDATE TBL_' + @STATE +' SET BLAH = FOO') 
0

你可以,事實上,使用動態SQL( exec函數) - 但是存儲過程冗長複雜,確實可怕。

多年前遇到類似問題時,我們通過運行一種「郵件合併」來創建存儲過程。我們將編寫該過程以針對單個表進行工作,然後將表名替換爲變量,並使用PHP腳本通過將表名存儲在CSV文件中來爲每個表輸出存儲過程。 你可以用你選擇的任何腳本語言複製它 - 大概需要一天時間才能完成這個工作。它具有額外的好處,可以讓我們輕鬆地將存儲的proc模板存儲在源代碼控制中。

0

您可以安全地使用比簡單的EXEC命令更合適的sp_executesql。要做到這一點,即使在輸入和輸出參數:

DECLARE @sql  nvarchar(4000), 
     @tablename nvarchar(4000) = 'YOUR_TABLE_NAME', 
     @params nvarchar(4000), 
     @count  int 

SELECT @sql = 
    N' UPDATE ' + @tablename + 
    N' SET Bar = @Foo;' + 
    N' SELECT @count = @@rowcount' 

SELECT @params = 
    N'@Foo int, ' + 
    N'@count int OUTPUT' 

EXEC sp_executesql @sql, @params, 2, @count OUTPUT 
SELECT @count [Row(s) updated] 

我建議你閱讀這篇文章的相關部分mentionned here