号是使用存储过程在SQL Server 2005中
我有我CaseFiles
表csfl_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
。
为什么会发生这种情况?请帮助
变化
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
开始
是指定在返回 字符开头的整数或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
好眼睛,很好的解释。 – J0e3gan 2013-05-09 04:22:58
谢谢先生..得到它 – 2013-05-09 04:31:00
我敢打赌,...
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)
值回。
对不起,先生.....我有一个csfl_Fynyr领域有13-14 ..和@ strSuffix1不返回到NULL ..它正在取最大值正确 – 2013-05-09 04:25:39
感谢您的现实检查。这只是最初站到我面前的可能性。 – J0e3gan 2013-05-09 04:27:55
明白了..谢谢 – 2013-05-09 04:30:03
你可以把它与一个说法更简洁
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;
除了现有的错误,你也有一个多用户问题。当两个不同的用户调用这个存储过程时,他们将被分配相同的编号。如果您使用的是SQL Server 2012,请改用“SEQUENCE”。如果您使用的是早期版本,请使用“IDENTITY”。关于你的bug,不知道'csfl_Fynyr'字段里有什么是没有人能帮到的。同时,为什么不使用'PRINT'或'SELECT'来回显所有的变量值并检查它们。你可能有一个偏移错误或什么的。 – 2013-05-09 04:15:41