2013-05-09 49 views
0

我有我CaseFilescsfl_CaseNo列数据号是使用存储过程在SQL Server 2005中

00001/13-14 
00002/13-14 
00003/13-14 
00004/13-14 
00005/13-14 

这里是我的存储过程来增加数量

ALTER PROCEDURE [dbo].[HLA_CaseNo](@strFnyr as nvarchar(5),@strSuffix as nvarchar(15) OUTPUT) 
AS 
BEGIN 
--Declarations 
declare @strSuffix1 as nvarchar(15) 
declare @strTmp as nvarchar(5) 
declare @intNew as int 
--declare @strSql as nvarchar(2000) 
set @strSuffix1 = null 
    --Process 
begin 
    set @strSuffix1 = (select max(csfl_caseNo) from CaseFiles where csfl_Fynyr = @strFnyr) 
    --set @strPrf='QUT' 
end 

if @strSuffix1 is null 
    set @intNew = 1 
else 
    set @intNew = cast(substring(@strSuffix1,0,5) as int) + 1 

print 'The value of intNew ' + cast(@intNew as nvarchar(10)) 
set @strTmp = cast(@intNew as nvarchar(5)) 
set @strTmp = (select replicate('0',5-len(@strTmp)) + @strTmp) 
set @strSuffix = @strTmp + '/' + @strFnyr 

END

不增加

我的任务是当我通过财政年度为13-14它必须返回值为00006/13-14,但它是ret改为使用00002/13-14

为什么会发生这种情况?请帮助

+2

除了现有的错误,你也有一个多用户问题。当两个不同的用户调用这个存储过程时,他们将被分配相同的编号。如果您使用的是SQL Server 2012,请改用“SEQUENCE”。如果您使用的是早期版本,请使用“IDENTITY”。关于你的bug,不知道'csfl_Fynyr'字段里有什么是没有人能帮到的。同时,为什么不使用'PRINT'或'SELECT'来回显所有的变量值并检查它们。你可能有一个偏移错误或什么的。 – 2013-05-09 04:15:41

回答

2

变化

set @intNew = cast(substring(@strSuffix1,0,5) as int) + 1 

set @intNew = cast(substring(@strSuffix1,1,5) as int) + 1 

甚至宁愿用

LEFT(@strSuffix1,5) 

而不是

substring(@strSuffix1,1,5) 

所以,像

set @intNew = cast(LEFT(@strSuffix1,5) as int) + 1 

SUBSTRING (Transact-SQL)

开始

是指定在返回 字符开头的整数或BIGINT表达。如果start小于1,则返回的表达式 将从expression中指定的第一个字符开始。 在这种情况下,返回的字符数是开始长度-1或0的最大值。如果起始 大于值表达式中的字符数,则返回一个零长度表达式 。

因此,这将意味着start + length- 1 = 0 + 5 - 1 = 4,这将意味着cast(substring(@strSuffix1,0,5) as int)为0,set @intNew = cast(substring(@strSuffix1,0,5) as int) + 1 = 1

+0

好眼睛,很好的解释。 – J0e3gan 2013-05-09 04:22:58

+0

谢谢先生..得到它 – 2013-05-09 04:31:00

0

我敢打赌,...

set @strSuffix1 = (select max(csfl_caseNo) from CaseFiles where csfl_Fynyr = @strFnyr) 

...是@ strSuffix1设置为null因为没有CaseFiles记录where csfl_Fynyr = @strFnyr

检查您是否正在修整csfl_Fynyr@strFnyr(如果适用) - 可能与您错过的尾部空白不匹配。

要调试只是声明,需要要传递的@strFnyr值,并在声明中,在单引号替换为值@strFnyr:自身运行它,看你是否真正得到一个max(csfl_caseNo)值回。

+1

对不起,先生.....我有一个csfl_Fynyr领域有13-14 ..和@ strSuffix1不返回到NULL ..它正在取最大值正确 – 2013-05-09 04:25:39

+0

感谢您的现实检查。这只是最初站到我面前的可能性。 – J0e3gan 2013-05-09 04:27:55

+0

明白了..谢谢 – 2013-05-09 04:30:03

0

你可以把它与一个说法更简洁

SELECT RIGHT('0000' + CAST(LEFT(MAX(csfl_CaseNo), 5) + 1 AS VARCHAR(5)), 5) + '/13-14' 
    FROM CaseFiles 
WHERE RIGHT(csfl_CaseNo, 5) = '13-14'; 

然后你的SP可能看起来像

CREATE PROCEDURE HLA_CaseNo(@strFnyr as nvarchar(5), @strSuffix as nvarchar(15) OUTPUT) 
AS 
SELECT @strSuffix = RIGHT('0000' + CAST(LEFT(MAX(csfl_CaseNo), 5) + 1 AS VARCHAR(5)), 5) + '/' + @strFnyr 
    FROM CaseFiles 
WHERE RIGHT(csfl_CaseNo, 5) = @strFnyr; 

SQLFiddle

相关问题