簡體   English   中英

嘗試從 SQL 服務器 function 返回一列時出錯

[英]Error while trying to return one column from SQL Server function

I have a function in SQL Server with a select statement and I want to return one row calculated inside the select statement - ORDER_VALUE_ADJUSTED .

CREATE FUNCTION order_value 
    (@date DATE, 
     @client VARCHAR(50), 
     @order_number VARCHAR(50))
RETURNS DECIMAL(13,2) 
AS
BEGIN
    SELECT 
        EKKO.EBELN, 
        SUM(CASE WHEN EKPO.NETWR = CDPOS.VALUE_NEW AND CDHDR.UDATE >= @date THEN CDPOS.VALUE_OLD ELSE EKPO.NETWR END) AS ORDER_VALUE_ADJUSTED
    FROM 
        EKKO
    INNER JOIN 
        EKPO_C AS EKPO ON EKKO.EBELN = EKPO.EBELN 
                       AND EKKO.MANDT = EKPO.MANDT
    LEFT JOIN 
        CDPOS_C AS CDPOS ON (EKPO.MANDT + EKPO.EBELN + EKPO.EBELP) = CDPOS.TABKEY
    LEFT JOIN 
        CDHDR ON CDHDR.CHANGENR = CDPOS.CHANGENR
    WHERE 
        EKKO.MANDT = @client 
        AND EKKO.EBELN = @order_number
    GROUP BY 
        EKKO.EBELN

    RETURN ORDER_VALUE_ADJUSTED
END;

我收到這些錯誤:

消息 444,級別 16,State 2,過程 order_value,第 6 行 [批處理開始行 0]
function 中包含的 Select 語句無法將數據返回到客戶端。

消息 207,級別 16,State 1,過程 order_value,第 22 行 [批處理開始行 0]
列名“ORDER_VALUE_ADJUSTED”無效。

我該如何解決這個問題? 我需要將其重寫為存儲過程嗎?

您的主要問題是您試圖直接從SELECT中取出 SELECT,並且您沒有將數據存儲到RETURN的變量中。

但聽起來你實際上需要一個內聯表值 Function,而不是標量 Function,無論如何這些都快得多

CREATE OR ALTER FUNCTION dbo.order_value 
    (@date DATE, 
     @client VARCHAR(50), 
     @order_number VARCHAR(50))
RETURNS TABLE
AS RETURN

    SELECT 
        EKKO.EBELN, 
        SUM(CASE WHEN EKPO.NETWR = CDPOS.VALUE_NEW AND CDHDR.UDATE >= @date THEN CDPOS.VALUE_OLD ELSE EKPO.NETWR END) AS ORDER_VALUE_ADJUSTED
    FROM 
        EKKO
    INNER JOIN 
        EKPO_C AS EKPO ON EKKO.EBELN = EKPO.EBELN 
                       AND EKKO.MANDT = EKPO.MANDT
    LEFT JOIN 
        CDPOS_C AS CDPOS ON (EKPO.MANDT + EKPO.EBELN + EKPO.EBELP) = CDPOS.TABKEY
    LEFT JOIN 
        CDHDR ON CDHDR.CHANGENR = CDPOS.CHANGENR
    WHERE 
        EKKO.MANDT = @client 
        AND EKKO.EBELN = @order_number
    GROUP BY 
        EKKO.EBELN
;

內聯表 function 必須是單個RETURN SELECT語句。

你像這樣使用它

SELECT *
FROM dbo.order_value(GETDATE(), 'SomeClient', 'SomeOrder') ov;

或者

SELECT *
FROM dbo.Orders o
CROSS APPLY dbo.order_value(o.Date, o.Client, o.Number) ov;

猜測,目前無法驗證語法:

CREATE FUNCTION order_value 
(@date DATE, 
 @client VARCHAR(50), 
 @order_number VARCHAR(50))
RETURNS DECIMAL(13,2) 
RETURN
SELECT SUM(CASE WHEN EKPO.NETWR = CDPOS.VALUE_NEW AND CDHDR.UDATE >= @date 
                THEN CDPOS.VALUE_OLD 
                ELSE EKPO.NETWR 
           END) AS ORDER_VALUE_ADJUSTED
FROM EKKO
INNER JOIN EKPO_C AS EKPO 
    ON EKKO.EBELN = EKPO.EBELN 
   AND EKKO.MANDT = EKPO.MANDT
LEFT JOIN CDPOS_C AS CDPOS 
    ON (EKPO.MANDT + EKPO.EBELN + EKPO.EBELP) = CDPOS.TABKEY
LEFT JOIN CDHDR 
    ON CDHDR.CHANGENR = CDPOS.CHANGENR
WHERE EKKO.MANDT = @client 
  AND EKKO.EBELN = @order_number;

暫無
暫無

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

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