2011-01-05 83 views
0

這是SQL服務器存儲過程中的代碼。我已經聲明瞭常量@other_db在查詢中使用它。對於我能夠做到的簡單查詢,如下所述。不斷查詢存儲過程

DECLARE @other_db VARCHAR(50) 

    SET @other_db = 'BABMwork8_22_1210_0012' 

    UPDATE BABMwork8_22_1210_0012.dbo.concessions SET double_ones = '' WHERE double_ones = 'Yes' 

    EXEC('UPDATE @other_db.dbo.concessions SET double_ones = '+''+' WHERE double_ones = '+'Yes') 

而對於查詢下面提到的,我想使用常量@other_db更換BABMwork8_22_1210_0012的價值。

UPDATE concessions SET double_ones = 'Yes' 
        WHERE (concession IN(SELECT concession FROM BABMwork8_22_1210_0012.dbo.concessions WHERE 
             (manuell_archive_delete! = 'Delete' OR manuell_archive_delete IS NULL) AND 
             (double_action = 'ok_invoice' OR double_action is NULL)) 
          OR concession IN(SELECT Concession FROM BABMwork8_22_1210_0012.dbo.invoicing WHERE 
             (can_invoiced is NULL OR can_invoiced != 'No') AND 
             (double_action = 'ok_invoice' OR double_action is NULL))) 
          AND (double_action = 'ok_invoice' OR double_action is NULL) 
          AND (manuell_archive_delete! = 'Delete' OR manuell_archive_delete IS NULL) AND 
           source!= 'PARK' 

儘管我嘗試使用EXEC它變得越來越複雜。我有幾個查詢,如果有任何簡單的方法來使用常量。

感謝您的幫助!

+0

你將如何執行此查詢?如果手動,我認爲'sqlcmd'模式可能會有所幫助。 http://www.simple-talk.com/sql/sql-tools/the-sqlcmd-workbench/ – 2011-01-05 11:25:56

+0

@Martin - 我的前端是PHP。點擊一個按鈕後,在後臺調用存儲過程。 – satya 2011-01-05 11:31:11

+0

你必須使用動態SQL和'EXEC'或'sp_executesql',因爲我認爲你正在做這件事。數據庫名稱無法參數化,並且不支持數據庫同義詞(如果併發不是問題,這可能會有所幫助) – 2011-01-05 11:39:43

回答

2

好的,有幾種方法可以做到這一點。

您可以在開始時定義並填充臨時表,並使用動態執行查詢結果填充臨時表。然後在你寫的t-sql中,只需用臨時表名替換BABMwork8_22_1210_0012即可。

樣本:

CREATE TABLE #BABMworkInv 
    (col1 varchar, col2 varchar, col3 int....) 

INSERT #BABMworkInv 
    EXEC ('select * from ' + @other_db + '.dbo.invoicing') 

UPDATE concessions SET double_ones = 'Yes' 
        WHERE (concession IN(SELECT concession FROM #BABMworkInv WHERE 
             (manuell_archive_delete! = 'Delete' OR manuell_archive_delete IS NULL) AND 
             (double_action = 'ok_invoice' OR double_action is NULL)) 
          OR concession IN(SELECT Concession FROM #BABMworkInv WHERE 
             (can_invoiced is NULL OR can_invoiced != 'No') AND 
             (double_action = 'ok_invoice' OR double_action is NULL))) 
          AND (double_action = 'ok_invoice' OR double_action is NULL) 
          AND (manuell_archive_delete! = 'Delete' OR manuell_archive_delete IS NULL) AND 
           source!= 'PARK' 

第二種方法是創建函數,將接受數據庫名稱作爲參數,並返回表結果。然後你可以使用如下代碼:Select * from dbo.MyFunction(@other_db)

+0

Thanku for your reply。如所建議的,創建臨時表然後轉儲數據。但我使用了另一個數據庫中的很多表,這導致大量的臨時表。這是性能問題還是..? – satya 2011-01-05 11:57:02

+0

如果您發佈的是代碼或XML,請**在文本編輯器中突出顯示這些行,然後單擊編輯器工具欄上的「代碼示例」按鈕({}),以便對其進行精確格式化和語法突出顯示! – 2011-01-05 12:32:45

+0

marc_s,對不起,謝謝,我是這個新手 – HABJAN 2011-01-05 13:29:24