繁体   English   中英

SQL Server Function中的多个If else返回错误

[英]Multiple If else in Sql Server Function return error

我正在尝试获取唯一的ID号,并且我编写了以下SQL Server函数来实现。 我将给该函数当前管理员的ID,该ID将在左侧的第一位。 现在我希望它只返回一个非常唯一的数字。 我使用了多个if,以便不存在匹配项。 我希望在表orderdetailstb中没有orderid时使用。 如果有的话应该+1。

USE [ResturantManagementSystem]
GO
/****** Object:  UserDefinedFunction [dbo].[we]    Script Date: 11/11/2016 11:48:59 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
create FUNCTION [dbo].[UniqueOrderId] (@currentAdminid int)
RETURNS int
AS BEGIN
declare @UniqueOrderId int
if (select orderid from OrderDetailsTB) is null
return (select concat(left(@currentAdminid,1),CONVERT(int,getdate(),112),right('1',1)) from Admin)
else
if
(select max(CONVERT(int,getdate(),112)) from OrderDetailsTB)>CONVERT(int,getdate(),112)
return (select concat(left(@currentAdminid,1),CONVERT(int,getdate(),112),right('1',1)) from Admin)
else
return (select concat(left(@currentAdminid,1),CONVERT(int,getdate(),112),right(select max(orderid)+1 from OrderDetailsTB),3) from Admin)
return @UniqueOrderId
END

问题是它在

return (select concat(left(@currentAdminid,1),CONVERT(int,getdate(),112),right(select max(orderid)+1 from OrderDetailsTB),3) from Admin)

错误是

消息156,级别15,状态1,过程UniqueOrderId,第12行关键字“ select”附近的语法错误。 消息102,级别15,状态1,过程UniqueOrderId,第12行')'附近的语法不正确。

我该怎么办?如果适合使用某个函数,还是应该将其移向存储过程?

您可以尝试一下:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
create FUNCTION [dbo].[UniqueOrderId] (@currentAdminid int)
RETURNS int
AS BEGIN
declare @UniqueOrderId int
if (select orderid from OrderDetailsTB) is null
return (select concat(left(@currentAdminid,1),CONVERT(int,getdate(),112),right('1',1)) from Admin)
else
if
(select max(CONVERT(int,getdate(),112)) from OrderDetailsTB)>CONVERT(int,getdate(),112)
return (select concat(left(@currentAdminid,1),CONVERT(int,getdate(),112),right('1',1)) from Admin)
else
return (select concat(left(@currentAdminid,1),CONVERT(int,getdate(),112)
       ,right(maxOrderId,3)) 
        from Admin
        cross apply (select max(orderid)+1 from OrderDetailsTB) ds(maxOrderId)

        )
return @UniqueOrderId
END

这个想法是使用outercross应用来转换内联select语句:

return (select concat(left(@currentAdminid,1),CONVERT(int,getdate(),112),right(select max(orderid)+1 from OrderDetailsTB),3) from Admin) 

至:

return (select concat(left(@currentAdminid,1),CONVERT(int,getdate(),112)
       ,right(maxOrderId,3)) 
        from Admin
        cross apply (select max(orderid)+1 from OrderDetailsTB) ds(maxOrderId)

        )

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM