2009-07-16 73 views
1

這裏是情況。由於我必須使用數據庫的設計,因此我需要編寫一個存儲過程,以便我可以傳遞的名稱,以便儘可能地查詢。有問題的程序會按工作進行處理,每個工作都會在數據庫中創建自己的表,例如IE table-jobid1,table-jobid2,table-jobid3等。不幸的是,我無法對此設計做任何事情 - 米卡住了它。SQL Server 2005 - 通過參數查詢表的名稱

但是,現在,我需要對這些個性化表進行數據挖掘。如果可能,我想避免在代碼文件中執行SQL。理想情況下,我想有一個存儲過程類似於:

SELECT * 
FROM @TableName AS tbl 
WHERE @Filter 

這甚至可能在SQL Server 2005中?任何幫助或建議將不勝感激。如果不可能,也可以採用其他方法來保持SQL遠離代碼。

謝謝你的時間。

+0

這可能是一種情況,SQL技術代碼文件很有意義。我認爲你要麼有,要麼@BBlake說的基本上是一樣的,只是代碼存儲在SQL Server中。 – JasonS 2009-07-16 16:23:59

+0

個人而言,我實際上並不介意在後面的代碼中執行SQL的想法,我只是想盡可能避免這樣做,以便保持代碼清潔。 @BBlake - 這看起來像一個潛在的解決方案。就像我所說的,我的主要目標是讓SQL遠離代碼隱藏,所以只要我可以返回結果集,我很高興。感謝指針,我會進行調查。 – Clyde 2009-07-16 16:39:07

回答

4
我能想到的最好的

的解決方案是建立你的SQL在存儲過程中,如:

@query = 'SELECT * FROM' + @tablename + '爲TBL WHERE' + @Filter

exec(@query)

可能不是一個理想的解決方案,但它的工作原理。

+0

再次感謝。這讓我有機會看到動態SQL,這在我的目的中很好用。 – Clyde 2009-07-20 18:26:34

0

這將是一個沒有意義的存儲過程。使用一些參數從某個表中選擇?你基本上是在定義整個查詢,無論你用什麼來調用這個過程,所以你可以自己生成sql。

我會做一個動態sql編寫過程的唯一原因是如果你想做一些你可以改變而不需要重新部署代碼庫的東西。 但是,在這種情況下,您只是SELECT *'ing。由於您試圖將它用於多個表,因此您不能以不同的方式定義列,子句或順序,因此不會對其進行有意義的更改。

總之:這甚至不值得去做。只需在你的代碼中放下你的表特定的sprocs或者把你的sql寫入字符串(但是確保它是參數化的)。

+0

嗯,事情是,雖然它是多個表格,但都是同一張表格。每個作業都只是獲取自己的表副本,相同的模式,相同的列,相同的所有內容,只是一個不同的名稱。寫表格特定的sprocs也是不可能的。一個項目可以有多項工作 - 最近完成的項目有超過一萬七千個工作,每項工作處理10,000到1,000,000條記錄。 – Clyde 2009-07-18 20:23:59

1

我能想到的最佳答案是建立一個視圖,將所有表聯合在一起,視圖中的id列告訴您視圖中的數據來自何處。然後,您可以簡單地將該ID傳遞到存儲的proc中,這將違背視圖。這是假設您正在查看的表都具有相同的模式。

例如:

create view test1 as 

select * , 'tbl1' as src 
from job-1 
union all 
select * , 'tbl2' as src 
from job-2 
union all 
select * , 'tbl3' as src 
from job-3 

現在您可以選擇從測試1 *其中SRC =「TBL3」,你將只能從表中獲取的記錄工作,3