簡體   English   中英

如何在名稱作為參數提供的用戶定義函數中聯接表?

[英]How to join a table within a user defined function whose name is provided as parameter?

上下文

我的SQL Server數據庫中有三個表:1)學校,2)學院,3)大學。

然后,我有另一個表:標簽。

三個表( 學校,學院,大學 )中的每個表都可以具有與之關聯的標簽 為此,我有三個關聯表: SchoolTags,CollegeTags,UniversityTags

問題

我正在嘗試創建一個用戶定義的函數,該函數將關聯表的名稱作為參數(即“ SchoolTags”)和實體的ID(學校/學院/大學),並將返回與該EntityId相關聯的標記的列表。

我遇到的問題是我必須將Tag與名稱作為參數進入的表連接起來。 為此,我正在創建一個動態查詢。 而且我們不能在SQL Server用戶定義函數中運行動態查詢。

知道如何實現嗎?

注意:我想要創建時使用單獨的關聯表,並且不想將它們轉換為通用關聯表,也不想基於函數中的表名添加If-Else ,以便在創建新關聯表時,我不需要更新我的功能。

我正在使用Microsoft SQL Server。

任何一種語言,你使用,你可能會使用if

begin
    if table = 'school' then
    begin
        . . .
    end;
    else if table = 'college' then
    . . .
end;

確切的語法取決於您所使用的數據庫的腳本語言。

考慮為一個 EducationInstitution表和一個 JoinEducTags表以相關的邏輯分組規范化數據庫。 這些表聽起來像它們保持相同的結構,但具有不同的類型,因此應將它們保存在學校學院大學等具有不同“ 類型”字段的一個表中。

然后,為所有三組之間的一對多關系添加必要的約束,主/外鍵:

數據庫架構圖

您永遠不需要為每種新類型繼續調整架構(即添加表)。 使用這種方法,您的用戶定義函數將只需要接收值參數,而不是要在動態查詢中運行的表之類的標識符。 最后,這種方法通過有效的存儲可以更好地擴展。 正如您將看到的,標准化可以節省復雜的查詢。

您想要的是不可能的。 您不能將表名作為參數傳遞給UDF,並且不能在UDF中使用動態sql來創建和執行特定於作為參數傳遞的表的語句。 您已經知道別無選擇,只能在UDF中使用if-else語句來實現您的目標-這是您夢pipe以求的“架構更改時無需更新(或驗證)代碼”(是的-我改寫它以使您的問題更加明顯)。

可能還有其他方法可以實現某些有用的功能-但我建議您考慮得太遠了,並試圖在沒有明確目的的情況下實現泛型功能。 這是一個非常困難且容易出錯的路徑,需要復雜的tsql技能。

並且要重申先前的響應,您有一個模式問題。 您特意創建了三個不同的實體-現在,您想要一個通用函數與它們中的任何一個一起使用。 因此,在花大量時間在這個特定方面之前,您應該花一些時間仔細考慮一下您打算如何使用這些表(即針對這些表編寫查詢)。 如果您發現自己經常使用聯合將這些實體組合成一個公共結果集,那么您的實際業務與您的模型(架構)可能不匹配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM