2013-02-18 85 views
0

我對SQL Server非常陌生,我給了一個賦值來創建一個函數(這是我以前從未做過的)。創建一個從備用表和數據庫獲取數據的函數

以下是函數應該執行的操作: 數據庫中有三個表具有出生日期。其中兩個表位於database1中,而第三個表位於database2中。

所以我的功能需要(當被調用/使用)進入數據庫1和表1以查看特定人員的出生日期是否可用。如果是的話,抓住那個價值。如果否,則查看錶2.最後,如果兩個表都沒有出生日期,則轉到數據庫2和表3以獲取出生日期。

這可能嗎?函數可以從兩個不同的數據庫中獲取數據嗎?

任何幫助表示讚賞!

謝謝!

+0

它可能是也可能不是可能的。您必須編寫函數的事實與您是否必須訪問多個數據庫無關。這是一個權限問題。我建議你先寫一個查詢,然後把查詢轉換成一個函數。 – 2013-02-18 14:16:30

回答

3

這是創建功能的一種方法:

CREATE FUNCTION [dbo].[GetDatOfBirth](@PersonID INT) 
RETURNS DATE 
AS 
BEGIN 
    DECLARE @DateOfBirth DATE 

    SELECT @DateOfBirth = DateOfBirth 
    FROM Database1..Table1 
    WHERE PersonID = @PersonID 

    IF @DateOfBirth IS NULL 
    BEGIN 
     SELECT @DateOfBirth = DateOfBirth 
     FROM Database1..Table2 
     WHERE PersonID = @PersonID 
    END 
    IF @DateOfBirth IS NULL 
    BEGIN 
     SELECT @DateOfBirth = DateOfBirth 
     FROM Database2..Table1 
     WHERE PersonID = @PersonID 
    END 

RETURN(@DateOfBirth) 
END 

免責聲明:像這往往標量函數是性能殺手,所以我其他的選擇倒是建議(如使用此表上聯接)在大多數情況下, 。

+0

我打算以同樣的方式回答。你可以寫一個查詢......但是,如果你寫了一個查詢,它會打到所有3個表來確定一個值。這個答案......只有當你需要的時候,你支付了#2的命中價格並且擊中了#3。 – granadaCoder 2013-02-18 14:22:36

+0

@granadaCoder我也這麼認爲。 Mahmoud的答案在基於集合的解決方案(可能創建視圖?)上更有用,因此它可以用於連接,並且可能比UDF在此方面的表現更好 – Lamak 2013-02-18 14:25:22

+0

是的。它「只取決於」。我喜歡UNION中的一個視圖,但是......第二個和第三個「選項」可能是一個鏈接服務器....然後你必須處理多行的可能性。 – granadaCoder 2013-02-18 20:55:41

2

要訪問的表,從另一個數據庫,使用語法:

Database.Schema.Object 

請注意,這隻會在同一臺服務器上運行。如果你的數據庫在不同的服務器上,你需要創建一個鏈接服務器。

要創建用戶定義的函數,檢查出:

http://msdn.microsoft.com/en-us/library/ms186755.aspx

相關問題