2012-06-21 40 views
0

我想用下面的SQL代碼來創建一個新的功能的新功能:SQL代碼不工作試圖創建

CREATE FUNCTION PROFITIBLE_CATEGORIES (@startDate date, @endDate date) 
RETURNS @ResultTable TABLE (Name varchar(20), AMOUNT INT) 
AS BEGIN 
    @ResultTable = SELECT TOP 5 NAME, COUNT(*) AS AMOUNT 
        FROM dbo.PURCHASES P JOIN 
         (SELECT PInC.NAME, PInC.[Walmart number], 
           PInSP.[Purchase Id] AS PInSP_PURCHASE_ID, 
           DPP.[Purchase Id] AS DPP_PURCHASE_ID 

         FROM dbo.PRODUCTS_IN_CATEGORIES PInC LEFT JOIN 
         dbo.Products_in_self_pick_up_purchases PInSP ON 
         PInC.[Walmart number] = PInSP.[Walmart number] LEFT JOIN 
         dbo.Delivered_products_purchases DPP ON 
         DPP.[Walmart number] = PInC.[Walmart number]) X 
         ON (P.[Purchase Id] = X.DPP_PURCHASE_ID) 
         OR (P.[Purchase Id] = X.PInSP_PURCHASE_ID) 
        WHERE [Date] < @endDate AND [Date] > @startDate 
        GROUP BY NAME 
        ORDER BY AMOUNT 
    RETURN 
    END 

,但我發現了以下錯誤:

Msg 102, Level 15, State 1, Procedure PROFITIBLE_CATEGORIES, Line 4
Incorrect syntax near '@ResultTable'.

任何人都可以幫忙嗎? 這可能是一個語法錯誤,但我是新手。 在此先感謝。

+2

難道你看一下兩個答案?只是好奇你爲什麼會選擇效率較低的方法。我不在乎名聲,但我確實在乎選擇的最佳答案 - 無論是爲了你還是爲未來的讀者。 –

+0

我改變了我的選擇未來的讀者。 我之所以選擇其他的原因是因爲這是大學的課程,而且我們還沒有學習內聯函數,所以我不能使用它。 但你說得對。謝謝。 – user1472066

回答

2

稍微更有效的方法將是一個內嵌表值函數:

CREATE FUNCTION dbo.PROFITIBLE_CATEGORIES 
(
    @startDate date, 
    @endDate date 
) 
RETURNS TABLE 
WITH SCHEMABINDING 
AS 
    RETURN 
    (
     SELECT TOP (5) NAME, COUNT(*) AS AMOUNT 
     FROM dbo.PURCHASES P JOIN 
         (SELECT PInC.NAME, PInC.[Walmart number], 
           PInSP.[Purchase Id] AS PInSP_PURCHASE_ID, 
           DPP.[Purchase Id] AS DPP_PURCHASE_ID 

         FROM dbo.PRODUCTS_IN_CATEGORIES PInC LEFT JOIN 
         dbo.Products_in_self_pick_up_purchases PInSP ON 
         PInC.[Walmart number] = PInSP.[Walmart number] LEFT JOIN 
         dbo.Delivered_products_purchases DPP ON 
         DPP.[Walmart number] = PInC.[Walmart number]) X 
         ON (P.[Purchase Id] = X.DPP_PURCHASE_ID) 
         OR (P.[Purchase Id] = X.PInSP_PURCHASE_ID) 
        WHERE [Date] < @endDate AND [Date] > @startDate 
        GROUP BY NAME 
        ORDER BY AMOUNT 
    ); 
GO 
1

如果要插入行的表,然後嘗試這個

CREATE FUNCTION PROFITIBLE_CATEGORIES (@startDate date, @endDate date) 
    RETURNS @ResultTable TABLE (Name varchar(20), AMOUNT INT) 
    AS BEGIN 
    INSERT INTO @ResultTable 
    SELECT TOP 5 NAME, COUNT(*) AS AMOUNT 
       FROM dbo.PURCHASES P JOIN 
        (SELECT PInC.NAME, PInC.[Walmart number], 
          PInSP.[Purchase Id] AS PInSP_PURCHASE_ID, 
          DPP.[Purchase Id] AS DPP_PURCHASE_ID 

        FROM dbo.PRODUCTS_IN_CATEGORIES PInC LEFT JOIN 
        dbo.Products_in_self_pick_up_purchases PInSP ON 
        PInC.[Walmart number] = PInSP.[Walmart number] LEFT JOIN 
        dbo.Delivered_products_purchases DPP ON 
        DPP.[Walmart number] = PInC.[Walmart number]) X 
        ON (P.[Purchase Id] = X.DPP_PURCHASE_ID) OR (P.[Purchase Id] = X.PInSP_PURCHASE_ID) 
       WHERE [Date] < @endDate AND [Date] > @startDate 
       GROUP BY NAME 
       ORDER BY AMOUNT 
RETURN 
END 
+0

請不要忘記在函數名稱上使用模式前綴。 –

+1

儘管...應該讓它成爲一個內聯表函數,這些都是更高效的整體。 – Lucero

+0

太神奇了!非常感謝你!有效。我會爲你投票,但我沒有足夠的信用:) – user1472066