2012-07-05 58 views
0

讓我們假設我有一個數據庫。讓我們把這個數據庫稱爲Utils。在Utils我有2個功能。好吧,讓我說我目前在db MyDatabase工作。我需要計算表中的一些字段。這就是我目前做到這一點:我的select語句看起來像下面這樣的在列上運行兩次函數

SELECT *, 
    column1= UTILS.dbo.Function1(ID) 
    column2 =UTILS.dbo.Function1(Name 
    column3 =UTILS.dbo.Function1(Address) 
INTO ##temp_table1 
FROM MyDatabase.dbo.Customers 


SELECT *, 
    column1= UTILS.dbo.Function2(ID) 
    column2 =UTILS.dbo.Function2(Name 
    column3 =UTILS.dbo.Function2(Address) 
INTO ##temp_table2 
FROM MyDatabase.dbo.Customers 

的問題是,我不只是要calcualted 3列。我有大約100個。所以我真的不想重複兩次select語句,因爲如果出現變化,我必須在兩個容易出錯的地方更改它,使我的腳本非常長,難以閱讀和其他問題。

我的解決方案

USE Utils; GO;  
    DECLARE @strSQL VARCHAR(MAX) 
    SET @strSQL = '  
     SELECT *, 
       column1= UTILS.dbo.temp_function(ID) 
       column2 =UTILS.dbo.temp_function(Name 
       column3 =UTILS.dbo.temp_function(Address) ' 

    exec sp_rename 'UTILS.dbo.Function1' ,'temp_function' 
    exec (@strSQL + 'into temp_table1 FROM Customers') 
    exec sp_rename 'temp_function' ,'UTILS.dbo.Function1' 

    exec sp_rename 'UTILS.dbo.Function2' ,'temp_function' 
    exec (@strSQL + 'into temp_table2 FROM Customers') 
    exec sp_rename 'temp_function' ,'UTILS.dbo.Function2' 

但我不喜歡這個解決方案,因爲我必須要改變數據庫使用sp_rename。它也給我小心。 MSDN建議反對它。

解決此問題的好方法是什麼?

+0

像需要一些輕的複製/粘貼工作,只要查詢1點的變化在我看來。對數據庫和對象名稱保持「強類型」遠遠好於100多行代碼,這些代碼看起來很容易維護。 – 2012-07-05 19:24:29

+0

如果這必須在數據庫中完成,而不是在應用層中使用EF或LINQ to SQL等自動生成的類來完成,我認爲維護的最佳方法是使用sys模式。在不寫出整個解決方案的情況下,您可以編寫一個遊標來遍歷將sys.columns加入到sys.tables的查詢並構建一個可以通過exec()獲取結果的字符串。 – 2012-07-05 23:50:23

回答

0

您可以輕鬆地改變你的解決方案如下避免使用sp_rename:

USE Utils; GO;  
DECLARE @strBaseSQL VARCHAR(MAX) 
     ,@strSQL VARCHAR(MAX) 

SET @strBaseSQL = '  
    SELECT *, 
      column1= UTILS.dbo.temp_function(ID) 
      column2 =UTILS.dbo.temp_function(Name 
      column3 =UTILS.dbo.temp_function(Address) ' 

SELECT @strSQL = REPLACE(@strBaseSQL, 'UTILS.dbo.temp_function', 'UTILS.dbo.function1') 
EXEC (@strSQL + 'into temp_table1 FROM Customers') 

SELECT @strSQL = REPLACE(@strBaseSQL, 'UTILS.dbo.temp_function', 'UTILS.dbo.function2') 
EXEC (@strSQL + 'into temp_table2 FROM Customers')