2014-10-10 20 views
1

我对SQL Server很新。在这里,我尝试使用CASE语句创建UDF,以根据输入的各种订单日期从数据库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 ...错误:

Select语句包括在一个功能无法将数据返回到客户端。

回答

1
  1. 添加return关键字
  2. 裹在括号中的查询
  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

你缺少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 
+0

@litpost,如果这个解决您的问题,请你接受它作为一个解决方案吗? – Mukund 2014-10-10 07:14:55

+0

我会评价你的答案,但不会导致仍然有太低的评级在论坛上。不管怎样,谢谢你! – litpost 2014-10-13 13:34:13