2016-11-11 5 views
0

私は一意のID番号を取得しようとしていますが、これを行うには次のSQL Server関数を書きました。私は現在の管理者のIDを関数に与え、それは左の最初の数字になります。今私はそれが非常にユニークな番号を返すようにしたい。私は複数を使用しているので、一致するべきではありません。私はテーブルorderdetailstbにorderidがないときにそれをしたい。それがあれば+1する必要があります。複数SQL Server関数でエラーが返される

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

です'選択'。 Msg 102、レベル15、状態1、 プロシージャUniqueOrderId、行12 ')'の近くの構文が正しくありません。

私はそれを行うことができますし、関数を使用するのが適切かどうか、またはストアドプロシージャに移動する必要があります。

答えて

1

あなたはこの試みることができる:

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 

アイデアはインラインselect声明変換するためにouterまたはcross適用を使用することです:

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) 

     ) 
+2

サイドノートを: '(OrderDetailsTBからmax(CONVERT(int、getdate()、112))を選択します)> CONVERT(int、g etdate()、112) 'は意味をなさない。 –

+0

申し訳ありませんが、それは質問に対するコメントとして意味されていました。 –

+0

まあ、私は毎日新しいコードを生成する必要があることを望んでいます。 –

関連する問題