2014-10-10 3 views
1

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

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 ...:

Выберите заявления, включенных в функции не может возвращать данные клиента ,

ответ

1
  1. Добавить ВОЗВРАЩЕННУЮ ключевое слово
  2. Wrap запрос в скобках
  3. Удалить GetOrderStatus=

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

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

BTW это:

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 
4

вы упускаете оператор возврата в конце функции.

и сделать это

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 
+0

@litpost, если это решить вашу проблему, могли бы вы принять его в качестве решения? – Mukund

+0

Я бы оценил ваш ответ, но не могу по-прежнему иметь слишком низкий рейтинг на форуме. В любом случае, спасибо! – litpost