2012-07-11 51 views
0

從我的存儲過程這個SQL片段:UDF可以返回可以與「IN」關鍵字一起使用的列表嗎?

  -- Having the PanelPayout role gives you more transaction types to look for, hence the CASE statement. 
      CASE WHEN EXISTS (SELECT RoleID FROM aspnet_UsersInRoles ur WHERE ur.RoleID = 'DEDCD456-A25A-43C5-8125-A1D1223B19EC' AND ur.UserID = s.aspnet_UserID) THEN 
       (SELECT ISNULL(SUM(Amount), 0) FROM TransactionsLog payouts WHERE 
        payouts.StaffID = s.ID 
        AND payouts.TransactionType IN (48, 49, 3, 16, 292, 293) 
        AND (payouts.OrderDate >= dbo.Date(@date) AND payouts.OrderDate <= dbo.EndOfDay(@date)) 
        AND @shift = CASE @shift WHEN 0 THEN 0 ELSE dbo.GetShiftByDate(payouts.OrderDate) END 
       ) 
      ELSE 
       (SELECT ISNULL(SUM(Amount), 0) FROM TransactionsLog payouts WHERE 
        payouts.StaffID = s.ID 
        AND payouts.TransactionType IN (48, 49, 3) 
        AND (payouts.OrderDate >= dbo.Date(@date) AND payouts.OrderDate <= dbo.EndOfDay(@date)) 
        AND @shift = CASE @shift WHEN 0 THEN 0 ELSE dbo.GetShiftByDate(payouts.OrderDate) END 
       ) 
      END  

這工作得很好。然而,總的來說,由於7年前數據庫最初結構的一些問題,查詢沒有返回我想要的結果。所以,我將使用C#來完成我需要做的事情。我的問題是可以在UDF返回,可以在使用INTS的名單,所以我只需要編寫

   (SELECT ISNULL(SUM(Amount), 0) FROM TransactionsLog payouts WHERE 
        payouts.StaffID = s.ID 
        AND payouts.TransactionType IN dbo.PayoutTransactionsValidForStaff(s.ID) 
        AND (payouts.OrderDate >= dbo.Date(@date) AND payouts.OrderDate <= dbo.EndOfDay(@date)) 
        AND @shift = CASE @shift WHEN 0 THEN 0 ELSE dbo.GetShiftByDate(payouts.OrderDate) END 
       ) 

其中PayoutTransactionsValidForStaff(s.ID)將返回檢查需要整數的名單?我會想象它可能是一個表值函數,但我沒有時間測試,因爲我得到這個更新發貨。只是想知道是否有人知道他們的頭頂。謝謝!

回答

1

是的,你可以在SQL中創建一個表值函數,它返回一個表而不是標量結果。您可以使用這樣的結果在SQL in聲明

http://msdn.microsoft.com/en-us/library/ms191165(v=sql.105).aspx

CREATE FUNCTION dbo.Test() 
RETURNS @funcTable TABLE 
(
    -- Columns returned by the function 
    ID int PRIMARY KEY NOT NULL  
) 
AS 
-- Return some arbitrary ints 
BEGIN 
    INSERT @funcTable VALUES (1) 
    INSERT @funcTable VALUES (2) 

    RETURN 
END 

GO 

-- Test it - insert 1,2,3 into a table var 
DECLARE @SomeTable table (ID int) 
INSERT INTO @SomeTable VALUES (1) 
INSERT INTO @SomeTable VALUES (2) 
INSERT INTO @SomeTable VALUES (3) 

-- Select from @SomeTable where the ID is in the result of the UDF 
select * from @SomeTable WHERE ID IN (SELECT ID FROM dbo.Test()) 
+0

謝謝!那時候我想過那個。 – 2012-07-11 22:49:59

相關問題