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建議反對它。
解決此問題的好方法是什麼?
像需要一些輕的複製/粘貼工作,只要查詢1點的變化在我看來。對數據庫和對象名稱保持「強類型」遠遠好於100多行代碼,這些代碼看起來很容易維護。 – 2012-07-05 19:24:29
如果這必須在數據庫中完成,而不是在應用層中使用EF或LINQ to SQL等自動生成的類來完成,我認爲維護的最佳方法是使用sys模式。在不寫出整個解決方案的情況下,您可以編寫一個遊標來遍歷將sys.columns加入到sys.tables的查詢並構建一個可以通過exec()獲取結果的字符串。 – 2012-07-05 23:50:23