2008-12-02 54 views
1

我有一個view_name字段(varchar(256))的表,我想在sql查詢中使用該字段。如何使用存儲在字段中的查看名稱進行sql查詢?

實施例:

TABLE university_members

ID |鍵入| view_name |算上

1 |教授| view_professors | 0

2 |學生| view_students2 | 0

3 |員工| view_staff4 | 0

而且我想與相應的視圖(例如..SET count = SELECT count(*) FROM view_professors)計算的一些彙總,更新所有行。

這可能是一個新手的問​​題,我猜它要麼顯然是不可能的或微不足道的。值得讚賞的是對設計的評論,即在這裏處理元數據的方式(明確地將DB對象名稱存儲爲字符串)。雖然我無法控制這種設計(所以我必須找出答案),但我猜測它並不那麼幹淨,儘管一些外部約束決定了它,所以我非常感謝社區對我的個人利益的看法。

我使用SQL Server 2005,但跨平臺的答案是受歡迎的。

回答

2

要做到這一點,你必須做一點動態SQL,這樣的事情可能會奏效,顯然你需要進行編輯才能真正匹配你想要做的事情。

DECLARE @ViewName VARCHAR(500) 

SELECT @ViewName = view_name 
FROM University_Members 
WHERE Id = 1 

DECLARE @SQL VARCHAR(MAX) 

SET @SQL = ' 
UPDATE YOURTABLE 
SET YOURVALUE = SELECT COUNT(*) FROM ' + @ViewName + ' 
WHERE yourCriteria = YourValue' 

EXEC(@SQL) 
0

我看到它的方式,你可以生成一個VARCHAR(MAX)變量的SQL代碼,然後使用EXEC關鍵字執行它。就像你試過的那樣,我不知道有什麼辦法可以直接做。

例子:

DECLARE @SQL VARCHAR(MAX) 
SET @SQL = '' 
SELECT @SQL = @SQL + 'UPDATE university_members SET count = (SELECT COUNT(*) FROM ' + view_name + ') WHERE id = ' + id + CHAR(10) + CHAR(13) FROM university_members 

EXEC @SQL 

警告!此代碼未經測試。這只是一個提示...

0

正如HLGEM所寫,您被迫使用動態SQL的事實表明設計本身存在問題。我還會指出,像這樣在表格中存儲聚合很可能是另一個糟糕的設計選擇。

如果你需要在某個點確定的值,然後做,當你需要它。試圖保持一個類似於您的數據同步的計算值幾乎總是充滿了問題 - 不準確,額外的開銷等。

有非常罕見的情況下,存儲這樣的值是必要的或給予優勢,這些都是通常在非常大的數據倉庫或具有極高吞吐量的系統中。這不是學校或大學可能遇到的問題。

相關問題