[英]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.