Пользовательская функция с оператором CASE

Я очень новичок в SQL Server. Здесь я пытаюсь создать UDF с оператором CASE, чтобы получить статус заказа из базы данных STRDAT в зависимости от введенных дат заказа. Вот код:

USE STRDAT
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

IF OBJECT_ID(N'dbo.GetOrderStatus', N'FN') IS NOT NULL
    DROP FUNCTION dbo.GetOrderStatus ;
GO

CREATE FUNCTION dbo.GetOrderStatus(@lngOrderID int)
RETURNS varchar(50)
AS
BEGIN
    WITH MyData AS  
        (
        SELECT 
            ReservedDate AS Res,
            ConfirmedDate AS Conf,
            ProcessedDate AS Procs,
            ProducedDate AS Prod,
            ShippedDate AS Ship,
            RefusingReason AS Refs,
            CancelledDate AS Canc
        FROM tbl_Order 
        WHERE OrderID = @lngOrderID
        )

        SELECT GetOrderStatus= CASE
            WHEN res IS NULL AND conf IS NULL AND PROCS IS NULL AND PROD IS NULL AND Ship IS NULL AND Canc IS NULL AND Refs is null
            THEN 'Naujas'

            WHEN NOT Canc IS NULL
            THEN 'Atšauktas'

            WHEN NOT Refs IS NULL
            THEN 'Atmestas'

            WHEN NOT Ship IS NULL
            THEN 'Atkrautas'

            WHEN NOT prod IS NULL
            THEN 'Pagamintas'

            WHEN NOT Procs IS NULL
            THEN 'Apdirbtas'        

            WHEN NOT Conf IS NULL
            THEN 'Patvirtintas'

            ELSE 'N/A'
            END
        FROM MyData     
    END

Это одна из моих первых функций, и я не могу объяснить, почему я получаю ошибку в строке CREATE FUNTION ...:

Операторы select, включенные в функцию, не могут возвращать данные клиенту.


person litpost    schedule 10.10.2014    source источник


Ответы (2)


  1. Добавьте ключевое слово RETURN
  2. Заключить запрос в скобки
  3. Удалить GetOrderStatus=

Попробуй это:

RETURN (WITH MyData AS
      ...
      SELECT CASE
      ...
      FROM mydata);

Кстати это:

WHEN res IS NULL AND conf IS NULL AND PROCS IS NULL AND PROD IS NULL AND Ship IS NULL AND Canc IS NULL AND Refs is null

можно более элегантно выразить так:

WHEN COALESCE(res, conf, PROCS, PROD, Ship, Canc, Refs) IS NULL
person Bohemian♦    schedule 10.10.2014

вам не хватает оператора return в конце функции.

и сделай это

declare @GetOrderStatus varchar(50)

set @GetOrderStatus  = (select CASE
            WHEN res IS NULL AND conf IS NULL AND PROCS IS NULL AND PROD IS NULL 
            AND Ship IS NULL AND Canc IS NULL AND Refs is null
            THEN 'Naujas'

             WHEN NOT Canc IS NULL
             THEN 'Atšauktas'

             WHEN NOT Refs IS NULL
             THEN 'Atmestas'

             WHEN NOT Ship IS NULL
             THEN 'Atkrautas'

             WHEN NOT prod IS NULL
             THEN 'Pagamintas'

             WHEN NOT Procs IS NULL
             THEN 'Apdirbtas'        

             WHEN NOT Conf IS NULL
             THEN 'Patvirtintas'

        ELSE 'N/A'
        END
    FROM MyData 
   return @GetOrderStatus 
person Mukund    schedule 10.10.2014
comment
@litpost, если это решило вашу проблему, не могли бы вы принять это как решение? - person Mukund; 10.10.2014
comment
Я бы оценил ваш ответ, но не могу, потому что у вас все еще слишком низкий рейтинг на форуме. Все равно спасибо! - person litpost; 13.10.2014