0

我的CaseFiles表格csfl_CaseNo列中有数据

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   

结尾

我的任务是当我通过财政年度时,因为13-14 它必须将值返回为00006/13-14,但它正在返回00002/13-14

为什么会这样?请帮忙

4

3 回答 3

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,则返回的表达式将从表达式中指定的第一个字符开始。 在这种情况下,返回的字符数是 start + length- 1 或 0 之和的最大值。如果 start 大于 value 表达式中的字符数,则返回零长度表达式。

所以这意味着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

于 2013-05-09T04:15:13.103 回答
0

我的赌注是……

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

...正在将 @strSuffix1 设置为,null因为 no there is no CaseFilesrecord where csfl_Fynyr = @strFnyr

检查您是否正在修剪csfl_Fynyr@strFnyr如果合适的话 - 您错过的尾随空格可能不匹配。

要仅调试该语句,请获取您传递的值并用单引号中的值@strFnyr替换@strFnyr语句中的值:单独运行它以查看您是否真的得到了一个max(csfl_caseNo)值。

于 2013-05-09T04:15:30.583 回答
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

于 2013-05-09T04:31:05.170 回答