【发布时间】:2013-09-02 12:30:22
【问题描述】:
以下场景:
我需要增加这样的代码DS0000001
所以下一个项目将是DS0000002,在DS0000003 之后,依此类推。
因此,为了在大的 INSERT 语句中生成这段代码,我编写了以下函数:
CREATE FUNCTION dbo.eufn_e5_importCRM_getNextClientCode(
@partnerCode AS NVARCHAR(10),
@number AS INT
)
RETURNS NVARCHAR(20)
AS
BEGIN
DECLARE @next AS INT
DECLARE @zeroes AS NVARCHAR(10)
DECLARE @nextStr AS NVARCHAR(10)
DECLARE @return AS NVARCHAR(20)
DECLARE @partnerPrefix AS NVARCHAR(10)
SELECT @next = RIGHT(c.clientCode,7) FROM Clients c
SELECT @partnerPrefix = partners.partnerPrefix
FROM partners WHERE partnerCode = @partnerCode
SET @next = ISNULL(@next,0) + @number
SET @nextStr = CONVERT(NVARCHAR(10),@next)
SELECT @zeroes = CASE WHEN @next > 9 THEN '00000'
WHEN @next > 99 THEN '0000'
WHEN @next > 999 THEN '000'
WHEN @next > 9999 THEN '00'
WHEN @next > 99999 THEN '0'
WHEN @next > 999999 THEN ''
ELSE '000000'
END
IF ISNULL(@next,'') = ''
BEGIN
SET @return = @partnerPrefix + @zeroes + '1'
END
ELSE SET @return = @partnerPrefix + @zeroes + @nextStr
RETURN @return
END
@number 使用ROW_NUMBER() 函数手动获取我在插入语句中添加的行号。
这已经很好了——它将正确的代码插入到表中。
我不喜欢代码的这部分:
SELECT @zeroes = CASE WHEN @next > 9 THEN '00000'
WHEN @next > 99 THEN '0000'
WHEN @next > 999 THEN '000'
WHEN @next > 9999 THEN '00'
WHEN @next > 99999 THEN '0'
WHEN @next > 999999 THEN ''
ELSE '000000'
END
我已经在 stackoverflow 上搜索了一段时间并用谷歌搜索了,但我找不到像 convert 这样的函数,它会让“0”留在它们所在的位置。
任何想法如何使这个功能更灵活,如果可能的话:可重复使用?
提前感谢您的帮助!
【问题讨论】:
-
也许你是对的。虽然情况略有不同。看到解决方案听起来很相似,但是在您的链接中,答案(以及大多数答案)确实使用了其他功能。
标签: sql sql-server-2008 tsql