我有一个以下函数来通过SQL服务器创建一个唯一的数字。
USE [icelandtaxitours_development]
GO
/****** Object: UserDefinedFunction [dbo].[ufnInvoiceNumber] Script Date: 10.2.2014 22:53:54 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[ufnInvoiceNumber](
@Value int
)
RETURNS varchar(6)
WITH SCHEMABINDING
AS
BEGIN
DECLARE @ReturnValue varchar(8);
SET @ReturnValue = CONVERT(varchar(8), @Value);
SET @ReturnValue = Year(Getdate()) + '-' + REPLICATE('0', 8 - DATALENGTH(@ReturnValue)) + @ReturnValue;
RETURN (@ReturnValue);
END;
当我在公式中调用它时,我会执行以下操作:
(isnull([dbo].[ufnInvoiceNumber]([InvoiceID]),''))
...现在我只是得到一个数字“2015”..我想要的是一个数字“2014-00000001”作为发票号码。
有关如何完成此任务的任何建议?
答案 0 :(得分:1)
服务器可能会对您是想要数字加法还是字符串连接感到困惑。为了安全起见,您可以将年份转换为字符串:
SET @ReturnValue = CONVERT(CHAR(4),Year(Getdate()))
+ '-'
+ REPLICATE('0', 8 - DATALENGTH(@ReturnValue)) + @ReturnValue;
另外,您需要增加返回类型的长度:
RETURNS varchar(13)
答案 1 :(得分:0)
我认为你想要的功能是:
ALTER FUNCTION [dbo].[ufnInvoiceNumber](
@Value int
)
RETURNS varchar(255)
WITH SCHEMABINDING
AS
BEGIN
DECLARE @ReturnValue varchar(255);
SET @ReturnValue = CONVERT(varchar(8), @Value);
SET @ReturnValue = cast(Year(Getdate()) as varchar(255)) + '-' + REPLICATE('0', 8 - LEN(@ReturnValue)) + @ReturnValue;
RETURN (@ReturnValue);
END;
最重要的部分是将返回类型更改为varchar()
,其大小足以容纳您想要的值并更改代码中@ReturnValue
的相应类型。我还为今年添加了一个明确的演员,以避免数据错误,并将datalength()
替换为len()
,因为您正在处理一个简单的字符串。
其实我更喜欢把身体写成:
SET @ReturnValue = (cast(Year(Getdate() as varchar(255)) + '-' +
LEFT(REPLICATE('0', 8) + cast(@value as varchar(8)), 8
);
RETURN (@ReturnValue);